对称替换,用许多方程式代替许多变量

时间:2018-07-16 21:04:36

标签: python sympy substitution

我有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,但这是一个更复杂问题的简单示例。我可以在其他数学软件包中进行这些替换。

1 个答案:

答案 0 :(得分:0)

subs不会覆盖包含表达式的变量,而是在替换后返回结果表达式。

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上查看结果。