【问题标题】:Sympy substitution, substituting many variable in many equationsSympy 替换,在许多方程中替换许多变量
【发布时间】:2018-07-16 21:04:35
【问题描述】:

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

【问题讨论】:

    标签: python sympy substitution


    【解决方案1】:

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

    【讨论】:

    • 它有效!非常感谢。这也解释了为什么我在 shell 中手动执行此操作时会得到结果。
    • @user1402208 你是对的,shell 只是打印最后评估表达式的结果。如果我的回答解决了您的问题,您能否将其标记为已接受的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多