Метод Рунге-Кутта решения дифференциальных уравнений и их систем
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Метод Рунге-Кутта решения дифференциальных уравнений и их систем
Метод позволяет решать системы обыкновенных дифференциальных уравнений (ОДУ) первого порядка следующего вида:
,
,
и т.д.,
которые имеют решение:
,
,
и т.д.,
где t – независимая переменная (например, время); X, Y и т.д. – искомые функции (зависимые от t переменные). Функции f, g и т.д. – заданы. Также предполагаются заданными и начальные условия, т.е. значения искомых функций в начальный момент.
Одно дифференциальное уравнение – частный случай системы с одним элементом. Поэтому, далее речь пойдет для определенности о системе уравнений.
Метод может быть полезен и для решения дифференциальных уравнений высшего (второго и т.д.) порядка, т.к. они могут быть представлены системой дифференциальных уравнений первого порядка.
Метод Рунге-Кутта заключается в рекурентном применении следующих формул:
.
где
,
,
,
,
,
,
,
Реализация Метода Рунге-Кутта на Delphi может выглядеть так (привожу полностью модуль):
type
TVarsArray = array of Extended; // вектор переменных включая независимую
TInitArray = array of Extended; // вектор начальных значений
TFunArray = array of function(VarsArray: TVarsArray ):Extended;
// вектор функций
TResArray = array of array of Extended; // матрица результатов
TCoefsArray = array of Extended; // вектор коэффициетов метода
function Runge_Kutt( // метод Рунге-Кутта
FunArray: TFunArray; // массив функций
First: Extended; // начальная точка по независимой координате
Last: Extended; // конечная точка по независимой координате
Steps: Integer; // число шагов по независимой координате
InitArray: TInitArray; // вектор начальных значений
var Res: TResArray // матрица результатов включая независ. переменную
):Word;
// возвращаемое значение — код ошибки
implementation
Function Runge_Kutt( // метод Рунге-Кутта
FunArray: TFunArray; // массив функций
First: Extended; // начальная точка по независимой координате
Last: Extended; // конечная точка по независимой координате
Steps: Integer; // число шагов по независимой координате
InitArray: TInitArray; // вектор начальных значений
var Res: TResArray // матрица результатов включая независ. переменную
):Word; // возвращаемое значение — код ошибки
var
Num: Word; // число уравнений
NumInit: Word; // число начальных условий
Delt: Extended; // шаг разбиения
Vars: TVarsArray; // вектор переменных включая независимую
Vars2,Vars3,Vars4: TVarsArray; // значения перем. для 2-4 коэф.
Coefs1: TCoefsArray; // вектор 1-ыx коэффициентов в методе
Coefs2: TCoefsArray; // вектор 2 коэффициентов в методе
Coefs3: TCoefsArray; // вектор 3 коэффициентов в методе
Coefs4: TCoefsArray; // вектор 4 коэффициентов в методе
I: Integer; // счетчик цикла по иттерациям
J: Word; // индекс коэф.-тов метода
K: Integer; // счетчик прочих циклов
begin
Num:=Length(FunArray); // узнаем число уравнений
NumInit:=Length(InitArray); // узнаем число начальных условий
If NumInit<>Num then
begin
Result:=100; // код ошибки 100: число уравнений не равно числу нач. усл.
Exit;
end;
Delt:=(Last-First)/Steps; // находим величину шага разбиений
SetLength(Res,Num+1,Steps+1); // задаем размер матрицы ответов с незав. перем.
SetLength(Vars,Num+1); // число переменных включая независимую
SetLength(Vars2,Num+1); // число переменных для 2-го коэф. включая независимую
SetLength(Vars3,Num+1); // число переменных для 3-го коэф. включая независимую
SetLength(Vars4,Num+1); // число переменных для 4-го коэф. включая независимую
SetLength(Coefs1,Num); // число 1-ыx коэф. метода по числу уравнений
SetLength(Coefs2,Num); // число 2-ыx коэф. метода по числу уравнений
SetLength(Coefs3,Num); // число 3-иx коэф. метода по числу уравнений
SetLength(Coefs4,Num); // число 4-ыx коэф. метода по числу уравнений
// Начальные значения переменных:
Vars[0]:=First;
For K:=0 to NumInit-1 do Vars[K+1]:=InitArray[K];
For J:=0 to Num do Res[J,0]:=Vars[J]; // первая точка результата
For I:=0 to Steps-1 do // начало цикла иттераций
begin
For J:=0 to Num-1 do Coefs1[J]:=FunArray[J](Vars)*delt; // 1-й коэфф.
// Находим значения переменных для второго коэф.
Vars2[0]:=Vars[0]+delt/2;
For K:=1 to Num do Vars2[K]:=Vars[K]+Coefs1[K-1]/2;
For J:=0 to Num-1 do Coefs2[J]:=FunArray[J](Vars2)*delt; // 2-й коэф.
// Находим значения переменных для третьго коэф.
Vars3[0]:=Vars[0]+delt/2;
For K:=1 to Num do Vars3[K]:=Vars[K]+Coefs2[K-1]/2;
For J:=0 to Num-1 do Coefs3[J]:=FunArray[J](Vars3)*delt; // 3 коэфф.
// Находим значения переменных для 4 коэф.
Vars4[0]:=Vars[0]+delt;
For K:=1 to Num do Vars4[K]:=Vars[K]+Coefs3[K-1];
For J:=0 to Num-1 do Coefs4[J]:=FunArray[J](Vars4)*delt; // 4 коэфф.
// Находим новые значения переменных включая независимую
Vars[0]:=Vars[0]+delt;
For K:=1 to Num do
Vars[K]:=Vars[K]+(1/6)*(Coefs1[K-1]+2*(Coefs2[K-1]+Coefs3[K-1])+Coefs4[K-1]);
// Результат иттерации:
For J:=0 to Num do Res[J,I+1]:=Vars[J];
end; // конец итераций
Result:=0; // код ошибки 0 — нет ошибок
end;
Модуль полностью работоспособен. Возвращаемое функцией Runge_Kutt значение – код ошибки. Вы можете дополнить список ошибок по своему усмотрению. Рассчитанные функции системы помещаются в массив Res. Чтобы не загромождать код, в модуле опущены проверки (типа блоков try). Рекомендую их добавить по своему усмотрению.
Ниже приводится описание функции Runge_Kutt и типов, использующихся в модуле.
Function Runge_Kutt (FunArray: TFunArray; First: Extended; Last: Extended; Steps: Integer; InitArray: TInitArray; var Res: TResArray):Word;
Здесь:
FunArray — вектор функций (правых частей уравнений системы);
First, Last — начальная и конечная точки расчетного интервала;
Steps — число шагов по расчетному интервалу;
InitArray — вектор начальных значений
Res — матрица результатов включая независимую переменную.
В модуле описаны типы:
type
TVarsArray = array of Extended; // вектор переменных включая независимую
TInitArray = array of Extended; // вектор начальных значений
TFunArray = array of function(VarsArray: TVarsArray ):Extended; // вектор функций
TResArray = array of array of Extended; // матрица результатов
TCoefsArray = array of Extended; // вектор коэффициетов метода
Функция возвращает коды ошибок:
0 – нет ошибок;
100 — число уравнений не равно числу начальных условий.
Решение содержится в переменной-матрице Res. Первый индекс матрицы относится к переменной (0 – независимая переменная, 1 – первая зависимая и т.д.), второй – к номеру расчетной точки (0 – начальная точка).
Рассмотрим один пример использования модуля. Создадим новое приложение и подключим к нему модуль. На форме приложения разместим кнопку Button1 и область текста Memo1. Поместим в приложение две функции и обработчик нажатия кнопки:
//Задаем функции (правые части уравнений)
function f0(VarArray:TVarsArray):extended;
begin
Result:=4*VarArray[0]*VarArray[0]*VarArray[0];
end;
function f1(VarArray:TVarsArray):extended;
begin
Result:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
FunArray: TFunArray; // массив функций
First: Extended; // начальная точка по независимой координате
Last: Extended; // конечная точка по независимой координате
Steps: Integer; // число шагов по независимой координате
InitArray: TInitArray; // вектор начальных значений
Res: TResArray; // матрица результатов включая независ. переменную
begin // Создаем вектор функций:
SetLength(FunArray,2);
FunArray[0]:=f0;
FunArray[1]:=f1;
// Задаем интервал и число шагов:
First:=0;
Last:=10;
Steps:=10;
// Задаем начальные условия:
SetLength(InitArray,2);
InitArray[0]:=0;
InitArray[1]:=0;
// Вызов метода и получение результатов:
Memo1.Lines.Clear;
I:=Runge_Kutt(FunArray, First, Last, Steps, InitArray, Res);
ShowMessage(‘Код ошибки = ‘+IntToStr(I));
For I:=0 to Steps do
Memo1.Lines.Add(floattostr(Res[0,I])+’ ‘+floattostr(Res[1,I])+’ ‘+floattostr(Res[2,I]));
end;
Модуль с примером и справкой можно скачать: русский вариант (бесплатно) или английский вариант (условно-бесплатно).
Copyright© 2006 Андрей Садовой Специально для Delphi Plus
Курсовая работа: Программа для решения дифференциальных уравнений первого порядка методом Рунге-Кутта
Название: Программа для решения дифференциальных уравнений первого порядка методом Рунге-Кутта Раздел: Рефераты по информатике, программированию Тип: курсовая работа Добавлен 21:04:57 05 апреля 2011 Похожие работы Просмотров: 3135 Комментариев: 20 Оценило: 4 человек Средний балл: 5 Оценка: неизвестно Скачать |
1. Решение дифференциальных уравнений
Пусть дано дифференциальное уравнение первого порядка:
и начальное условие его решения:
Тогда решить уравнение — это значит найти такую функцию у — φ(х), которая, будучи подставленной, в исходное уравнение, обратит его в тождество и одновременно будет удовлетворено начальное условие. Задача отыскания функции у = φ (х) называется в математике задачей Коши. При решении дифференциального уравнения порядка nзадача Коши формулируется следующим образом.
Дано дифференциальное уравнение порядка n:
у ( n ) = f(x, y, у’ ’ ,…,y n -1 )
Необходимо найти такую функцию у = φ (х), которая, будучи подставленной в исходное уравнение, обратит его в тождество и одновременно будут удовлетворены следующие п начальных условий:
4.1 Метод Рунге-Кутта
Метод Рунге-Кутта обладает более высокой точностью, чем методы Эйлера за счет снижения методических ошибок. Идея метода состоит в следующем.
По методу Эйлера решение дифференциального уравнения первого порядка определяется из соотношения:
Тогда приращение Δ yi , может быть найдено путем интегрирования:
Вычислим теперь интеграл по методу прямоугольников:
Из полученного выражения видно, что вычисление интеграла по методу прямоугольников приводит к формуле Эйлера.
Вычислим интеграл по формуле трапеций:
Из выражения видно, что оно совпадает с расчетной формулой усовершенствованного метода Эйлера-Коши. Для получения более точного решения дифференциального уравнения следует воспользоваться более точными методами вычисления интеграла. В методе Рунге-Кутта искомый интеграл представляется в виде следующей конечной суммы:
где Pi— некоторые числа, зависящие от q; Ki (h) — функции, зависящие от вида подынтегральной функции f(x,y) и шага интегрирования h, вычисляемые по следующим формулам:
Значения p, α, β получают из соображений высокой точности вычислений. Формулы Рунге-Кутта третьего порядка (q= 3) имеют следующий вид:
Наиболее часто используется метод Рунге-Кутта четвертого порядка, для которого расчетные формулы имеют следующий вид:
Формулы Рунге-Кутта имеют погрешности порядка h q +1 . Погрешность метода Рунге-Кутта четвертого порядка имеет порядок h 5
4.2 Описание программы ” РЕШЕНИЕ ОДУ “
Программа ”Решение ОДУ“ достаточно проста в использовании.
При запуске программы открывается главное окно программы (рис. 4 ), с установленными по умолчанию начальными условиями в полях ввода.
Назначение элементов ввода данных.
1. Поля X 1, X 2, Y ( x 1), H предназначены для ввода начального и конечного значений отрезка, на котором ищется решение дифференциального уравнения, значения функции при аргументе равном Х1 и величины шага дифференцирования;
2. В поле dY выводится формула дифференциального уравнения 1-й степени, выбранная для решения;
3. В поле dY ( x 1, y 1) выводится значение производной в исходной точке.
Назначение элементов управления и контроля.
1. При нажатии кнопки EXAMPLE активируются “радиокнопки” выбора уравнений;
2. Щелчком “радиокнопки” выбирается соответствующее ей уравнение, вид формулы контролируется по её отображению в поле dY ;
3. Щелчком по кнопке ВЫЧИСЛИТЬ находятся приближенные решения выбранного дифференциального уравнения на заданном интервале;
4. Решения дифференциального уравнения в виде пар значений X — Y выводятся в поля X и Y ; (рис. 5.)
По окончании вычислений активируются кнопка ГРАФИК и пункт меню ГРАФИК главного окна системы.
4.3 Назначение элементов графического окна программы
Вход в графическое окно осуществляется с помощью кнопок ГРАФИК наглавной формеили пункт меню ГРАФИК (рис. 6).
С помощью кнопки ВЫЧЕРТИТЬ на координатную плоскость выводится график функции – решение дифференциального уравнения на заданном интервале.
4.4 Реакция программы при возникновении ошибок
При вводе пользователем ошибочных данных (отсутствии начальных условий, некорректных значений переменных) программа выдает сообщение об ошибке (рис.7 а, б) рис.7 а. рис.7 б.
4.5 Перечень компонент DELPHI использованных в программе
В Form 1 использованы компоненты:
— Edit1.text, Edit2.text, Edit3.text, Edit4.text – для ввода начальных условий дифференциального
— Memo4.TMemo – для вывода формулы уравнения;
— Memo1.TMemo, Memo2.TMemo — для вывода результатов вычислений;
— Memo3.TMemo – для вывода значения производной в точке (Х0,Y0)
— ScrollBars ssVertical всвойствахMemo1.TMemo, Memo2.TMemo;
— Button1 “Вычислить”, Button2 “Очистить”, Button3 “График”, Button4 “Выход”,
Button5 “Example”, Button6 “UnExample”;
— Label1.TLabel — Label9.TLabel – дляотображенияназначениякомпонентов Memo иEdit;
— RadioGroup – для выбора вида уравнения;
В Form 2 использованы компоненты:
— MainMenu- для построения графика;
В Form 3 использованы компоненты:
— Panel1.TPanel – для размещения информации о программе;
— Label1.TLabel – Label14.TLabel – для отображения информации о программе;
— Button1.TButton “OK” – для выхода из окна
5. ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ И ТРЕБОВАНИЯ К ПО
Программа работает в среде операционных систем Windows 9х, NT.
Требования к ПО
Минимальные системные требования
aпроцессор Intel 486 с рабочей частотой 66 MHz и выше;
b) операционная система Windows 95, 98, NT 4.0, 2000, XP;
с) 16 Мбайт оперативной памяти (или более);
d) 3 Мбайт свободного пространства на жёстком диске.
6. ТЕКСТ ПРОГРАММЫ
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, CheckLst, ComCtrls, ExtCtrls,math, Menus;
Решение дифференциальных уравнений на делфи
Variant 19 (Sukach Maxim, BS17-03)
Найдем
В итоге, наше решение принимает вид:
Метод Эйлера дает возможность приближенно выразить функцию теоретически с любой наперед заданной точностью. Суть метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Метод Эйлера является методом 1-го порядка точности и называется методом ломаных.
Для вычисления используются следующие формулы:
Метод Эйлера и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1
Метод Эйлера и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1
Метод Эйлера и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1
Усовершенствованный метод Эйлера
Суть усовершенствованного метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Усовершенствованный метод Эйлера является методом 2-го порядка точности и называется модифицированным методом Эйлера.
Разница между данным методом и методом Эйлера минимальна и заключается в использовании следующих формул:
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 9, y0 = 1, h = 0.1
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 3, y0 = 1, h = 0.1
Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 1, y0 = 1, h = 0.1
Классический метод Рунге-Кутты
Суть метода Рунге-Кутты в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Классический метод Рунге-Кутты является методом 4-го порядка точности и называется методом Рунге-Кутты 4-го порядка точности.
Ну и как обычно, формулы:
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1
Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1
Сравнение методов для заданной задачи
Размер ошибки всех методов на промежутке [0, 9] с шагом 0.1
Размер ошибки всех методов на промежутке [0, 3] с шагом 0.1
Размер ошибки всех методов на промежутке [0, 1] с шагом 0.1
Очевидно что, классический метод Рунге-Кутты справляется с задачей аппроксимации в случае данного уравнения намного лучше чем Метод Эйлера и Усовершенствованный метод Эйлера.
График глобальной средней ошибки
Глобальная ошибка в зависимости от размера шага H на промежутке от 0.01 до 0.91 для x0 = 1, xf = 9
http://www.bestreferat.ru/referat-210287.html
http://github.com/mdmxfry/DE-methods