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)
但那是错的.双方Mathematica并Maple不能解决这个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)