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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:48:10