SymPy"解决"它不应该解决的微分方程

Fru*_*lax 5 python symbolic-math sympy ode differential-equations

这是我做的:

from sympy import *
x = symbols("x")
y = Function("y")
dsolve(diff(y(x),x) - y(x)**x)
Run Code Online (Sandbox Code Playgroud)

我得到的答案(SymPy1.0)是:

Eq(y(x), (C1 - x*(x - 1))**(1/(-x + 1)))
Run Code Online (Sandbox Code Playgroud)

但那是错的.双方MathematicaMaple不能解决这个ODE.这里发生了什么事?

小智 7

一个bug.SymPy认为这是一个伯努利方程

y' = P(x) * y + Q(x) * y**n
Run Code Online (Sandbox Code Playgroud)

不检查指数n是否恒定.所以解决方案是错误的.

我在SymPy跟踪器上提出了一个问题.它应该很快在SymPy开发版本中修复,随后在版本1.2中修复.(顺便说一下,1.0有点老了,1.1.1虽然不是那个,但很多东西都有所改进.)

通过更正,SymPy认识到没有明确的解决方案和功率系列方法,产生一些功率系列术语:

Eq(y(x), x + x**2*log(C1)/2 + x**3*(log(C1)**2 + 2/C1)/6 + x**4*(log(C1)**3 + 9*log(C1)/C1 - 3/C1**2)/24 + x**5*(log(C1)**4 + 2*(log(C1) - 1/C1)*log(C1)/C1 + 2*(2*log(C1) - 1/C1)*log(C1)/C1 + 22*log(C1)**2/C1 - 20*log(C1)/C1**2 + 20/C1**2 + 8/C1**3)/120 + C1 + O(x**6))
Run Code Online (Sandbox Code Playgroud)

你不必等待补丁来获得这个电源系列,它可以通过给SymPy一个"提示"来获得:

dsolve(diff(y(x), x) - y(x)**x, hint='1st_power_series')
Run Code Online (Sandbox Code Playgroud)

在初始条件下工作得更好:

dsolve(diff(y(x), x) - y(x)**x, ics={y(0): 1}, hint='1st_power_series')
Run Code Online (Sandbox Code Playgroud)

回报

Eq(y(x), 1 + x + x**3/3 - x**4/8 + 7*x**5/30 + O(x**6))
Run Code Online (Sandbox Code Playgroud)