解决同情

时间:2018-04-18 14:53:40

标签: sympy

我正在学习使用sympy.solvers.solveset.linsolve来解决线性方程组。我可以很好地解决系统问题,但是我无法将结果分配给我的变量。它似乎没有像我期望的那样自动执行赋值,但返回包含值的元组的单元素集集,并且我必须通过一些愚蠢的扭曲来获取赋值。这是我的代码:

from sympy import symbols, ones
from sympy.solvers.solveset import linsolve
A= ones(6)
A[0,0]=7
for k in range(1,6):
    A[k,k]=6
b=6*ones(6,1)
p1,p2,p3,p4,p5,p6 = symbols('p1 p2 p3 p4 p5 p6')
system = (A,b)
p=linsolve(system,p1,p2,p3,p4,p5,p6)
p1,p2,p3,p4,p5,p6=tuple(p)[0]

当然有更多的pythonic方法可以做到这一点,不是吗?

1 个答案:

答案 0 :(得分:1)

返回集合是solveset模块(linsolve'所属的)的核心思想。请参阅Why do we use Sets as an output type?,其中包括“为什么不使用dicts作为输出?”。是的,处理起来很尴尬:一个开放的SymPy问题是The use of sets in solveset makes it very clumsy to get a dictionary of solutions

我通常将next(iter(...))应用于solveset及其类似物的输出。

您可以通过不单独列出p1,... p6来简化您的代码,将其保留为符号元组。

syms = symbols('p1:7')
system = (A, b)
p = linsolve(system, syms)
p = next(iter(p))

现在p是元组(6/13, 36/65, 36/65, 36/65, 36/65, 36/65)

较旧的solve方法可以直接返回dict,但我不建议使用它来处理线性方程组。此外,SymPy开发计划是向solveset过渡,留下solve