SymPy与Maple结果不符:Maple转Python代码问题求助
问题:Maple转SymPy的行波变换ODE推导问题
Maple操作逻辑
- 定义行波变换:$\xi = k(x - ct)$,设 $u(x,t) = U(\xi)$
- 将其代入KdV方程 $u_t + 6u u_x = 0$,推导得到关于$U(\xi)$的常微分方程
- 再做变量替换:$\xi = \text{arctanh}(Y)$,$U(\xi) = F(Y)$,得到最终的ODE(记为F1)
我的Python尝试代码
from sympy import * c, k, x, t, tau, Y, xi = symbols('c k x t tau Y xi') u = Function('u') F = Function('F') xi = k*(x-c*t) U = Function('U') pde = diff(u(x,t), t) + 6*u(x,t)*diff(u(x,t), x) ode = simplify(pde.xreplace({t:tau,u(x,t):U(xi)})) ode1 = simplify(ode.xreplace({xi:atanh(Y), U(xi):F(Y)})) display('pde = ', pde) display('ode = ', ode) display('ode1 = ', ode1)
Python运行输出
输出结果如下:
- pde = $u_t(x,t) + 6 u(x,t) u_x(x,t)$
- ode = $U(\xi) \left(-c k \frac{d}{d\xi}U(\xi)\right) + 6 U(\xi) \left(k \frac{d}{d\xi}U(\xi)\right)$
- ode1 = $F(Y) \left(-c k \frac{d}{dY}F(Y)\right) + 6 F(Y) \left(k \frac{d}{dY}F(Y)\right)$
问题
Python生成的ode1结果与Maple输出的F1不符,需要修正代码得到正确的变换结果。
修正方案
问题核心是xreplace仅做符号替换,不会自动处理复合函数的链式求导。需改用subs结合doit()触发导数展开,让SymPy自动计算链式法则下的求导结果:
正确代码
from sympy import * c, k, x, t, Y, xi = symbols('c k x t Y xi') # 定义原函数与行波变换 u = Function('u')(x, t) xi = k*(x - c*t) U = Function('U')(xi) # 构造KdV方程并代入行波变换,展开导数 pde = diff(u, t) + 6*u*diff(u, x) pde_sub = pde.subs(u, U).doit() ode = simplify(pde_sub) # 第二次变量替换:ξ=arctanh(Y),U(ξ)=F(Y) F = Function('F')(Y) xi_sub = atanh(Y) ode_sub = ode.subs({xi: xi_sub, U: F}).doit() ode1 = simplify(ode_sub) display('pde = ', pde) display('ode = ', ode) display('ode1 = ', ode1)
关键说明
- 链式求导自动展开:用
subs替换函数后调用doit(),SymPy会自动处理复合函数求导:- $\frac{\partial u}{\partial t} = \frac{dU}{d\xi} \cdot \frac{\partial \xi}{\partial t} = -ck U'(\xi)$
- $\frac{\partial u}{\partial x} = \frac{dU}{d\xi} \cdot \frac{\partial \xi}{\partial x} = k U'(\xi)$
- 二次变换的导数处理:替换$\xi=\text{arctanh}(Y)$时,SymPy会自动计算$\frac{d\xi}{dY} = \frac{1}{1-Y^2}$,最终得到与Maple输出一致的ODE结果。
内容的提问来源于stack exchange,提问作者Graham G
相关产品推荐
相关产品推荐

