在表达式中将变量替换为相应的值后,结果并未达到预期
我有这小段Sympy代码
import sympy as s
L1, L2, x = s.symbols('L1, L2, x', real=True, positive=True)
P, q = s.symbols('P, q')
m, kN = s.symbols('m, kN', real=True, positive=True)
E, J = s.symbols('E, J', real=True, positive=True) ; EJ = E*J
values = dict(L1=5*m, L2=2*m, P=16*kN, q=-4*kN/m, E=200_000_000*kN/m**2)
Ra = (P/2 - q*L2**2/2/L1).subs(values, simultaneous=True)
print(Ra)
输出:
8*kN + 2*L2**2*kN/(L1*m)
(我也尝试过不带 simultaneous=True 这个关键字参数的情况),我的问题是,我会期待与 print(Ra) 不同的结果
8*kN + 8*kN/5
我该如何让Sympy满足我这点小小的期望?
解决方案
问题归结为两点。
首先,SymPy认为名称相同但前提条件不同的符号,仍然是不同的符号:
In [19]: xr = Symbol('x', real=True)
In [20]: xv = Symbol('x')
In [21]: xr
Out[21]: x
In [22]: xv
Out[22]: x
In [23]: xr == xv
Out[23]: False
这意味着在进行替换时,不能在这些符号之间进行互换:
In [24]: e = xr**2 + 1
In [25]: e
Out[25]:
2
x + 1
In [26]: e.subs(xr, 2)
Out[26]: 5
In [27]: e.subs(xv, 2)
Out[27]:
2
x + 1
其次,你是这样构造替换字典的:
values = dict(L1=5*m, L2=2*m, P=16*kN, q=-4*kN/m, E=200_000_000*kN/m**2)
那相当于
values = {'L1':5*m, 'L2':2*m, 'P':16*kN, 'q':-4*kN/m, 'E':200_000_000*kN/m**2}
这意味着你向subs传递的是字符串,而不是符号。subs对这些字符串的处理会假设它们表示一个没有设定前提的符号(如上方的 xv,而不是上方的 xr)。
修正方法是应该使用符号对象作为键,而不是字符串:
values = {L1:5*m, L2:2*m, P:16*kN, q:-4*kN/m, E:200_000_000*kN/m**2}
修正后的代码如下:
import sympy as s
L1, L2, x = s.symbols('L1, L2, x', real=True, positive=True)
P, q = s.symbols('P, q')
m, kN = s.symbols('m, kN', real=True, positive=True)
E, J = s.symbols('E, J', real=True, positive=True) ; EJ = E*J
values = {L1:5*m, L2:2*m, P:16*kN, q:-4*kN/m, E:200_000_000*kN/m**2}
Ra = (P/2 - q*L2**2/2/L1).subs(values, simultaneous=True)
print(Ra)
输出并不完全符合你要的,但两者等价:
48*kN/5
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。