Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
для решения какого-нибудь нетривиального ОДУ нужно было знать кучу методик из вычматов, разных аппроксимаций и уточнений
# -*- coding: utf-8 -*-
"""
Уравнение Ван-дер-Поля (представление Льенара)
\begin{gather*}
y^{\prime}_1 = - a (\frac{y_1^3}{3} - y_1) + a y_2, \\
y^{\prime}_2 = - y_1,
\end{gather*}
Здесь a = 103 и a = 106, y1 = 2, y2= 0.
t_k = 20.
"""
from sympy import *
from scipy.integrate import ode
from pylab import *
y1, y2 = Symbol('y[0]'), Symbol('y[1]')
a = Symbol('a')
f1 = -a*(y1**3/3 - y1) + a*y2
f2 = -y1
Y = Matrix([f1, f2])
X = Matrix([y1, y2])
print 'f1 =', f1
print 'f2 =', f2
print 'jacobian = ', Y.jacobian(X)
def f(t, y, a):
return [a*y[1] - a*(-y[0] + y[0]**3/3),
-y[0]]
def jac(t, y, a):
return [[-a*(1 - y[0]**2), a],
[-1, 0]]
y01, y02 = 2.0, 0.
a = 103.
r = ode(f, jac).set_integrator('vode', method='bdf', with_jacobian=True)
r.set_initial_value((y01, y02)).set_f_params(a).set_jac_params(a)
t1, dt, t, y1, y2 = 20, 0.1, [0.], [y01], [y02]
while r.successful() and r.t < t1:
r.integrate(r.t + dt)
t.append(r.t)
y1.append(r.y[0])
y2.append(r.y[1])
figure(figsize=(13, 18))
splt1 = subplot(3, 1, 1)
title("$y^{\prime}_1 = - a (\\frac{y_1^3}{3} - y_1) + a y_2,\, y^{\prime}_2 = - y_1,\, a = %.2f,\, y1(0) = %.2f, \,y2(0)=%.2f$" % (a, y01, y02))
ylabel(r'$y_1$', {'fontsize': 18})
xlabel(r'$t$', {'fontsize': 18})
plot(t, y1, 'o-')
grid(True)
splt2 = subplot(3, 1, 2)
ylabel(r'$y_2$', {'fontsize': 18})
xlabel(r'$t$', {'fontsize': 18})
grid(True)
plot(t, y2, 'o-')
splt3 = subplot(3, 1, 3)
ylabel(r'$y_1$', {'fontsize': 18})
xlabel(r'$y_2$', {'fontsize': 18})
grid(True)
plot(y2, y1, 'o-')
savefig('./Уравнение Ван-дер-Поля.pdf')
show()

# -*- coding: utf-8 -*-
"""
Уравнение Бонгоффера - Ван-дер-Поля
\begin{gather*}
y^{\prime}_1 = a(- (\frac{y_1^3}{3} - y_1 ) + y_2), \\
y^{\prime}_2 = - y_1 - by_2 + c
\end{gather*}
Здесь a = 103 и a = 106, y1 = 2, y2= 0.
Уравнение описывает протекание тока через клеточную мембрану.
Постоянная компонента тока c в безразмерной записи системы такова,
что 0 < c < 1, b > 0. t_k = 20.
"""
from sympy import *
from scipy.integrate import ode
from pylab import *
y1, y2 = Symbol('y[0]'), Symbol('y[1]')
a, b, c = Symbol('a'), Symbol('b'), Symbol('c')
f1 = a*(-(y1**3/3 - y1) + y2)
f2 = -y1 - b*y2 + c
Y = Matrix([f1, f2])
X = Matrix([y1, y2])
print 'f1 =', f1
print 'f2 =', f2
print 'jacobian = ', Y.jacobian(X)
def f(t, y, a, b, c):
return [a*(y[0] + y[1] - y[0]**3/3),
c - y[0] - b*y[1]]
def jac(t, y, a, b, c):
return [[a*(1 - y[0]**2), a],
[ -1, -b]]
y01, y02 = 2., 0.
a, b, c = 103., 2.1, 0.5
r = ode(f, jac).set_integrator('vode', method='bdf', with_jacobian=True)
r.set_initial_value((y01, y02)).set_f_params(a, b, c).set_jac_params(a, b, c)
t1, dt, t, y1, y2 = 20, 0.5, [0.], [y01], [y02]
while r.successful() and r.t < t1:
r.integrate(r.t + dt)
t.append(r.t)
y1.append(r.y[0])
y2.append(r.y[1])
figure(figsize=(13, 18))
splt1 = subplot(3, 1, 1)
title("$y^{\prime}_1 = a (- (\\frac{y_1^3}{3} - y_1 ) + y_2),\, y^{\prime}_2 = - y_1 - b y_2 + c,\, a = %.2f,\, b = %.2f,\, c = %.2f,\, y1(0) = %.2f, \,y2(0)=%.2f$" % (a, b, c, y01, y02))
ylabel(r'$y_1$', {'fontsize': 18})
xlabel(r'$t$', {'fontsize': 18})
plot(t, y1, 'o-')
grid(True)
splt2 = subplot(3, 1, 2)
ylabel(r'$y_2$', {'fontsize': 18})
xlabel(r'$t$', {'fontsize': 18})
grid(True)
plot(t, y2, 'o-')
splt3 = subplot(3, 1, 3)
ylabel(r'$y_2$', {'fontsize': 18})
xlabel(r'$y_1$', {'fontsize': 18})
grid(True)
plot(y1, y2, 'o-')
savefig('./Уравнение Бонгоффера - Ван-дер-Поля.pdf')
show()



Обзор доступных библиотек для численного решения жёстких ОДУ