sympy diff 无需重新替换?

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

我在使用 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: 在这里,这是一个仅进行一次替换的简单函数。如果需要多个潜艇,如何执行?这一步的替换和重新替换似乎应该至少有一种更优雅的方式。

python sympy symbolic-math
1个回答
0
投票

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 调用更高效、更优雅。

© www.soinside.com 2019 - 2024. All rights reserved.