SymPy returns 非线性 ODE 的错误解?

SymPy returns wrong solution of a nonlinear ODE?

我正在尝试求解摩擦自由落体的 ODE:

from sympy import *
t = symbols ('t')
v = Function ('v')
dgl = Eq (diff (v(t), t) + v(t)**2, 1)

erg = dsolve (dgl)

我认为解决方案可能是错误的。我相信它应该是返回表达式的倒数。因此,如果我试图找到静止初始条件 (v(0) = 0) 的常量值,我得不到真正的解决方案:

C1 = symbols ('C1')
solve (erg.rhs.subs (t, 0), C1)

因此,如果我要求 SymPy 用初始条件求解 ODE,它会抛出错误:

dsolve (dgl, ics = {v(0): 0})

sympy 的回答在形式上是正确的,v=u'/u 一个得到 u''=u 所以

u(t) = A*exp(t)+B*exp(-t)

v(t) = (A*exp(t)-B*exp(-t))/(A*exp(t)+B*exp(-t))

根据常量如何组合成一个参数,以及喜欢哪种符号组合,有

A = D*exp(-C), B = D*exp(C) ==> v(t) = tanh(t-C)

A = D*exp(-C), B =-D*exp(C) ==> v(t) = ctgh(t-C)

可以像求解器那样使用复因数从一个版本切换到另一个版本

ctgh(t-C+i*pi/2) = (i*exp(t-C)+(-i)*exp(-t+C))/(i*exp(t-C)-(-i)*exp(-t+C))

                 = tanh(t-C)

这是初始条件求解器提出的。


您可以做的是检查其他可用的解决方案路径

classify_ode(dgl)
#('separable',
# '1st_exact',
# '1st_rational_riccati',
# '1st_power_series',
# 'lie_group',
# 'separable_Integral',
# '1st_exact_Integral')

dsolve (dgl, ics = {v(0): 0}, hint='1st_rational_riccati')
# Eq(v(t), (1 - exp(2*t))/(-exp(2*t) - 1))
dsolve (dgl, ics = {v(0): 0}, hint='1st_rational_riccati').simplify()
# Eq(v(t), tanh(t))

这给出了一个明智的解决方案。