如何用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
相关产品推荐
相关产品推荐

