Реализация метода Рунге-Кутты-Фельберга на языке программирования 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.