Python 当参数为零时,带参数的SymPy dsolve给出错误答案 我的代码

Python 当参数为零时,带参数的SymPy dsolve给出错误答案 我的代码,python,sympy,Python,Sympy,我有一个计算二阶微分方程解的程序,如下面的代码片段所示: import sympy as sp print('sympy version:', sp.__version__) t = sp.symbols('t', real=True, nonnegative=True) n = sp.symbols('n', integer=True, nonnegative=True) f = sp.symbols('f', cls=sp.Function) diff_eq = sp.Eq(f(t).d

我有一个计算二阶微分方程解的程序,如下面的代码片段所示:

import sympy as sp
print('sympy version:', sp.__version__)

t = sp.symbols('t', real=True, nonnegative=True)
n = sp.symbols('n', integer=True, nonnegative=True)
f = sp.symbols('f', cls=sp.Function)

diff_eq = sp.Eq(f(t).diff(t, 2) + n**2*f(t), 0)

print('general solution:', sp.dsolve(diff_eq, f(t)))
print('solution at n=0 (pre-subs):', sp.dsolve(diff_eq.subs(n, 0), f(t)))
print('solution at n=0 (post-subs):', sp.dsolve(diff_eq, f(t)).subs(n, 0))
结果:

sympy版本:1.3

通解:等式(f(t),C1*sin(n*t)+C2*cos(n*t))

n=0时的解决方案(预分段):等式(f(t),C1+C2*t)

n=0时的解决方案(后分段):等式(f(t),C2)

我的问题 一般
n
的解决方案形式似乎无法准确描述
n=0
的具体解决方案形式。具体来说,使用
dsolve
first和
subs(n,0)
second产生的结果与使用
subs(n,0)
first和
dsolve
second产生的结果不同,尽管两者在逻辑上应该是等价的


有人能解释一下我的结果不一致的原因吗?我做错了什么,还是这是一个bug?

它可以被认为是
dsolve
逻辑中的bug:它找到两个特征值
n
-n
,并将它们视为不同的,而不考虑它们相等时的特殊情况
n=0
。理想情况下,它会像下面的代码那样逐段地输出

sol_nonzero = sp.dsolve(diff_eq, f(t)).rhs
sol_zero = sp.dsolve(diff_eq.subs(n, 0), f(t)).rhs
sol_complete = sp.Piecewise((sol_nonzero, sp.Ne(n, 0)), (sol_zero, True))
print('general solution:', sol_complete)
print('solution at n=0:', sol_complete.subs(n, 0))
这张照片

general solution: Piecewise((C1*sin(n*t) + C2*cos(n*t), Ne(n, 0)), (C1 + C2*t, True))
solution at n=0: C1 + C2*t
sp.pprint(sol\u complete)
提供了一种更为常见的数学形式

⎧C₁⋅sin(n⋅t) + C₂⋅cos(n⋅t)  for n ≠ 0
⎨
⎩        C₁ + C₂⋅t          otherwise