我在使用 python sympy 时遇到问题。
问题被减少到非常少的工作示例
import sympy as sp
from sympy import *
x, xb, xi, alpha = sp.symbols('x xbar xi alpha')
Eqxb = sp.Eq(xb, (x+xi) )
problemExpr = (xb*cos(alpha))**2
# Following is zero for sure
display( problemExpr.diff(xi) )
# Naive approach
out = problemExpr.subs(xb, Eqxb.rhs).diff(xi).subs(Eqxb.rhs, xb)
display( out ) # gives (2x + 2 xi)*cos^2(alpha)
# Want I want is 2*xb*cos^(alpha)
# Some simple tests
test1 = (Eqxb.rhs + xb)
display(test1.subs(Eqxb.rhs, xb)) # gives 2*xbar | -> good
#
test2 = 2*(Eqxb.rhs + xb)
display(test2.subs(Eqxb.rhs, xb)) # gives 2*x + 2*xbar + 2*xi | -> not good
#
test3 = 2*x + 2*xi
display(test3.subs(Eqxb.rhs, xb)) # gives 2*x + 2*xi | -> not good
问题1: 为什么表达式
x+xi
没有正确地替换为 xb
。我这个功能用错了吗?至少在 test1
中它按预期工作。
问题2: 在这里,这是一个仅进行一次替换的简单函数。如果需要多个潜艇,如何执行?这一步的替换和重新替换似乎应该至少有一种更优雅的方式。
1.在您的示例中,
xb
被定义为方程 (Eqxb)。当您使用 subs 时,它不会直接用 x + xi
替换 xb
;相反,它将 xb
替换为等式的右侧。这就是为什么您的第一个测试有效但后续测试无效的原因。
要直接用
x + xi
替换 xb
,您应该使用 subs 方法,将 x + xi
映射到 xb
:
out = problemExpr.subs({x + xi: xb})
2.如果要执行多个替换,可以将具有多个替换映射的字典传递给 subs 方法:
expr.subs({sub1, sub2, ..., subN})
这允许在一个步骤中执行多个替换,这比链接多个 subs 调用更高效、更优雅。