Метод Рунге-Кутты-Фельберга
Характеристика модифицированных методов Эйлера. Определение порядка аппроксимации. Рассмотрение адаптивных процедур Рунге-Кутты. Построение фазового портрета в системе координат для поставленной задачи. Определение особенностей пересчета по правилу Рунге.
Рубрика | Математика |
Вид | реферат |
Язык | русский |
Дата добавления | 28.10.2017 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовой проект по дисциплине
ЧИСЛЕННЫЕ МЕТОДЫ
Метод Рунге-Кутты-Фельберга
Афанасьев Сергей А-13-08
2011 год
Метод Рунге-Кутты-Фельберга
Теория
Методы Рунге-Кутты являются модифицированными методами Эйлера. Они служат для численного решения обыкновенных дифференциальных уравнений и их систем. Наиболее часто реализуется и используется метод Рунге-Кутты 4 порядка точности. Построение схем более высокого порядка приводит к громоздким расчетам и сопряжено с большими вычислительными трудностями. Схема Эйлера, является представителем семейства схем Р-К. Построение схем основано на разложении функции в ряд Тейлора вблизи инвариантной точки, и взятие конечного числа членов разложения.
Пусть дана задача
Тогда приближенное решение задается формулой
Где h - величина шага сетки, а k вычисляется по формуле
…..
Метод определяется числом s и коэффициентами bi, ai,j и ci
Причем
Порядок аппроксимации (точнее порядок сходимости) определить сложно, однако можно определить количество этапов, необходимых для реализации метода.
Конкретно метод Р-К 4 для системы ДУ
имеет следующий вид.
По сути, берется значение методом Эйлера, и уточняется 3 раза. За счет этого возрастает точность вычислений, ценой вычислительных трудностей.
Для метода Рунге-Кутты 5 порядка уравнения будут такими:
Стоит сказать и об адаптивных процедурах. В ходе выполнения процедуры, шаг, для достижения необходимой точности в следующей точке, выбирается автоматически.
Метод Рунге-Кутты-Фельберга, заключается в том, что на каждом шаге метода точность функции определяется разностью значений между результатами методов РК-4 и РК-5 (Поэтому этот метод иногда называют РК-45). Если они отличаются не более чем на е - локальную погрешность, то значение, уточненное по Рунге, считается приближенным значением функции в точке на рассматриваемом шаге.
Реализация
Программа, реализующая адаптивную процедуру Рунге-Кутты 4 порядка. Написана программа на языке Delphi в среде Code Gear 2009
//Класс для метода Рунге-Кутты-Фельдера.
TRunge = class
private
Erange: integer; //кол-во функций в системе
Estart: TRealArr; //Начальные значения
EFirst, ELast: double; //Начальное и конечное значение по оси t
Eeps: double; //Точность
Efun: TArrfun; //Массив функций
EArr: TResArr; //Массив значений функции в точках, больше 0.
EArrNeg: TResArr; //Массив значений функции в точках, меньших 0
EGetInd: integer; //Внутренняя переменная - для быстрого поиска нужного значения
procedure SetRange(const Value: integer); virtual;//Установить количество функций в системе
function GetStart(Index: Integer): double; //Получить начальное значений для функции index
procedure SetStart(Index: Integer; const Value: double);//Установить начальное значение value для функции index
function GetRes(X: double; index: integer): double; //Узнать значение функции index в точке x
function GetResInd(X: double): TRealArr; //Узнать значение всех функций в точке x
function GetCount: integer; //Узнать общее количество точек
function GetLeftInd: integer; //Узнать номер самой левой точки в массиве
function GetRightInd: integer; //Узнать номер самой правой точки
function Value(const x: real; const y: TRealArr; const h: real): TRealArr; //Вычисление значения в следующей точке методом РК-4
function Value5(const x: real; const y: TRealArr; const h: real): TRealArr;//Вычисление значения в следующей точке методом РК-5
procedure SetEps(const Value: double); virtual; //Установить значение точности
function calc(vlast: double; veps: double): TRes; overload; virtual; //Процедура вычисления значения в точке vlast с точностью veps
public
property LeftInd: integer read GetLeftInd; //Левый индекс
property RightInd: integer read GetRightInd; // Правый индекс в массиве точек
function GetInd(v: integer; n: integer): double; //Узнать значение функции v в точке n
property Count: integer read GetCount; //Доступ к количеству точек в результате
property Arr[X: double]: TRealArr read GetResInd; default; //Доступ к значениям функции в точке x
property ArrInd[X: double; index: integer]: double read GetRes; //Доступ к значению конкретной функции index в точке x
property range: integer read Erange write SetRange; //Доступ к количеству функций
property Start[Index: integer]: double read GetStart write SetStart; //Доступ к начальным значениям
property First: double read Efirst write EFirst; //Начальное значение по оси t
property Last: double read ELast write ELast; //Конечное значение по оси t
property eps: double read EEps write SetEps; //Точность вычисления
property Fun: TarrFun read EFun write EFun;//Доступ к массиву функций
constructor Create; virtual;
function Calcat(vfirst, vlast, veps: double): boolean; //Вычислить значение на отрезке с точностью
procedure ProcessMessages;
function CheckDelat(n: integer; f: TFunReal): double; //Проверить отклонение полученной функции от реальной.
end;
Класс TGraphicsRunge = class(TRunge) нужен для изображения графика.
Классы
//Класс для исходной задачи
TProg1 = class(TRunge)
public
constructor Create; override; //В конструкторе описываем те входные данные, которые требуется использовать в конкретной задаче
end;
//Два класса для тестовых примеров
TProg2 = class(TRunge)
public
constructor Create; override;
end;
TProg3 = class(TRunge)
public
constructor Create; override;
end;
Конкретные задачи. В конструкторе определяются начальные условия.
Реализация метода Рунге-Кутты-Фельберга
//Вычисленние одного шага методом Р-К 4
function TRunge.Value(const x: real; const y: TRealArr; const h: real): TRealArr;
var i: integer; //счетчики
k: array of TRealArr;
begin
setlength(k, 4, Erange);
setLength(Result, Erange);
for i:=0 to Erange - 1 do k[0, i]:=Efun[i](x, y);
for i:=0 to Erange - 1 do k[1, i]:=Efun[i](x+h/2, inc(y,h*k[0, i]/2));
for i:=0 to Erange - 1 do k[2, i]:=Efun[i](x+h/2, inc(y,h*k[1, i]/2));
for i:=0 to Erange - 1 do k[3, i]:=Efun[i](x+h, inc(y,h*k[2, i]));
for i:=0 to Erange - 1 do result[i]:=y[i]+h*(k[0, i] + 2* k[1, i]+ 2*k[2, i]+ k[3, i])/6;
end;
function TRunge.Value5(const x: real; const y: TRealArr; const h: real): TRealArr;
var i: integer; //счетчики
k: array of TRealArr;
begin
setlength(k, 6, Erange);
setLength(Result, Erange);
for i:=0 to Erange - 1 do begin
k[0, i]:=EFun[i](x, y);
k[1, i]:=EFun[i](x + 1/4*h, inc(y, h*k[0,i]/4));
k[2, i]:=EFun[i](x + 3/8*h, inc(y, h*(3/32*k[0,i] + 9/32*k[1,i])));
k[3, i]:=EFun[i](x + 12/13*h, inc(y, h*(1932/2197*k[0,i] - 7200/2197*k[1,i] + 7296/2197*k[2,i])));
k[4, i]:=EFun[i](x + h, inc(y, h*(439/216*k[0,i] - 8*k[1,i] + 3680/513*k[2,i] - 845/4104*k[3,i])));
k[5, i]:=EFun[i](x + h/2, inc(y, h*(- 8/27*k[0,i] + 2*k[1,i] - 3544/2565*k[2,i] + 1859/4104*k[3,i] - 11/40*k[4,i])));
result[i] :=y[i] + h*(16/135*k[0,i] + 6656/12825*k[2,i] + 28561/56430*k[3,i] +2/55*k[4,i]-9/50*k[5,i]);
end;
end;
//Проверка,
function checkeps(const a,b: TRealArr): double;
var i: integer;
begin
if length(a) <> length(b) then raise Exception.Create('Неверная длина массива. calc.CheckEps: a-'+inttostr(length(a))+', b-'+inttostr(length(b)));
result:=abs(a[0]-b[0]);
for i := 1 to high(a) do result:=max(result, abs(a[i] - b[i]));
end;
//Выполнение одного шага, со всеми проверками
function TRunge.calc(vlast, veps: double): TRes;
var
h, hmin: double;
Arr: PResArr;
procedure Step;
var tmp, tmp2: TRes;
i: integer;
delta: double;
begin
//Текущее значение функции
tmp.arr:=value(Arr^[High(Arr^)].x,Arr^[High(Arr^)].arr,h);
tmp.x:=Arr^[High(Arr^)].x+h;
tmp2.arr:=value5(Arr^[High(Arr^)].x,Arr^[High(Arr^)].arr,h);
tmp2.x:=tmp.x;
//Если функция по точности нам подходит
delta:=checkeps(tmp2.arr,tmp.Arr)*abs(ELast-EFirst)/abs(hmin);
if delta < Eeps then begin
hmin:=min(hmin, abs(h));
//То добавляем её в результрующий массив
setlength(Arr^, length(Arr^)+1);
setlength(Arr^[High(Arr^)].Arr, Erange);
for i := 0 to Erange-1 do
Arr^[High(Arr^)].Arr[i]:=tmp.arr[i];
Arr^[High(Arr^)].x:=tmp2.x;
//Если точность хорошая, то увеличиваем длину шага
if delta < Eeps/1000 then
h:=2*h;
end else //Если точность не достигнута, то уменьшаем шаг
h:=h/2;
end;
begin
Last:=vlast;
if veps > 0 then
Eeps:=veps;
h:=(Elast-Efirst)/10;
hmin:=abs(h);
if Elast > EFirst then begin
Arr:=@Earr;
while Arr^[High(Arr^)].x < last do begin
step;
end
end else begin
Arr:=@EarrNeg;
while Arr^[High(Arr^)].x > last do begin
step;
end;
end;
result:=Arr^[High(Arr^)];
end;
В связи с некоторыми особенностями реализации и использованием сторонних компонентов построение фазового портрета в системе координат y(x) для поставленной задачи занимает продолжительное время. Тесты
Для задачи 1:
Решением которой будет функция y(x) = sin(x)
Для задачи 2:
Решением этой задачи коши будет функция y(x) = ex+ 1
Исходная задача
Анализ методов
Далее я хочу сравнить несколько адаптивных процедур Рунге-Кутты.
Сравниваются такие методы:
Метод РК-4 с автоматическим выбором шага
Метод РК-5 с автоматическим выбором шага
Метод РК-45
Сравнение будет проводиться на трех тестах.
a)На задаче
Решением которой будет функция y(x) = sin(x)
b) На задаче
Решением этой задачи коши будет функция y(x) = ex+ 1
c) и на исходной задаче.
Целью является выяснить коэффициент, в зависимости от которого следует увеличивать шаг, чтобы достичь лучшей скорости вычисления.
Проблема есть и в функции, для перевода глобальной погрешности в локальную. Проблема актуальна, так как для неадаптивной процедуры этим коэффициентом будет ширина шага. Для адаптивной процедуры ширина шага, как таковая не определена, так как шаг переменный. Здесь этим коэффициентом принята величина, равная отношению длины отрезка к ширине наименьшего из сделанных шагов.
Задача а)
Решением которой будет функция y(x) = sin(x)
Для начала определим наилучший коэффициент, при котором следует увеличивать шаг. Для этого сравним времена вычислений каждой функции на отрезке (-3, 3) с точностью 0,01. В таблицу вынесены основные тесты.
Задача |
Коэф. |
Рунге-Кутты 4 |
Рунге-Кутты 5 |
Рунге-Кутты-Фельберга |
|
Задача А |
10 |
4 ms |
2 ms |
8 ms |
|
100 |
3 ms |
2 ms |
7 ms |
||
1000 |
2 ms |
2 ms |
8ms |
||
10000 |
2 ms |
1 ms |
7 ms |
||
Задача B |
10 |
24ms |
29 ms |
20 ms |
|
100 |
10 ms |
13 ms |
20 ms |
||
1000 |
1 ms |
13 ms |
20 ms |
||
10000 |
1 ms |
13 ms |
20 ms |
||
Задача C |
10 |
26 ms |
21 ms |
95 ms |
|
100 |
25 ms |
10 ms |
100 ms |
||
1000 |
25 ms |
10 ms |
95 ms |
||
10000 |
25 ms |
10 ms |
101 ms |
Результаты на относительно малом отрезке при достаточно больших значениях коэффициента отличаются не более чем на 2 ms. Так же зависит и вида функции. Актуальнее всего брать коэффициент 1000 для метода Р-К4.
Для метода РК-5 этот коэффициент особой роли не играет, в связи с этим был проведен эксперимент, в основе которого лежит то, что шаг не может увеличиваться. И на данных тестах результаты не изменились. Это говорит о том, что тестируемые функции имеют очень мало участков с достаточно маленькой производной. На экспоненте метод РК-5 проявил себя не очень хорошо.
Про метод РКФ стоит сказать отдельно. Если в РК4 и РК5 на каждом шаге делалось уточнение по Рунге, то в РК-45 этого сделать нельзя. Так же на каждом шаге производится сравнение разности значений с локальной погрешностью, а не её оценка по правилу Рунге, что тоже повышает точность метода (из-за 2 в степени порядок точности). Так же было замечено, что использование методов РК-4 и РК-5 на больших отрезках на задаче 2 занимают гораздо больше времени, чем использование метода РКФ
Отмечу еще, что мною не была обнаружена явная связь между локальной погрешностью и глобальной. Иными словами не существует гарантий, что метод с заданной точностью достигнет этой точности.
Для этого был проведен еще один эксперимент. В таблице приведены скорости вычислений значений и практическая погрешность. По понятным причинам эксперимент проводился на 2 задачах. На отрезке [-5,5] была задана точность вычисления 0,01, а на отрезке [-1,1] - 0,0001.
Задача |
Отрезок |
Рунге-Кутты 4 |
Рунге-Кутты 5 |
Рунге-Кутты-Фельберга |
|
Задача А |
х?[-5,5] |
4 ms 0,18970 |
4ms 0,3577 |
15 ms 0,04494 |
|
х?[-1,1] |
520 ms 0,001435 |
12 ms 0,0064 |
57 ms 0,000698 |
||
Задача B |
х?[-5,5] |
1 ms 0,1259… |
1 ms 0,228 |
23 ms 5 разрядов |
|
х?[-1,1] |
1 ms 5 разрядов |
3 ms 0,0008 |
82 ms 11 разрядов |
Из этой таблицы видно, что метод Рунге-Кутты-Фельберга гораздо точнее, чем два других метода. Так что в следующей таблице приведены результаты вычислений каждым из методов с некоторым изменением. В методах РК-4 и РК-5 проверка достижения точности на каждом шаге оценивается не локальной погрешностью по Рунге, а разностью значений между результатами функций с разными шагами.
Таким образом, была повышена локальная точность.
Задача |
Отрезок |
Рунге-Кутты 4 |
Рунге-Кутты 5 |
Рунге-Кутты-Фельберга |
|
Задача А |
х?[-5,5] |
68 ms 0,0106 |
98ms 0,01107 |
15 ms 0,04494 |
|
х?[-1,1] |
269 ms 0,000207 |
404 ms 0,00019 |
57 ms 0,000698 |
||
Задача B |
х?[-5,5] |
1 ms 0,004006 |
7 ms 0,06 |
23 ms 5 разрядов |
|
х?[-1,1] |
1 ms 5 разрядов |
71 ms 0,00053 |
82 ms 11 разрядов |
эйлер рунге адаптивный аппроксимация
На первой задаче метод РК-45 работает гораздо быстрее двух других методов, однако его точность меньше. На второй задаче обратный результат.
Время вычисления методами РК-4 и РК-5 больше, чем у РКФ, так как на каждом шаге «простой» процедуры помимо вычисления следующего значения, делается пересчет, и в сумме процедура выполняется 3 раза, в то время как в методе РК-45 выполняется вычисление значения методами РК-4 и РК-5 - то есть 2 раза.
У методов РК-4 и РК-5 есть очевидный плюс - пересчет по правилу Рунге, который, как выяснилось и подтвердилось экспериментами, играет очень большую роль.
Размещено на Allbest.ru
...Подобные документы
Изучение методов Рунге-Кутты четвертого порядка с автоматическим выбором длины шага интегрирования для решения дифференциальных уравнений. Оценка погрешности и сходимость методов, оптимальный выбор шага. Листинг программы для ЭВМ, результаты, иллюстрации.
курсовая работа [2,9 M], добавлен 14.09.2010Основные методы Рунге-Кутта: построение класса расчетных формул. Расчетная формула метода Эйлера. Получение различных методов Рунге-Кутта с погрешностью второго порядка малости при произвольном задавании параметров. Особенности повышения порядка точности.
реферат [78,4 K], добавлен 18.04.2015Аналитическое и компьютерное исследования уравнения и модели Ван-дер-Поля. Сущность и особенности применения методов Эйлера и Рунге-Кутта 4 порядка. Сравнение точности метода Эйлера и Рунге-Кутта на одном графике, рисуя фазовые траектории из 1 точки.
курсовая работа [341,7 K], добавлен 06.10.2012Теоретическое обоснование расчетных формул. Задача Коши для дифференциального уравнения первого порядка. Метод Рунге-Кутта. Ломаная Эйлера. Построение схем различного порядка точности. Выбор шага. Апостериорная оценка погрешности. Правило Рунге.
курсовая работа [111,1 K], добавлен 13.11.2011Общая характеристика и особенности двух методов решения обычных дифференциальных уравнений – Эйлера первого порядка точности и Рунге-Кутта четвёртого порядка точности. Листинг программы для решения обычного дифференциального уравнения в Visual Basic.
курсовая работа [1,1 M], добавлен 04.06.2010Составление диагональной системы способом прогонки, нахождение решения задачи Коши для дифференциального уравнения на сетке методом Эйлера и классическим методом Рунге-Кутта. Построение кубического сплайна интерполирующей функции равномерного разбиения.
практическая работа [46,1 K], добавлен 06.06.2011Численное решение уравнения методом Эйлера и Рунге-Кутта в Excel. Программа на языке Turbo Pascal. Блок-схема алгоритма. Метод Рунге-Кутта для дифференциального уравнения второго порядка. Модель типа "хищник-жертва" с учетом внутривидового взаимодействия.
курсовая работа [391,5 K], добавлен 01.03.2012Получение точного решения дифференциального уравнения вручную, операторным методом, приближенное решение с помощью рядов (до 5 элемента ряда) на заданном интервале, графическое решение. Относительная и абсолютная погрешность методов Эйлера и Рунге-Кутты.
курсовая работа [990,8 K], добавлен 17.07.2014Практическое решение дифференциальных уравнений в системе MathCAD методами Рунге—Кутты четвертого порядка для решения уравнения первого порядка, Булирша — Штера - системы обыкновенных дифференциальных уравнений первого порядка и Odesolve и их графики.
лабораторная работа [380,9 K], добавлен 23.07.2012Решение задачи Коши для дифференциального уравнения. Погрешность приближенных решений. Функция, реализующая явный метод Эйлера. Вычисление погрешности по правилу Рунге. Решение дифференциальных уравнений второго порядка. Условие устойчивости для матрицы.
контрольная работа [177,1 K], добавлен 13.06.2012Метод Гаусса, метод прогонки, нелинейное уравнение. Метод вращения Якоби. Интерполяционный многочлен Лагранжа и Ньютона. Метод наименьших квадратов, интерполяция сплайнами. Дифференцирование многочленами, метод Монте-Карло и Рунге-Кутты, краевая задача.
курсовая работа [4,8 M], добавлен 23.05.2013Задачи Коши и методы их решения. Общие понятия, сходимость явных способов типа Рунге-Кутты, практическая оценка погрешности приближенного решения. Автоматический выбор шага интегрирования, анализ брюсселятора и метод Зонневельда для его расчета.
курсовая работа [1,7 M], добавлен 03.11.2011Розгляд найбільш відомих скінченно-різнецевих методів рішення рівнянь руху з непереривною силою: чисельна ітерація рівнянь Ньютона; алгоритм Бімана і Шофілда; метод Рунге-Кутта; методи Адамса, Крилова, Чаплигіна. Програма Рунге-Кутта на мові С#.
курсовая работа [359,5 K], добавлен 27.01.2011Умови та особливості використання модифікованого методу Ейлера для отримання другої похідної в кінцево-різницевій формі. Два обчислення функції за крок. Метод Ейлера-Коші як частковий випадок методу Рунге-Кутта. Метод четвертого порядку точності.
презентация [171,0 K], добавлен 06.02.2014Вычисление производной по ее определению, с помощью конечных разностей и на основе первой интерполяционной формулы Ньютона. Интерполяционные многочлены Лагранжа и их применение в численном дифференцировании. Метод Рунге-Кутта (четвертого порядка).
реферат [71,6 K], добавлен 06.03.2011Описание метода сведения краевой задачи к задаче Коши. Решение системы из двух уравнений с четырьмя неизвестными. Метод Рунге-Кутта. Расчет максимальной погрешности и выполнение проверки точности. Метод конечных разностей. Описание полученных результатов.
курсовая работа [245,2 K], добавлен 10.07.2012Крайова задача для звичайного диференціального рівняння. Метод Рунге-Кутта, метод прогнозу і корекції та метод кінцевих різниць для розв’язання лінійних крайових задач. Реалізація пакетом Maple. Оцінка похибки й уточнення отриманих результатів.
контрольная работа [340,6 K], добавлен 14.08.2010Формирование системы их пяти уравнений по заданным параметрам, ее решение методом Гаусса с выбором главного элемента. Интерполяционный многочлен Ньютона. Численное интегрирование. Решение нелинейных уравнений. Метод Рунге-Кутта четвертого порядка.
контрольная работа [115,5 K], добавлен 27.05.2013Моделирование как метод познания. Классификаций и характеристика моделей: вещественные, энергетические и информационные. Математическая модель "хищники-жертвы", ее сущность. Порядок проверки и корректировки модели. Решение уравнений методом Рунге-Кутта.
методичка [283,3 K], добавлен 30.04.2014Градиентные уравнения и уравнения в вариациях, функционалы метода наименьших квадратов. Численное решение градиентных уравнений: полиномиальные системы, метод рядов Тейлора и метод Рунге-Кутта. Числовые модели осциллирующих процессов в живой природе.
реферат [221,4 K], добавлен 10.08.2010