Sympy中subs命令无法正确替换变量,及结果数值美化的问题
Sympy中subs命令无法正确替换变量,及结果数值美化的问题
我来帮你搞定这两个问题:subs不生效的原因很直观,数值美化只需要调整下π的使用方式就好~
一、解决subs无法替换变量的问题
你现在的subs用法出错了!SymPy的subs()方法只需要传入一个包含所有替换规则的字典,而不是分开传两个独立字典。原代码里的dfdt.subs({x1 : xt}, {y1 : yt})会被SymPy误解,导致替换规则完全没生效,所以x和y始终没被替换成t的表达式。
只需要把两个字典合并成一个,改成这样:
print(dfdt.subs({x1: xt, y1: yt}))
这样就能一次性把dfdt里的x和y替换为对应的xt、yt表达式,最终得到只关于t的结果。
二、美化长浮点数的问题
你看到的2.0943951023932其实是2π/3的浮点数近似值,之所以会变成冗长的浮点数,是因为你用了math.pi(这是Python的浮点数常量),而不是SymPy自带的符号化sp.pi。
只需要把代码里的pi = math.pi改成pi = sp.pi,所有涉及π的计算就会保持符号化,结果里会直接显示2*pi/3而非浮点数。如果之后需要小数形式的结果,还可以用evalf(n)方法指定有效数字位数,比如:
print(dfdt.subs({x1: xt, y1: yt}).evalf(3))
这样就能得到三位有效数字的简化结果。
修改后的完整代码
这里是调整后的可运行代码:
import sympy as sp from sympy import E x1, y1, t1 = sp.symbols('x y t') # Question 2 # Method 1 # 改用SymPy的符号pi,避免浮点数近似 pi = sp.pi f2 = E**y1 * sp.cos(x1) dfdx = sp.diff(f2, x1) dfdy = sp.diff(f2, y1) xt = (2*pi / 3)*t1 + pi/4 dxdt = sp.diff(xt, t1) yt = -t1 dydt = sp.diff(yt, t1) dfdt = dfdx * dxdt + dfdy * dydt # 合并替换规则为一个字典 print(dfdt.subs({x1: xt, y1: yt})) # 若需要三位有效数字的小数结果,启用下面这行 # print(dfdt.subs({x1: xt, y1: yt}).evalf(3))
运行结果说明
修改后,你会得到清晰的符号化结果:
-2*pi*exp(-t)*sin(2*pi*t/3 + pi/4)/3 - exp(-t)*cos(2*pi*t/3 + pi/4)
如果用evalf(3),结果会简化为:
-2.09*exp(-t)*sin(2.09*t + 0.785) - 1.0*exp(-t)*cos(2.09*t + 0.785)
备注:内容来源于stack exchange,提问作者Max Kotlarz
相关产品推荐
相关产品推荐

