SymPy二阶微分方程解误差

时间:2019-12-22 22:24:18

标签: python sympy

我想获得微分方程组的符号解。 dsolve给出“ NotImplementedError”。 diff(t,1)效果很好。获得解决方案的最佳方法是什么?或者,如果不可能使用符号解,则如何将其转换为一阶以数字方式求解。任何帮助将不胜感激。

import sympy as sp
import mpmath
from sympy import Function, symbols, dsolve, Derivative, erf, sqrt, power, diff

a, t, rx, ry = symbols('a t rx ry')
rx = Function("rx")(t)
ry = Function("ry")(t)
r = sqrt(rx**2+ry**2)

eq1 = sp.Eq(rx.diff(t,2), -rx/r**3)
eq2 = sp.Eq(ry.diff(t,2), -ry/r**3)
sol = dsolve([eq1, eq2])
print(sol)

r'= v  v'= -r / | r | ^ 3 要从数字上解决它,需要将其转换为一阶。显然右边是渐变:

grad(1/r) = -r/|r|^3

但是对于笛卡尔来说,由于| r |看起来很奇怪。而且我在这里被卡住如何使用odeint:

rx' = vx
ry' = vy
vx' = -rx/|r|^3
vy' = -ry/|r|^3

要使用odeint,我需要5(?)参数的函数,应该是这样吗?

def F(U, t):
  vx, vy, rx, ry = U
  r = np.sqrt(rx**2 + ry**2)
  rxdt = vx
  rydt = vy
  vxdt = -rx/r**3
  vydt = -ry/r**3
  return [vxdt, vydt]

1 个答案:

答案 0 :(得分:0)

SymPy没有为这种非线性方程实现求解器:

In [2]: eq1                                                                                                                       
Out[2]: 
  2                              
 d                  rx(t)        
───(rx(t)) = ────────────────────
  2                           3/2
dt           ⎛  2        2   ⎞   
             ⎝rx (t) + ry (t)⎠   

In [3]: eq2                                                                                                                       
Out[3]: 
  2                              
 d                  ry(t)        
───(ry(t)) = ────────────────────
  2                           3/2
dt           ⎛  2        2   ⎞   
             ⎝rx (t) + ry (t)⎠   

您确定有任何解析解决方案吗?如果我正确理解,此处的d2r/dt^2 = r/|r|**3类似于r,它类似于引力轨道的方程式(除了会带有负号)。对于重力轨道,我认为t方面没有my_bucket的封闭形式解决方案。