SymPy dsolve с параметром дает неправильный ответ, когда параметр равен нулю - PullRequest
0 голосов
/ 14 ноября 2018

Мой код

У меня есть программа, которая вычисляет решения дифференциального уравнения 2-го порядка, как в приведенном ниже фрагменте кода:

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 first и subs(n, 0) second дает результаты, отличные от использования subs(n, 0) first и dsolve second, даже если эти два значения должны быть логически эквивалентны.

Может кто-нибудь объяснить причину расхождения в моих результатах? Я что-то не так делаю, или это ошибка?

1 Ответ

0 голосов
/ 15 ноября 2018

Это можно считать ошибкой в ​​логике dsolve: он находит два собственных значения n и -n и обрабатывает их как разные, не учитывая особый случай n=0, когда они равны.В идеале он будет выводить Piecewise, как это делает следующий код.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...