- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
94
Глава_7. Решение Обыкновенных Дифференциальных Уравнений
Можно выделить три типа методов решения обыкновенных дифференциальных уравнений: точные, приближенные и численные. Точные методы предусматривают получение решения в виде комбинации элементарных функций или в виде квадратур от последних. Приближенные
методы сводятся к построению последовательности функций |
wn (x) , |
|
имеющих пределом искомую функцию |
v(x) . Обрывая |
эту |
последовательность на каком-то k , получают приближенное решение. Наиболее универсальными методами являются численные.
1) Метод Рунге-Кутта
Является одними из численных методов повышенной точности решения ОДУ. Рассмотрим суть данного метода на примере ОДУ первого порядка.
Пусть на отрезке [a;b] имеем задачу Коши:
y'= f (x, y),
y(x0 ) = y0 .
Разобьем отрезок [a;b] на n равных частей (заметим, что a = x0 ). Тогда i -ая точка отрезка находится по формуле:
xi = x0 +ih , где |
h = |
b − a |
. |
|
|||
|
|
n |
|
Последовательность точек yi искомого решения может быть определена как:
yi+1 = yi + yi .
Нам осталось определить yi , - разложим это слагаемое в ряд Тейлора (до четвертого порядка):
yi = y(xi + h) − y(xi ) = h y'(
Теперь для каждой текущей точки
K1(i) = f (
K2(i) = f (
K3(i) = f (
K4(i) = f (
xi ) + |
h2 |
y''(xi ) + |
h3 |
y'''(xi ) + |
h4 |
y(IV ) (xi ) . |
|||||
|
|
|
|
||||||||
|
|
|
2 |
|
|
3! |
4! |
|
|||
(xi , yi ) определим четыре числа: |
|||||||||||
xi , yi ); |
|
|
|
|
|
|
|
|
|||
xi + |
h |
, |
yi + |
h K |
(i) |
); |
|
|
|||
|
|
|
1 |
|
|
||||||
2 |
2 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|||
xi + |
h |
, |
yi + |
h K |
(i) |
); |
|
|
|||
|
|
|
2 |
|
|
||||||
2 |
2 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|||
xi + h, yi + h K3(i) ).
Тогда с точностью до порядка K 4 имеем:
yi = 16 h (K1(i) + 2K2(i) + 2K3(i) + K4(i) ) .
Вычисления удобно располагать в виде таблицы:
95
|
|
|
|
|
|
|
____ |
|
|
|
____ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' |
|
|
|
|
|
|
yi |
|
|
|
|
|
|
|
|||||
i |
X k , k = |
0, 3 |
Yk , k = 0, 3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yi = f (X k |
,Yk ) |
K (i) |
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
X 0 |
= x0 |
|
|
|
|
|
|
|
|
Y0 |
= y0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f (X 0 ,Y0 ) |
|
K1(o) = f (X 0 |
,Y0 ) |
|
|
1 |
(0) |
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y0 = |
6 |
h (K1 |
|
+ |
|||
|
X1 |
= x0 |
+ |
|
|
h |
|
Y1 = y0 + h f (x0 , y0 ); |
|
|
|
|
|
|
|
|
f (X |
|
,Y ) |
|
K (o) = f (X |
|
,Y ) |
|
||||||||||||||||||||||
|
|
2 |
|
|
пусть A = h f (x0 , y0 ) |
|
|
|
|
|
|
|
|
|
1 |
1 |
|
2 |
1 |
1 |
|
(0) |
+ |
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+2 K2 |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+2 K3(0) + |
|
|
|
||||||||||
0 |
X 2 |
= x0 |
+ |
|
|
h |
|
Y2 |
= y0 +h f (x0 + |
h |
, |
|
y0 + |
A |
); |
|
|
f (X 2 ,Y2 ) |
|
K3(o) = f (X 2 ,Y2 ) |
|
|
|
|||||||||||||||||||||||
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(0) |
) |
|
|
|
|
|
||||||||||||||||||||||||
|
2 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
h |
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
|
+K4 |
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
пустьB =h f (x |
|
+ |
|
, y |
|
+ |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
|
2 |
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
X |
3 |
= x |
0 |
+ h |
Y = y |
0 |
+ B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f (X |
3 |
,Y ) |
|
K (o) = f (X |
3 |
,Y ) |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
3 |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
Получили первую точку последовательности решения |
: |
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y1 = y0 + y0 , x1 = x0 + h |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
X 0 |
= x1 |
|
|
|
|
|
|
|
|
Y0 |
= y1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f (X 0 ,Y0 ) |
|
K1(o) = f (X 0 |
,Y0 ) |
|
|
1 |
(0) |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y1 = |
|
|
|
h (K1 |
+ |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
||||||
|
X1 |
= x1 |
+ |
|
h |
Y1 = y1 + h f (x1 , y1 ); |
|
|
|
|
|
|
|
|
f (X |
|
,Y ) |
|
K (o) = f (X |
|
,Y ) |
|||||||||||||||||||||||||
|
|
2 |
|
|
|
пусть A = h f (x , y ) |
|
|
|
|
|
|
|
|
|
1 |
1 |
|
2 |
1 |
1 |
|
(0) |
+ |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+2 K2 |
|
|
|
||||||||||||||||||
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+2 K3(0) + |
|
|
|
||||
X 2 |
= x1 + |
|
|
h |
|
Y2 = y1 +h f (x1 + |
h |
|
|
|
|
y1 + |
A |
|
f (X 2 ,Y2 ) |
|
K3(o) = f (X 2 ,Y2 ) |
|
|
|
||||||||||||||||||||||||||
|
|
2 |
|
|
2 |
, |
|
2 |
); |
|
|
|
|
|
|
|
|
+K(0)) |
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h |
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
пустьB =h f (x + |
, y + |
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
2 |
|
1 |
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
X |
3 |
= x + h |
Y = y + B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f (X |
3 |
,Y ) |
|
K (o) = f (X |
3 |
,Y ) |
|
|
|
|
|
|
|
|
||||||||||||
|
|
1 |
|
|
|
|
|
|
|
|
3 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
3 |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
Получили вторую точку последовательности решения |
: |
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y2 = y1 + y1 , x2 = x1 + h ; |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
Продолжаем итерационный процесс до тех пор, пока не достигнем конца отрезка – точки b .
Примечание.
Данный метод имеет четвертый порядок точности. Поэтому величина шага, при котором найденное решение удовлетворяет заданной точности, ищется из соотношения (данное соотношение можно получить, применив правило Рунге):
h4 ≤ ε , где ε - заданная точность.
Приведем реализацию данного метода в системе Scilab.
96
Листинг 7.1.
//метод Рунге-Кутта четвертого порядка function[value] = f(x, y)
value = 0.5*(x - y); endfunction
y_0 = 1;
a_0 = 0; // начальная точка b_ = 3; // конечная точка h = 0.125; // шаг
n = (b_ - a_0)/h; // разбиение
iter = 0; // итерации
for i = 1:n // формирование массива ответов a(i) = 0;
end
a(1) = y_0; // нач. условие - первый элемент массива ответов
while iter < n
a_ = a_0 + iter*h;
K_1 = f(a_, a(iter + 1));
K_2 = f(a_ + h/2, a(iter + 1) + K_1*h/2); K_3 = f(a_ + h/2, a(iter + 1) + K_2*h/2); K_4 = f(a_ + h, a(iter + 1) + K_3*h);
dy = (1/6)*h*(K_1 + 2*K_2 + 2*K_3 + K_4);
//не забываем, что индекс массива начинается с 1,
//а не с 0(как в С)
a(iter + 2) = a(iter + 1) + dy; iter = iter + 1;
end
a
97
Рис. 1. Результат работы Листинга_7.1
2) Метод Эйлера
Данный метод носит еще название метода ломаных Пусть на отрезке [a;b] имеем задачу Коши:
y'= f (x, y),
y(x0 ) = y0 .
Метод основывается на том, что дифференциальное уравнение может быть решено на основе представления искомой функции в ряд Тейлора (причем из разложения в ряд Тейлора берется только первая производная). Тогда решение представимо в виде:
y = f (x0 ) + f '(x0 )(x − x0 ) .
Разобьем отрезок [a;b] на n равных частей (заметим, что a = x0 ). Тогда i -ая точка отрезка находится по формуле:
98
xi = x0 +ih , где |
h = |
b − a |
. |
|
|||
|
|
n |
|
Тогда получаем последовательность точек yi искомого решения:
yi+1 = yi + h f (xi , yi ) .
Приведем реализацию данного метода в системе Scilab.
Листинг 7.2.
//метод Эйлера
function[value] = f(x, y) value = 0.5*(x - y); endfunction
y_0 = 1;
a_0 = 0; // начальная точка b_ = 3; // конечная точка h = 0.125; // шаг
n = (b_ - a_0)/h; // разбиение
iter = 0; // итерации
for i = 1:n // формирование массива ответов a(i) = 0;
end
a(1) = y_0; // нач. условие - первый элемент массива ответов
while iter < n
a_ = a_0 + iter*h;
//не забываем, что индекс массива начинается с 1,
//а не с 0(как в С)
a(iter + 2) = a(iter + 1) + h*f(a_, a(iter + 1)); iter = iter + 1;
end
a
