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))
这给出了一个明智的解决方案。
我正在尝试求解摩擦自由落体的 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))
这给出了一个明智的解决方案。