将linsolve解决方案映射到Sympy中的索引符号

时间:2018-10-06 22:45:03

标签: python sympy

我正在尝试使用Sympy中的linsolve在一系列值上求解一组线性联立方程。为简单起见,我在下面显示了我尝试使用简单方程式进行的操作。

 from sympy import symbols, linsolve, IndexedBase
 m = 2
 n = symbols('n', integer=True)
 x, y = symbols('x, y', cls=IndexedBase)
 for n in range (0, m+1):
        E1 = 2*x[n] + 5*y[n] - 33 + 2*n
        E2 = x[n] + 3*y[n] - 19 + 4*n
        sol = linsolve([E1, E2], [x[n], y[n]])
        (x[n], y[n]) = tuple(*sol)

这将返回错误“'IndexedBase'对象不支持项目分配”。如何将解决方案值映射到索引符号,以便以后在代码中使用它们(例如,取所有x值的总和(x [0] + x [1] + x [2])我正在寻找一种可靠的解决方案,因为对于实方程,m的值可以在500左右。

1 个答案:

答案 0 :(得分:1)

SymPy对象是不可变的;不能将数字数据附加到它们。 “ x”总是这样,符号“ x”; “ x [2]”是索引符号“ x [2]”。它们不会与任何数值关联。要存储解决方案,请使用元组列表或字典(或词典列表),以较方便的方式为准。

solutions = {}
for n in range(0, m+1):
    E1 = 2*x[n] + 5*y[n] - 33 + 2*n
    E2 = x[n] + 3*y[n] - 19 + 4*n
    sol = linsolve([E1, E2], [x[n], y[n]])
    solutions.update(dict(zip([x[n], y[n]], *sol)))
print(solutions)

这将打印{x[0]: 4, y[0]: 5, x[1]: 18, y[1]: -1, x[2]: 32, y[2]: -7}。然后,您可以在subs中使用此词典:

expr = x[0] + 3*y[2]
print(expr.subs(solutions))   # -17