Sympy无法求解的微分方程及非齐次线性ODE问题咨询
Sympy求解常微分方程问题解决方案
问题1:不显含x的二阶ODE求解失败
给定方程:1 + y·y'' + (y')² = 0,直接调用dsolve无法得到解,这类不显含自变量x的二阶ODE,适合通过y'=p(将p视为y的函数)的变量替换法手动转化为一阶方程求解。
解决步骤与代码
import sympy as sp x = sp.symbols('x') y = sp.Function('y')(x) p = sp.Function('p')(y) # 令p = dy/dx,且p是y的函数 # 替换二阶导数:y'' = dp/dx = dp/dy · dy/dx = p·dp/dy y_prime = p y_double_prime = p * sp.diff(p, y) # 代入原方程得到一阶ODE diff_eqn = sp.Eq(1 + y * y_double_prime + y_prime**2, 0) print("替换后的一阶方程:") display(diff_eqn) # 求解一阶方程 sol_p = sp.dsolve(diff_eqn, p) print("\n一阶方程的解:") display(sol_p) # 回代p = dy/dx,求解原方程的通解 for sol in sol_p: print("\n原方程的通解:") ode = sp.Eq(sp.diff(y, x), sol.rhs) sol_y = sp.dsolve(ode, y) display(sol_y)
执行后会得到两个形式的通解,对应一阶方程解的两个分支。
问题2:非齐次线性方程指定hint报错
给定方程:f''(x) + 4f(x) = 8sin(2x),指定hint为nth_linear_euler_eq_nonhomogeneous_undetermined_coefficients时触发ValueError,原因是该hint仅适用于欧拉方程(形如xⁿy⁽ⁿ⁾ + a₁xⁿ⁻¹y⁽ⁿ⁻¹⁾ + ... + aₙy = f(x)的变系数方程),而当前方程是常系数线性非齐次方程,需使用对应类型的解法。
正确解法代码
方法1:不指定hint,让Sympy自动识别求解
from sympy import dsolve, Function, Derivative, sin from sympy.abc import x f = Function('f') eq = Derivative(f(x), x, x) + 4*f(x) - 8*sin(2*x) sol = dsolve(eq, f(x)).expand() print("通解:") display(sol)
方法2:指定正确的hint
from sympy import dsolve, Function, Derivative, sin from sympy.abc import x f = Function('f') eq = Derivative(f(x), x, x) + 4*f(x) - 8*sin(2*x) sol = dsolve(eq, f(x), hint='nth_linear_constant_coeff_nonhomogeneous').expand() print("通解:") display(sol)
两种方法都会得到正确的通解:f(x) = C₁cos(2x) + C₂sin(2x) - 2xcos(2x)。
内容的提问来源于stack exchange,提问作者Prateek Sonthalia
相关产品推荐
相关产品推荐

