我想找到一种解决以下微分方程的优雅方法:

from sympy import *
init_printing()

M, phi, t, r = symbols('M phi t r')

eq = Eq(-M * phi(t).diff(t), Rational(3, 2) * m * r**2 * phi(t).diff(t) * phi(t).diff(t,t))


python - Sympy:求解微分方程-LMLPHP

我假设phi(t).diff(t)不为零。因此,左侧和右侧缩短了。

这是我解决的方法:

# I assume d/dt(phi(t)) != 0

theta = symbols('theta')
eq = eq.subs({phi(t).diff(t, 2): theta})  # remove the second derivative
eq = eq.subs({phi(t).diff(t): 1})  # the first derivative is shortened
eq = eq.subs({theta: phi(t).diff(t, 2)})  # get the second derivative back


python - Sympy:求解微分方程-LMLPHP

dsolve(eq, phi(t))


python - Sympy:求解微分方程-LMLPHP

如何更优雅地解决这个问题?

最佳答案

理想情况下,dsolve()能够直接求解方程,但不知道如何求解(需要了解它可以分解方程并独立求解因子)。我为此打开了issue

我唯一的其他建议是直接将phi'分开:

eq = Eq(eq.lhs/phi(t).diff(t), eq.rhs/phi(t).diff(t))


您也可以使用

eq.xreplace({phi(t).diff(t): 1})


在不修改第二个导数的情况下用1替换一阶导数(与subs不同,xreplace不具备数学知识,它只是替换表达式)。

并且不要忘记phi(t) = C1也是一个解决方案(因为phi'等于0时)。

关于python - Sympy:求解微分方程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33340217/

10-12 23:50