我试图在一系列值中使用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左右。
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