SymPy "solves" 一个它不应该求解的微分方程
SymPy "solves" a differential equation it shouldn't solve
这是我所做的:
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)))
但这是错误的。 Mathematica
和 Maple
都无法求解此 ODE。这里发生了什么?
一个错误。 SymPy 认为它是 Bernoulli equation
y' = P(x) * y + Q(x) * y**n
没有检查指数 n 是否恒定。所以解决方案是错误的。
我提出了一个issue on SymPy tracker. It should be soon fixed in the 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))
这个幂级数不用等patch,给SymPy一个就可以得到"hint":
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')
returns
Eq(y(x), 1 + x + x**3/3 - x**4/8 + 7*x**5/30 + O(x**6))
这是我所做的:
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)))
但这是错误的。 Mathematica
和 Maple
都无法求解此 ODE。这里发生了什么?
一个错误。 SymPy 认为它是 Bernoulli equation
y' = P(x) * y + Q(x) * y**n
没有检查指数 n 是否恒定。所以解决方案是错误的。
我提出了一个issue on SymPy tracker. It should be soon fixed in the 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))
这个幂级数不用等patch,给SymPy一个就可以得到"hint":
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')
returns
Eq(y(x), 1 + x + x**3/3 - x**4/8 + 7*x**5/30 + O(x**6))