
- •Лекция №8 Обыкновенные дифференциальные уравнения Постановка задачи Коши
- •Метод Пикара
- •Метод малого параметра
- •Метод ломаных
- •Метод Рунге-Кутта
- •Метод Адамса
- •Решатели дифференциальных уравнений в matlab
- •Постановка краевой задачи
- •Метод стрельбы
- •Краевая задача. Разностный метод
- •Краевая задача в среде matlab
Метод Рунге-Кутта
Метод Рунге-Кутта позволяет строить схемы различного порядка точности. Эти схемы наиболее востребованы в практике из-за своей простоты и надежности.
Разберем алгоритм
Рунге-Кутта на примере построения схемы
второго порядка точности. Если обратиться
к разложению в ряд Тейлора (16), то для
вычисления un +1
со вторым порядком точности нам необходимо
знать вторую производную
.
Чтобы не вычислять вторую производную,
ее можно представить в виде конечной
разности, т.е.
.
Это наводящее соображение позволяет
предложить следующую схему численного
решения дифференциального уравнения:
, (25)
где, как и выше, yn — численное решение исходного уравнения (6), , , , — некоторые параметры, которые определяются ниже.
Разложим второе слагаемое в квадратных скобках в (25) в ряд Тейлора по шагу сетки h, тогда
(26)
Комбинируя (16), (17), находим
(26)
Подберем теперь параметры , , , так, чтобы выражение (26) совпало с (26) в пределах разложения Тейлора до второй степени по шагу сетки h. Это требование реализуется, когда
. (27)
Выражая все параметры согласно (27) через и подставляя полученные выражения в (25), получим однопараметрическое семейство двухчленных схем Рунге-Кутта
, (28)
где берется из полуинтервала (0,1].
Погрешность схемы
(28) может быть оценена также, как и в
схеме ломаных. Результат оценок следующий.
Если правая часть f(x,u)
ограничена и непрерывна вместе со
вторыми производными, то численное
решение, полученное по схеме (28), равномерно
сходится к точному решению с погрешностью
,
т.е. сходимость осуществляется со вторым
порядком точности. Проверим это.
На листинге_№5
приведен код решения дифференциального
уравнения из предыдущего пункта (23).
Здесь также как и в предыдущем листинге
нас интересует поведение константы
в зависимости от шага сетки h.
Листинге_№5
%Программа иллюстрирующая решение
%дифференциального уравнения методом
%Рунге-Кутта второго порядка точности
%очищаем рабочее пространство
clear all
%задаем значение параметра, определяющего
%семейство схем Рунге-Кутта
alpha=0.25;
%задаем правую часть дифференциального
%уравнения u'=f(x,u)
f=@(x,u)x*u;
%задаем набор сеток
Mesh=10:50:10000;
%организуем цикл расчетов с разными сетками
for k=1:length(Mesh)
N=Mesh(k); h=1.0/(N-1);
%задаем начальное условие
y(1)=1;
%вычисляем приближенные значения решения
%дифференциального уравнения
for n=1:(N-1)
x(n)=(n-1)*h;
y(n+1)=y(n)+h*((1-alpha)*f(x(n),y(n))+...
alpha*f(x(n)+h/(2*alpha),y(n)+...
(h/(2*alpha))*f(x(n),y(n))));
end
%находим константу M в оценке погрешности
%приближенного решения |y(N)-u(N)|<=Mh^2,
%она не должна зависеть от h
M(k)=abs(y(N)-exp(0.5))/h^2;
step(k)=h;
end
%рисуем зависимость константы M от шага сетки h
%(по оси абсцисс переходим к логарифмической
%системе координат средствами MATLAB)
plot(step,M);
На рис.3 приведен итоговый график зависимости константы M(1) от шага сетки (при = 0,25). Видно, что, начиная с некоторого, при меньших значениях шага величина M(1) действительно не зависит от параметра h. В частности этот график подтверждает квадратичную оценку сходимости семейства схем Рунге-Кутта (28). Кроме того, был исследован также вопрос численной применимости метода Рунге-Кутта со значениями параметра вне полуинтервала (0,1]. Оказалось, что и при этих значениях метод Рунге-Кутта по схеме (28) может быть использован.
Рассмотрим геометрическую интерпретацию схем Рунге-Кутта для двух значений параметра = 1 и 0,5. В первом случае, подставляя = 1, в (28), находим
. (29)
Вводя половинные значения аргумента xn +1/2 и функции yn +1/2, схему (29) можно переписать в следующем виде
(30)
Геометрическая интерпретация схемы (30) представлена на рис.4,а. Согласно первому шагу в схеме (30), методом ломаных находится значение решения в половинном точке отрезка [xn,xn +1], далее вычисляется производная решения в половинной точке и в этом направлении делается шаг на всем отрезке [xn,xn +1].
Рис.3. Изучение погрешности семейства схем метода Рунге-Кутта (28)
Во втором случае при =0,5 имеем следующую схему:
. (31)
Для геометрической интерпретации схемы (31) перепишем ее в следующем виде:
(32)
Согласно первому
шагу в схеме (32), находим предварительное
значение решения
,
на втором шаге оно уточняется путем
коррекции правой части как полусуммы
правой части в точке xn
и предварительного решения
.
Геометрическая интерпретация данной
процедура приведена на рис.4,б.
Схемы численного расчета дифференциальных уравнений типа (30), (32) называют часто также как схемы “предиктор — корректор”.
|
|
Рис.4,а. Геометрическая интерпретация схемы Рунге-Кутта (30) |
Рис.4,б. Геометрическая интерпретация схемы Рунге-Кутта (32) |
Рассмотрим одну схемы третьего порядка точности. Одна из них без вывода представлена ниже.
(33)
Протестируем схему
(33) на предмет выяснения порядка точности.
Для этого, как и в предыдущих двух
программах будем численно решать
уравнение (23) на отрезке [0,1], сравнивая
численное решение и точное, при этом
ошибка не должна превышать величину
.
Нас будет интересовать поведение
константы
в зависимости от шага сетки h.
Код соответствующей программы приведен
на листинге_№6.
Листинг_№6
%Программа иллюстрирующая решение
%дифференциального уравнения методом
%Рунге-Кутта третьего порядка точности
%очищаем рабочее пространство
clear all
%задаем правую часть дифференциального
%уравнения u'=f(x,u)
f=@(x,u)x*u;
%задаем набор сеток
Mesh=10:50:10000;
%организуем цикл расчетов с разными сетками
for k=1:length(Mesh)
N=Mesh(k); h=1.0/(N-1);
%задаем начальное условие
y(1)=1;
%вычисляем приближенные решения
%дифференциального уравнения
for n=1:(N-1)
x(n)=(n-1)*h;
k1=f(x(n),y(n));
k2=f(x(n)+0.5*h,y(n)+0.5*h*k1);
k3=f(x(n)+h,y(n)+h*(-k1+2*k2));
y(n+1)=y(n)+(h/6)*(k1+4*k2+k3);
end
%находим константу M в оценке погрешности
%приближенного решения |y(N)-u(N)|<=Mh^3,
%она не должна зависеть от h
M(k)=abs(y(N)-exp(0.5))/h^3;
step(k)=h;
end
%рисуем зависимость константы M от шага сетки h
%(в графическом окне MATLAB по оси абсцисс
%переходим в логарифмическую систему координат)
plot(step,M);
На рис.5,а приведен итоговый график зависимости величины M(1) от шага сетки. Видно, что где-то между значениями 104 и 103 шага сетки величина M(1) становится нестабильной и колеблется в небольшом диапазоне. В конечном счете, эти колебания связаны с тем, что данная схеме повышенной точности начинает “чувствовать” ограниченность мантиссы чисел типа double в MATLAB. В следующем примере схемы Рунге-Кутта еще более высокого — четвертого порядка точности, колебания величины M(1) перейдут в экспоненциальный рост.
|
|
Рис.5,а. Изучение погрешности метода Рунге-Кутта третьего порядка (33) |
Рис.5,б. Изучение погрешности метода Рунге-Кутта четвертого порядка (34) |
Наиболее употребительны схемы четвертого порядка точности. Одна из них без вывода представлена ниже.
(34)
Протестируем схему
(34) на предмет выяснения порядка точности.
Для этого, как и в предыдущих трех
программах будем численно решать
уравнение (23) на отрезке [0,1], сравнивая
численное решение и точное, при этом
ошибка не должна превышать величину
.
Нас будет интересовать поведение
константы
в зависимости от шага сетки h.
Код соответствующей программы приведен
на листинге_№7.
Листинг_№7
%Программа иллюстрирующая решение
%дифференциального уравнения методом
%Рунге-Кутта четвертого порядка точности
%очищаем рабочее пространство
clear all
%задаем правую часть дифференциального
%уравнения u'=f(x,u)
f=@(x,u)x*u;
%задаем набор сеток
Mesh=10:50:10000;
%организуем цикл расчетов с разными сетками
for k=1:length(Mesh)
N=Mesh(k); h=1.0/(N-1);
%задаем начальное условие
y(1)=1;
%вычисляем приближенные решения
%дифференциального уравнения
for n=1:(N-1)
x(n)=(n-1)*h;
k1=f(x(n),y(n));
k2=f(x(n)+0.5*h,y(n)+0.5*h*k1);
k3=f(x(n)+0.5*h,y(n)+0.5*h*k2);
k4=f(x(n)+h,y(n)+h*k3);
y(n+1)=y(n)+(h/6)*(k1+2*k2+2*k3+k4);
end
%находим константу M в оценке погрешности
%приближенного решения |y(N)-u(N)|<=Mh^4,
%она не должна зависеть от h
M(k)=abs(y(N)-exp(0.5))/h^4;
step(k)=h;
end
%рисуем зависимость константы M от шага сетки h
%(в графическом окне MATLAB по осям абсцисс и
%ординат переходим в логарифмическую систему
%координат)
plot(step,M);
На рис.5,б приведена итоговая зависимость величины M(1) от шага сетки. Видно, что при шаге сетки меньше 103 величины M(1) быстро возрастает. Этот рост можно объяснить тем, что в силу высокой точности схемы дальнейшее уменьшении шага нецелесообразно, т.к. мантисса чисел с плавающей запятой типа double в MATLAB ограничена приблизительно 15-ю значащими цифрами.
Схемы Рунге-Кутта имеют следующий ряд преимуществ, которые делают их одними из самых популярных:
схемы Рунге-Кутта (кроме схемы ломаных) имеют высокую точность;
они являются явными, т.е. значение решения на следующем уровне вычисляется по вполне определенным формулам от предыдущих значений;
все схемы Рунге-Кутта допускают расчет с переменным шагом сетки, это делает их еще более гибкими при использовании в приложениях;
для расчета достаточно задать лишь начальное значение, дальнейшие значения искомой функции получаются путем расчета по одним и тем же формулам.
Методы Рунге-Кутта
легко обобщаются для решения систем
дифференциальных уравнений путем
формальной замены u
и f
на
и
.
Так схема Рунге-Кутта четвертого порядка
точности для системы дифференциальных
уравнений
приобретает следующий вид:
(35)
Схему Рунге-Кутта (35) проиллюстрируем на примере решения системы уравнений описывающей колебания линейного маятника, т.е. численно решим пару дифференциальных уравнений вида:
на отрезке [0, /4]
при начальных данных
.
Эта задача имеет единственное решение
.
Нас будет интересовать численное решение
в точке x
= /4.
Точное значение вектора-функции в этой
точке равно
.
Сравним точное значение с приближенным
при различных значениях шага сетки,
т.е. вычислим величину
, (36)
где || || — некоторая
векторная норма. Эта величина для схемы
(35) должна выходить на некоторую константу
при h
0. При этом для погрешности схемы (35)
можно дать оценку
.
Для выяснения зависимости величины (36) от шага сетки была написана программа, код которой приведен на листинге_№8.
Листинг_№8
%Программа иллюстрирующая решение системы
%дифференциальных уравнений методом
%Рунге-Кутта четвертого порядка точности
%очищаем рабочее пространство
clear all
%задаем правую часть дифференциального
%уравнения u'=f(x,u)
f=@(x,u)[u(2);-u(1)];
Mesh=10:50:10000;
%организуем цикл расчетов с разными сетками
for k=1:length(Mesh)
N=Mesh(k); h=(0.25*pi)/(N-1);
%задаем начальное условие
y(:,1)=[0;1];
%вычисляем приближенные решения системы
%дифференциальных уравнений
for n=1:(N-1)
x(n)=(n-1)*h;
k1=f(x(n),y(:,n));
k2=f(x(n)+0.5*h,y(:,n)+0.5*h*k1);
k3=f(x(n)+0.5*h,y(:,n)+0.5*h*k2);
k4=f(x(n)+h,y(:,n)+h*k3);
y(:,n+1)=y(:,n)+(h/6)*(k1+2*k2+2*k3+k4);
end
%находим константу M в оценке погрешности
%приближенного решения |y(N)-u(N)|<=Mh^4,
%она не должна зависеть от h
M(k)=norm(y(:,N)-[1;1]/sqrt(2))/h^4;
step(k)=h;
end
%рисуем зависимость константы M от шага сетки h
%(в графическом окне MATLAB по осям абсцисс и
%ординат переходим в логарифмическую систему
%координат)
plot(step,M);
Рис.6. Изучение погрешности метода Рунге-Кутта четвертого порядка для системы уравнений
На рис.6 приведен итоговый график зависимости. Его можно сравнить с графиком на рис.5,б. Оба графика показывают сходные зависимости; при шаге сетки меньше 103 величина M( /4) начинает быстро расти. Причина роста аналогична той, которая обсуждались выше в связи с ограниченностью мантиссы чисел типа double в MATLAB.