我有一个程序可以计算一个二阶微分方程的解,就像下面的代码片段所示:
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
不同的结果。
有人可以在我的结果中解释差异的原因吗?我是在做错什么,还是这是个错误?
答案 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