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

如何用Sympy对导数进行符号变量替换?附无量纲化示例

解决Sympy中无量纲化导数变量替换的报错问题

已知无量纲化变量替换关系:

x = x_c * chi
t = t_c * tau

我们需要用Sympy实现导数dx/dt到(x_c/t_c)·dchi/dtau的转换,但运行以下代码时出现报错:

from sympy import symbols, diff

# 定义符号
x, chi, x_c, t, tau, t_c = symbols('x chi x_c t tau t_c', real=True)

# 定义x和t关于chi、tau的表达式
x_expr = x_c * chi
t_expr = t_c * tau

# 尝试直接对t_expr求导
x_expr.diff(t_expr)

报错信息:

ValueError: Can't calculate derivative wrt t_c*tau.

报错原因

Sympy的diff方法要求导数的自变量是单个符号,而t_c*tau是两个符号的乘积表达式,无法直接作为求导对象。

解决方法

利用链式法则拆分求导步骤,或者将变量定义为函数关系来计算,以下是两种可行实现:

方法1:链式法则手动拆分

根据链式法则,dx/dt = (dx/dchi) · (dchi/dtau) / (dt/dtau),用Sympy实现如下:

from sympy import symbols, diff

# 定义所有符号
x, chi, x_c, t, tau, t_c = symbols('x chi x_c t tau t_c', real=True)

# 定义变量替换表达式
x_expr = x_c * chi
t_expr = t_c * tau

# 计算各部分导数
dx_dchi = diff(x_expr, chi)
dt_dtau = diff(t_expr, tau)
# 组合得到dx/dt
dx_dt = dx_dchi * diff(chi, tau) / dt_dtau

print(dx_dt)

运行结果:(x_c/t_c)*Derivative(chi, tau),完全符合预期的替换结果。

方法2:将chi定义为tau的函数

把chi声明为tau的函数,直接通过dx/dtau除以dt/dtau得到dx/dt:

from sympy import symbols, diff, Function

# 定义符号与函数关系
tau = symbols('tau', real=True)
x_c, t_c = symbols('x_c t_c', real=True)
chi = Function('chi')(tau)
x = x_c * chi
t = t_c * tau

# 利用参数方程求导法则:dx/dt = (dx/dtau)/(dt/dtau)
dx_dt = diff(x, tau) / diff(t, tau)

print(dx_dt)

运行结果:(x_c*Derivative(chi(tau), tau))/t_c,同样满足需求。

内容的提问来源于stack exchange,提问作者Yorai Levi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:47:48