Sympy 替换,在许多方程中替换许多变量

Sympy substitution, substituting many variable in many equations

我有一个包含 9 个方程和 9 个未知数的系统。我可以在 Mathcad、wxMaxima 或 Mathematica 中执行此操作。当我有一个方程式列表时,问题就出现了。

leq0 = [eq0,eq1,eq2,eq3,eq4,eq5,eq6,eq7,eq17]

其中一个变量是v3,另一个是a2。我想替换

leq1 = []
for eq in leq0:
    eq.subs([(v3,v),(a2,a)])
    print(eq)
    leq1.append(eq)

eq.subs([(v3,v),(a2,a)]) 什么都不做 手动也不行

eq = leq0[6]
eq.subs([(v3,v),(a2,a)])

当我打印 eq 时,方程看起来是正确的。

a0*t01**2/2 + j*t01**3/6 + t01*v0 + x0 - x1
a0*t01 + j*t01**2/2 + v0 - v2
a0 - a1 + j*t01
a1*t12**2/2 + t12*v1 + x1 - x2
a1*t12 + v1 - v2
a2*t23**2/2 - j*t23**3/6 + t23*v2 + x2 - x3
a2*t23 - j*t23**2/2 + v2 - v3
a2 - a3 - j*t23
t01 + t12 + t23

为什么我不能做一个简单的替换。我可以手动将 v3 编辑为 v,但这是更复杂问题的更简单示例。我可以在其他数学包中进行这些替换。

subs 不会覆盖包含表达式的变量,它 returns 替换后的结果表达式。

changed = original.subs({var1: value1, var2: value2})

在您的情况下,您没有捕获替换的表达式。

leq1 = []
for eq in leq0:
    eq.subs([(v3,v),(a2,a)]) # result not captured
    print(eq)                # `eq` still has original expression
    leq1.append(eq)

要解决此问题,您可以在添加到新列表之前用替代表达式覆盖 eq

eq = eq.subs({v3: v, a2: a})

或直接附加替换:

for eq in leq0:
    leq1.append(eq.subs({v3: v, a2: a})

注意:我将您的等式称为表达式,因为它们只包含等式的一侧。 subs 也适用于同时具有两边的方程。

eq6 = Eq(a2*t23 - j*t23**2/2 + v2, v3)
pprint(eq2.subs({v3: v, a2: a}))

查看 sympy live 上的结果。