我正在尝试使用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左右。
答案 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