如何用SymPy正确求解微分方程(1-x²)y'=x²-xy-1?
SymPy求解分段微分方程的解决方案
问题描述
需要用SymPy求解微分方程 (1-x²)y' = x² - xy - 1,预期得到分段解:
- 当
-1 < x < 1时:y(x) = -√(1-x²)·arcsin(x) + C₁√(1-x²) - 当
x < -1或x > 1时:y(x) = -√(x²-1)·ln|x+√(x²-1)| + C₁√(x²-1) - 边界条件:
x=0时,y=0
运行以下SymPy代码后未得到预期结果:
x, C1= symbols("x, C1") y = symbols('y',cls=Function) eq=Eq((1-x**2)*Derivative(y(x),x),x**2-x*y(x)-1) sols = dsolve(eq,y(x),hint='all') exp_fin=False for k,v in sols.items(): if k=="best": exp_fin=True continue print("--------------------------------") print(k) display(v if exp_fin else v.doit())
解决步骤
1. 整理为标准线性微分方程
将原方程变形为一阶线性非齐次形式:
y' + (x/(1-x²))y = -1 (x≠±1)
2. 指定SymPy使用线性方程解法
SymPy默认的全局解法可能不会自动拆分分段解,直接指定hint='linear'可以得到通解的统一形式,再手动拆分定义域:
from sympy import symbols, Function, Eq, Derivative, dsolve, sqrt, asin, ln, Abs, display x, C1 = symbols("x, C1") y = symbols('y', cls=Function) eq = Eq((1-x**2)*Derivative(y(x), x), x**2 - x*y(x) - 1) # 用线性方程解法求解 sol = dsolve(eq, y(x), hint='linear') print("通解:") display(sol)
得到的通解可根据定义域拆分:
- 当
-1 < x < 1:sqrt(1-x²)为实数,利用arcsin(x)替换对数项(实数域内ln(x+sqrt(1-x²)) = arcsin(x)),得到预期形式。 - 当
|x| > 1:将sqrt(1-x²)替换为i*sqrt(x²-1),整理后消去虚数单位,得到实数解形式。
3. 定义分段解并验证
手动构造分段解并代入原方程验证正确性:
from sympy import Piecewise, simplify # 构造分段解 y_piecewise = Piecewise( (-sqrt(1-x**2)*asin(x) + C1*sqrt(1-x**2), abs(x) < 1), (-sqrt(x**2-1)*ln(Abs(x + sqrt(x**2-1))) + C1*sqrt(x**2-1), abs(x) > 1), (0, x == 0) ) # 验证解是否满足原方程 left = (1 - x**2)*Derivative(y_piecewise, x) right = x**2 - x*y_piecewise - 1 print("验证结果(化简后为0则正确):") display(simplify(left - right))
4. 确定常数C₁
代入边界条件x=0, y=0到-1 < x <1的解中:
0 = -sqrt(1-0)*asin(0) + C1*sqrt(1-0)
解得C₁=0,最终特解为:
-1 < x <1:y(x) = -√(1-x²)·arcsin(x)|x|>1:y(x) = -√(x²-1)·ln|x+√(x²-1)|x=0:y=0
内容的提问来源于stack exchange,提问作者Ryo
相关产品推荐
相关产品推荐

