You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:28:01