Sympy дает прерывистое решение для простого ODE, включающего кусочно - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь решить линейный ODE с прямоугольным angular сигналом в качестве второго члена, для первого и второго порядка:

First order
Second order

Я определяю второго члена с sympy.Piecewise. Для первого заказа Sympy дает ожидаемый результат. Но для второго порядка результат прерывистый. Кажется, Sympy не принимает y (5) в качестве начального условия для части t> 5.

Result for the first order Result for the second order

Как можно получить непрерывное решение?

Вот мой код:

python
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

t = sp.symbols('t')
y = sp.Function('y')
f = sp.Function('f')


#%% First order
t = sp.symbols('t')
y = sp.Function('y')

f = sp.Piecewise((1, t<5), (0, True))
eq = sp.Eq(y(t).diff(t) + y(t), f)
ics = {y(0): 0}
sol = sp.dsolve(eq, ics=ics)

# plot
yl = sp.lambdify(t, sol.rhs, modules='numpy')
fl = sp.lambdify(t, f, modules='numpy')
t_val = np.linspace(0,10,500)
plt.figure()
plt.plot(t_val, yl(t_val), label='y(t)')
plt.plot(t_val, fl(t_val), label='f(t)')
plt.title('first order', fontsize=30)
plt.legend(fontsize=20)

#%% Second order
t = sp.symbols('t')
y = sp.Function('y')

f = sp.Piecewise((1, t<5), (0, True))
eq = sp.Eq(sp.diff(y(t),t,t) + y(t) + sp.diff(y(t),t), f)
ics = {sp.diff(y(t),t).subs(t, 0): 0, y(0): 0}
sol = sp.dsolve(eq, ics=ics)

# plot
yl = sp.lambdify(t, sol.rhs, modules='numpy')
fl = sp.lambdify(t, f, modules='numpy')
t_val = np.linspace(0,10,500)
plt.figure()
plt.plot(t_val, yl(t_val), label='y(t)')
plt.plot(t_val, fl(t_val), label='f(t)')
plt.title('Second order', fontsize=30)
plt.legend(fontsize=20)

...