当参数为零时,带有参数的SymPy dsolve给出错误的答案

时间:2018-11-14 07:28:33

标签: 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).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 version: 1.3

     

general solution: Eq(f(t), C1*sin(n*t) + C2*cos(n*t))

     

solution at n=0 (pre-subs): Eq(f(t), C1 + C2*t)

     

solution at n=0 (post-subs): Eq(f(t), C2)

我的问题

一般n的解决方案形式似乎无法准确描述n=0的特定解决方案形式。具体来说,即使首先在逻辑上等效,首先使用dsolve和第二次subs(n, 0)会产生与首先使用subs(n, 0)和第二次dsolve不同的结果。

有人可以在我的结果中解释差异的原因吗?我是在做错什么,还是这是个错误?

1 个答案:

答案 0 :(得分:1)

可以认为它是dsolve逻辑中的错误:它找到两个特征值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_complete)提供了更熟悉的数学形式。

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