![](/img/trans.png)
[英]SymPy, simplification / substitution using known patterns or sub-expressions
[英]Substitution into multiple sub-expressions in SymPy
我遇到将表达式分配给SymPy中的许多符号的情况。 它们互相引用,我希望能够根据确定其他所有条件的一些起始参数来评估其中一个高级表达式。
这是我的示例代码:
In [1]: from sympy import *
In [2]: x, y, z = symbols('x y z')
In [3]: z = x+y
In [4]: x=y
In [5]: z.subs({y: 2})
Out[5]: x + 2
我希望得到4
,因为x
应该被评估为2
。 我缺少什么?如何“一路评估” z
?
在我的实际代码中,即使需要多层评估,我也希望能够“一路”评估事物。 当然,在实际代码中,我不能只做z.subs({y: 2, x: y})
,因为x
和y
之间的关系很复杂。
真正的代码恰好是这样的:
In [1]: from sympy import *
...: y, q, c, F, M, cr, ct, bst, kq, kF, kM = symbols('y q c F M cr ct bst kq
...: kF kM')
...: c = cr + y*(cr+ct)/(bst/2)
...: q = kq*c
...: F = integrate(q, y) + kF
...: kF = -(F-kF).subs({y: bst/2}) # BC: F=0 when y=bst/2
...: M = integrate(F, y) + kM
...: kM = -(M-kM).subs({y: bst/2}) # BC: M=0 when y=bst/2
...:
...: LV3parms = {cr: 18, ct: 5, kq: 1, bst: 6.42}
...: M.subs(LV3parms)
Out[1]: kF*y + kM + 1.19418483904465*y**3 + 9*y**2
您的In [3]和In [4]行均会创建新的不可变表达式,并且不会以任何方式更改其右侧表达式。 因此,In [5]中的调用与您设置x = y的In [4]无关,后者仅更改x,而在In [5]中您对z进行操作。
您只需要正确地链接表达式即可:
x,y,z = symbols('x y z')
x = y
z = x+y
z.subs({y: 2})
如您所料,这将输出4。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.