这是我所做的:

from sympy import *
x = symbols("x")
y = Function("y")
dsolve(diff(y(x),x) - y(x)**x)

我得到的答案(SymPy 1.0)是:
Eq(y(x), (C1 - x*(x - 1))**(1/(-x + 1)))

但这是错误的。 MathematicaMaple都无法解决此ODE。这里发生了什么事?

最佳答案

一个错误。 SymPy认为这是一个Bernoulli equation

y' = P(x) * y + Q(x) * y**n

无需检查指数n是否为常数。因此,解决方案是错误的。

我在SymPy跟踪器上提出了一个issue。应该尽快在development version of 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))

您不必等待补丁程序获得此幂级数,可以通过给SymPy一个“提示”来获得它:
dsolve(diff(y(x), x) - y(x)**x, hint='1st_power_series')

在初始条件下效果更好:
dsolve(diff(y(x), x) - y(x)**x, ics={y(0): 1}, hint='1st_power_series')

退货
Eq(y(x), 1 + x + x**3/3 - x**4/8 + 7*x**5/30 + O(x**6))

关于python - SymPy "solves"它不应该求解的微分方程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48148720/

10-16 22:34