Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция№8.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
753.66 Кб
Скачать

Метод Рунге-Кутта

Метод Рунге-Кутта позволяет строить схемы различного порядка точности. Эти схемы наиболее востребованы в практике из-за своей простоты и надежности.

Разберем алгоритм Рунге-Кутта на примере построения схемы второго порядка точности. Если обратиться к разложению в ряд Тейлора (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.