我想获得微分方程组的符号解。 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]
答案 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
的封闭形式解决方案。