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

问题描述 投票:1回答:1

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

python sympy
1个回答
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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.