Реализация метода Рунге-Кутты-Фельберга на языке программирования Delphi
Использование метода Рунге-Кутты-Фельберга для численного решения обыкновенных дифференциальных уравнений и их систем. Основные методы нахождения порядка аппроксимации. Внешний вид процедуры для определения номера самой левой точки в массиве данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 28.04.2014 |
Размер файла | 76,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
1. Теория
Методы Рунге-Кутты являются модифицированными методами Эйлера. Они служат для численного решения обыкновенных дифференциальных уравнений и их систем. Наиболее часто реализуется и используется метод Рунге-Кутты 4 порядка точности. Построение схем более высокого порядка приводит к громоздким расчетам и сопряжено с большими вычислительными трудностями. Схема Эйлера, является представителем семейства схем Р-К. Построение схем основано на разложении функции в ряд Тейлора вблизи инвариантной точки, и взятие конечного числа членов разложения.
Пусть дана задача:
.
Тогда приближенное решение задается формулой:
,
где h - величина шага сетки, а kвычисляется по формуле:
.
.
.
Метод определяется числомs и коэффициентами bi,ai,jи ci
Причем:
.
Порядок аппроксимации (точнее порядок сходимости) определить сложно, однако можно определить количество этапов, необходимых для реализации метода.
.
Конкретно метод Р-К 4 для системы ДУ
.
имеет следующий вид.
.
.
.
.
.
По сути, берется значение методом Эйлера, и уточняется 3 раза. За счет этого возрастает точность вычислений, ценой вычислительных трудностей.
Для метода Рунге-Кутты 5 порядка уравнения будут такими:
.
.
.
.
.
.
.
Стоит сказать и об адаптивных процедурах. В ходе выполнения процедуры, шаг, для достижения необходимой точности в следующей точке, выбирается автоматически.
Метод Рунге-Кутты-Фельберга, заключается в том, что на каждом шаге метода точность функции определяется разностью значений между результатами методов РК-4 и РК-5 (Поэтому этот метод иногда называют РК-45). Если они отличаются не более чем на е - локальную погрешность, то значение, уточненное по Рунге, считается приближенным значением функции в точке на рассматриваемом шаге.
2. Реализация
Программа, реализующая адаптивную процедуру Рунге-Кутты 4 порядка. Написана программа на языке Delphi в среде CodeGear 2009
//Класс для метода Рунге-Кутты-Фельдера.
TRunge = class
private
Erange: integer; //кол-вофункцийвсистеме
Estart: TRealArr; //Начальные значения
EFirst, ELast: double; //Начальное и конечное значение по оси t
Eeps: double; //Точность
Efun: TArrfun; //Массив функций
EArr: TResArr; //Массив значений функции в точках, больше 0.
EArrNeg: TResArr; //Массив значений функции в точках, меньших 0
EGetInd: integer; //Внутренняя переменная - для быстрого поиска нужного значения
procedureSetRange(constValue: integer); virtual;//Установить количество функций в системе
functionGetStart(Index: Integer): double; //Получить начальное значений для функции index
procedureSetStart(Index: Integer; constValue: double);//Установить начальное значение value для функции index
functionGetRes(X: double; index: integer): double; //Узнать значение функции index в точке x
functionGetResInd(X: double): TRealArr; //Узнать значение всех функций в точке x
functionGetCount: integer; //Узнать общее количество точек
functionGetLeftInd: integer; //Узнать номер самой левой точки в массиве
functionGetRightInd: integer; //Узнать номер самой правой точки
functionValue(constx: real; consty:TRealArr; consth: real):TRealArr; // Вычисление значения в следующей точке методом РК-4
functionValue5(constx: real; consty:TRealArr; consth: real):TRealArr;//Вычисление значения в следующей точке методом РК-5
procedureSetEps(constValue: double); virtual; //Установить значение точности
functioncalc(vlast: double; veps: double): TRes; overload; virtual; //Процедура вычисления значения в точке vlast с точностью veps
public
propertyLeftInd: integer read GetLeftInd; //Левыйиндекс
propertyRightInd: integer read GetRightInd; // Правый индекс в массиве точек
functionGetInd(v: integer; n: integer): double; //Узнать значение функции v в точке n
propertyCount: integerreadGetCount; //Доступ к количеству точек в результате
propertyArr[X: double]: TRealArrread GetResInd; default; //Доступ к значениям функции в точке x
propertyArrInd[X: double; index: integer]: double read GetRes; //Доступ к значению конкретной функции index в точке x
propertyrange: integer read Erangewrite SetRange; //Доступкколичествуфункций
propertyStart[Index: integer]: double readGetStartwriteSetStart; //Доступ к начальным значениям
property First: double readEfirstwriteEFirst; //Начальное значение по оси t
property Last: double readELastwriteELast; //Конечное значение по оси t
propertyeps: double readEEpswriteSetEps; //Точность вычисления
property Fun: TarrFunreadEFunwriteEFun;// Доступ к массиву функций
constructorCreate;virtual;
functionCalcat(vfirst, vlast, veps: double): boolean; //Вычислить значение на отрезке с точностью
procedureProcessMessages;
functionCheckDelat(n: integer; f: TFunReal): double; //Проверить отклонение полученной функции от реальной.
end;
Класс TGraphicsRunge = class(TRunge) нужен для изображения графика.
//Класс для исходной задачи
TProg1 = class(TRunge)
public
constructorCreate; override; //В конструкторе описываем те входные данные, которые требуется использовать в конкретной задаче
end;
//Два класса для тестовых примеров
TProg2 = class(TRunge)
public
constructor Create; override;
end;
TProg3 = class(TRunge)
public
constructor Create; override;
end;
Конкретные задачи. В конструкторе определяются начальные условия.
Реализация метода Рунге-Кутты-Фельберга
// Вычисление одного шага методом Р-К 4
functionTRunge.Value(const x: real; const y: TRealArr; const h: real): TRealArr;
var i: integer; //счетчики
k: arrayofTRealArr;
begin
setlength(k, 4, Erange);
setLength(Result, Erange);
for i:=0 toErange - 1 do k[0, i]:=Efun[i](x, y);
for i:=0 toErange - 1 do k[1, i]:=Efun[i](x+h/2, inc(y,h*k[0, i]/2));
for i:=0 toErange - 1 do k[2, i]:=Efun[i](x+h/2, inc(y,h*k[1, i]/2));
for i:=0 toErange - 1 do k[3, i]:=Efun[i](x+h, inc(y,h*k[2, i]));
for i:=0 toErange - 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 toErange - 1 dobegin
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;
//Проверка,
functioncheckeps(consta,b: TRealArr): double;
var i: integer;
begin
if length(a) <> length(b) then raiseException.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;
//Выполнение одного шага, со всеми проверками
functionTRunge.calc(vlast, veps: double): TRes;
var
h, hmin: double;
Arr: PResArr;
procedure Step;
vartmp, 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 <Eepsthenbegin
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/1000then
h:=2*h;
endelse //Если точность не достигнута, то уменьшаем шаг
h:=h/2;
end;
begin
Last:=vlast;
ifveps> 0 then
Eeps:=veps;
h:=(Elast-Efirst)/10;
hmin:=abs(h);
ifElast>EFirstthenbegin
Arr:=@Earr;
whileArr^[High(Arr^)].x < last dobegin
step;
end
endelsebegin
Arr:=@EarrNeg;
whileArr^[High(Arr^)].x > last dobegin
step;
end;
end;
result:=Arr^[High(Arr^)];
end;
дифференциальный аппроксимация массив численный
В связи с некоторыми особенностями реализации и использованием сторонних компонентов построение фазового портрета в системе координат y(x) для поставленной задачи занимает продолжительное время.
Размещено на Allbest.ru
...Подобные документы
Реализация решения обыкновенных дифференциальных уравнений 1-го и 2-го порядка методом Рунге-Кутты. Построение на ЭВМ системы отображения результатов в табличной форме и в виде графика. Архитектура и требования к разрабатываемым программным средствам.
курсовая работа [2,7 M], добавлен 05.11.2011Решение системы обыкновенных дифференциальных уравнений в программе Matlab. Применение метода Рунге–Кутты. Априорный выбор шага интегрирования. Построение трехмерного графика движения точки в декартовой системе координат и создание видеофайла формата AVI.
контрольная работа [602,8 K], добавлен 04.05.2015Обыкновенное дифференциальное уравнение первого порядка. Задача Коши, суть метода Рунге-Кутта. Выбор среды разработки. Программная реализация метода Рунге-Кутта 4-го порядка. Определение порядка точности метода. Применение языка программирования C++.
курсовая работа [163,4 K], добавлен 16.05.2016Опытное исследование свойств методов Рунге-Кутты. Реализация численных методов приближенного интегрирования обыкновенных дифференциальных уравнений, наиболее часто применяющихся в практике моделирования и проектирования систем автоматизации и управления.
курсовая работа [311,5 K], добавлен 05.03.2009Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений: Эйлера, Рунге-Кутта, Адамса и Рунге. Техники приближенного решения данных уравнений: метод конечных разностей, разностной прогонки, коллокаций; анализ результатов.
курсовая работа [532,9 K], добавлен 14.01.2014Анализ предметной области объектно-ориентированного программирования. Языки Delphi, Object Pascal - объектно-ориентированная среда программирования. Основные алгоритмические решения. Решение дифференциального уравнения методом Рунге-Кутта в среде Excel.
курсовая работа [1,5 M], добавлен 02.04.2011Разработка программы для решения системы обыкновенных дифференциальных уравнений на базе языка программирования Паскаль АВС. Чтение исходных данных из внешнего файла. Вывод исходных данных и результатов на дисплей и во внешний файл. Суть метода Ейлера.
реферат [126,1 K], добавлен 12.01.2012Составление программы на алгоритмическом языке Turbo Pascal. Разработка блок-схемы алгоритма её решения. Составление исходной Pascal-программы и реализация вычислений по составленной программе. Применение методов Рунге-Кутта и Рунге-Кутта-Мерсона.
курсовая работа [385,0 K], добавлен 17.09.2009Особенности метода численного интегрирования обыкновенных дифференциальных уравнений. Расчет переходного процесса в нелинейной электрической цепи, вызванного ее включением или отключением. Метод численного интегрирования Рунге-Кутта с переменным шагом.
отчет по практике [740,1 K], добавлен 10.10.2011Решение дифференциальных уравнений с использованием классических алгоритмов численных методов Эйлера и Рунге-Кутта 4-го порядка. Команды, используемые при решении обыкновенных дифференциальных уравнений в системе вычислений. Результат работы программы.
курсовая работа [226,6 K], добавлен 05.04.2013Обзор методов решения в Excel. Рекурентные формулы метода Эйлера. Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка. Метод Эйлера с шагом h/2. Решение дифференциальных уравнений с помощью Mathcad. Модифицированный метод Эйлера.
курсовая работа [580,1 K], добавлен 18.01.2011Аналитическое и численное исследование уравнения Дуффинга и его странных аттракторов. Регулярные и хаотические явления в вынужденном осцилляторе Дуффинга. Стробоскопическое исследование явления. Метод Рунге-Кутты решения дифференциальных уравнений.
дипломная работа [4,3 M], добавлен 29.06.2012Решение дифференциальных уравнений первого порядка. Варианты методов Рунге-Кутта различных порядков. Основные методы численного решения задачи Коши. Повышение точности вычислений и итерационный метод уточнения. Дискретная числовая последовательность.
лабораторная работа [33,3 K], добавлен 14.05.2012Суть метода Рунге-Кутта и его свойства. Решение дифференциальных уравнений первого порядка. Вычислительный блок Given/Odesolve. Встроенные функции rkfixed, Rkadapt, Bulstoer. Решения линейных алгебраических уравнений в среде MathCad и Microsoft Excel.
курсовая работа [1,1 M], добавлен 02.06.2014Разработка программы на языке Turbo Pascal 7.0 для преобразования кинетической схемы протекания химических реакций при изотермических условиях в систему дифференциальных уравнений. Ее решение в численном виде методом Рунге-Кутта четвертого порядка.
курсовая работа [929,7 K], добавлен 06.01.2013Разработка быстрого и эффективного алгоритма для решения задачи оценки параметров обыкновенных дифференциальных уравнений с запаздывающими аргументами, не разрешаемых аналитически. Реализация алгоритма в виде библиотеки на языке программирования MATLAB.
дипломная работа [1,6 M], добавлен 19.06.2012Анализ преимуществ и недостатков различных численных методов решения дифференциальных уравнений высших порядков. Обоснование выбора метода Рунге-Кутта четвертого порядка. Разработка программы, моделирующей физическое и математическое поведение маятника.
курсовая работа [1,6 M], добавлен 11.07.2012Изучение численных методов решения нелинейных уравнений. Построение годографа АФЧХ, графиков АЧХ и ФЧХ с указанием частот. Практическое изучение численных методов интегрирования дифференциальных уравнений высокого порядка, метод Рунге-Кутта 5-го порядка.
курсовая работа [398,3 K], добавлен 16.06.2009Принцип и значение метода Эйлера для расчета дифференциальных уравнений. Анализ его геометрического смысла. Улучшение метода за счет аппроксимации производной. Разработка блок-схем и программы на языке Turbo Pascal для проверки методов интегрирования.
курсовая работа [385,7 K], добавлен 15.06.2013Численные методы решения нелинейных уравнений, систем линейных и нелинейных алгебраических уравнений, дифференциальных уравнений, определенных интегралов. Методы аппроксимации дискретных функций и методы решения задач линейного программирования.
методичка [185,7 K], добавлен 18.12.2014