ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ……………………………………………………………….…………3
ГЛАВА I. РЕШЕНИЕ ЗАДАЧИ КОШИ ДЛЯ СИСТЕМ ДИФФЕРНЕЦИАЛЬНЫХ УРАВНЕНИЙ МЕТОДОМ РУНГЕ-КУТТА-МЕРСОНА…………………………………………………………………..………4
Постановка задачи Коши для систем обыкновенных дифференциальных уравнений………….……………..................…...4
Метод Рунге-Кутта-Мерсона………………………………………….5
1.3. Алгоритм решения задачи Коши для систем обыкновенных дифференциальных уравнений методом Рунге-Кутта-Мерсона……………….........................................................………..….7
ГЛАВА II. ВЫЧИСЛИТЕЛЬНЫЙ ЭКСПЕРЕМЕНТ………….………...…....8
2.1. Постановка задачи……………………………………………………..8
2.2. Анализ результатов……………………………………………….....…9
ЗАКЛЮЧЕНИЕ………………………………………………………………..….10СПИСОК ЛИТЕРАТУРЫ………...……………… ..........11
ПРИЛОЖЕНИЕ.......................................................................................................12
Приложение 1........................................................................................12
Приложение 2........................................................................................16
ВВЕДЕНИЕ
Обыкновенные дифференциальные уравнения широко используются для математического моделирования процессов и явлений в различных областях науки и техники. Множество переходных процессов в радиотехнике, кинетика химических реакций, динамика биологических популяций, движение космических объектов, модели экономического развития исследуются с помощью обыкновенных дифференциальных уравнений.
Актуальность темы курсовой работы состоит в том, что ОДУ имеют аналитически сложное решение и составление программы, реализируещей численное решение облегчило бы эту задачу.
В курсовой работе решается задача разработки программы поиска решения системы дифференциальных уравнений методам Рунге-Кутта-Мерсона.
Выбор метода решения системы дифференциальных уравнений объясняется тем, что метод Кутта-Мерсона сочетает хорошую точность и высокую скорость.
Цель работы: составить программу для решения задачи Коши для системы дифференциальных уравнений методом Рунге-Кутта-Мерсона на примере, проверить полученное решение в MathCad и проанализировать результаты.
ГЛАВА I. РЕШЕНИЕ ЗАДАЧИ КОШИ ДЛЯ СИСТЕМ ДИФФЕРНЕЦИАЛЬНЫХ УРАВНЕНИЙ МЕТОДОМ РУНГЕ-КУТТА-МЕРСОНА
1.1. Постановка задачи Коши для систем обыкновенных дифференциальных уравнений
Задача Коши заключается в решении систем обыкновенных дифференциальных уравнений первого порядка, представляемых в виде:
/>(1)
Где j=1/>N-номер каждой зависимой переменной yj, x-независимая переменная .
Решение системы (1) при заданных начальных условиях
x=x,
y1(x)=y10,…, (2)
y2(x)=y20,
yN(x)=yN
сводиться к нахождению зависимостей (интегральных кривых) y1(x),…,y2(x), yN(x), проходящих через точки (x,y10), (x,y20),…, (x,yN). Задача Коши сводиться к интегрированию дифференциальных уравнений. Порядок метода численного интегрирования при этом определяется и порядок метода решения.
1.2. Метод Рунге-Кутта-Мерсона
Автоматическое изменение шага в ходе решения систем дифференциальных уравнений необходимо, если решение требуется получить с заданной точностью. При высокой точности (погрешность />) и решении в виде кривых с сильно различающейся крутизной автоматическое изменение шага обеспечивает уменьшение общего числа шагов в несколько раз, резко уменьшается вероятность числовой неустойчивости, даёт более равномерное расположение точек графика кривых (решений) при их выводе на печать. Данный метод обеспечивает приближённую оценку погрешностей на каждом шаге интегрирования. Погрешность интегрирования имеет порядокh5. Этот метод реализуется следующим алгоритмом: Задаём число уравнений N, погрешность ε=E, начальный шаг интегрирования h=Hи начальное значение y10,…,yN0. С помощью пяти циклов с управляющей переменной J=1,2,..,N вычисляем коэффициенты:
/>(3)
/>(4)
/>(5)
/>(6)
/>(7)
Находим (в последнем цикле) значение (8):
/>(8)
И погрешность
/>(9)
Проверяем выполнения условий
/>(10)
/>(11)
Если условие (10) не выполняется, то делим шаг h на 2 и повторяем вычисления. Если это условие выполняется и выполняется условие (11), значение xi+1=xi+h и Yj(i+1), то считаем, что решение системы дифференциальных уравнений найдено с заданной точностью. Если условие (11) не выполняется, шаг h увеличивается вдвое и вычисления повторяются.
1.3. Алгоритм решения задачи Коши для систем обыкновенных дифференциальных уравнений методом Рунге-Кутта-Мерсона
Задание начального шаг — h, начальных значений xо,y10,…,yN0и точности вычисления — ε.
В подпрограмме-процедуре задаём вид системы дифференциальных уравнений
В подпрограмме-функции задаём вид правой части уравнений
С помощью пяти циклов с управляющей переменной J=1,N вычисляем коэффициенты по формулам (3)-(7).
В последнем цикле находим решение системы дифференциальных уравнений по формуле (8) и погрешность по формуле (9).
Проверка выполнение условий (10) и (11). Если первое условие не выполняется то h:=h/2 и переходим к п.3
Если выполняются оба условия, то значение xi+1=xi+h и Yj(i+1) выводим на экран.
Если второе условие не выполняется, то h:=h+h и переходим к п.3
Вывести результаты вычислений в новом окне.
ГЛАВА II. ВЫЧИСЛИТЕЛЬНЫЙ ЭКСПЕРЕМЕНТ
2.1. Постановка задачи
Ставится задача составить программу решения системы дифференциальных уравнений на примере:
/>(12)
Начальные условия:
y(1)=2; y(2)=1.(13)
Требуется найти решение системы дифференциальных уравнений (12) с начальными условиями (13) методом Рунге-Кутта-Мерсона.
2.2. Анализ результатов
Система обыкновенных дифференциальных уравнений была решена методом Рунге-Кутта-Мерсона (см. Приложение 1).
Для проверки результата выполнения программы данная система была решена в MathCad(см. Приложение 2).
Для анализа результатов построим графики данных систем:
/>
Сравнение результатовпоказывает, что они обеспечивают примерно одинаковое решение.
В большинстве случаев метод Рунге-Кутта-Мерсона даёт более точный результат (погрешность />). Кроме того, хотя он громоздок в реализации, но быстрая сходимость метода компенсирует увеличение числа вспомогательных операций и, резко уменьшает вероятность числовой неустойчивости.
ЗАКЛЮЧЕНИЕ
В данной курсовой работе реализована средствами языка программирования Delphi программа, позволяющая решить систему обыкновенных дифференциальных уравнений методом Рунге-Кутта-Мерсона.
Также было проверенно решение данной системы в MathCad и проанализированы результаты.
Из анализа результатов вычисления можно сделать вывод о большей точности вычисления по методу Рунге-Кутта-Мерсона.
СПИСОК ЛИТЕРАТУРЫ
Н. Бахвалов, Н. Жидков, Г. Кобельков. Численные методы. М., 2002, 632 с.
Н. Калиткин. Численные методы. М., 1972,
А. Самарский. Введение в численные методы. М.,, 270с.
Ю. Тарасевич. Численные методы на Mathcad’е. Астрахань, 2000, 70с.
М. Лапчик, М. Рагулина, Е. Хеннер. Численные методы.М., 2004, 384с.
ПРИЛОЖЕНИЕ
Приложение1
unitUnit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Image1: TImage;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit2: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
Label2: TLabel;
Edit5: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const n=2;
Type
mas=Array[1..4] of String[60];
var
Form1: TForm1; i,s,p:integer;
h,v,x,e1,e2,e3: real;
y,w,k,f,e,a,c,d:array[1..10] of real;
j,d2:integer;
k2:byte;
implementation
uses Unit2;
{$R *.dfm}
function f1 (x1,y1,y2:real):real;
begin
f1:=y1+y2-x1*x1+x1-2;
end;
function f2(x1,y1,y2:real):real;
begin
f2:=-2*y1+4*y2+2*x1*x1-4*x1-7;
end;
procedure ur;
begin
f[1]:=f1(x,y[1],y[2]);
f[2]:=f2(x,y[1],y[2]);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
h:=strtofloat(edit1.Text);
e1:=strtofloat(edit2.Text);
x:=strtofloat(edit5.Text);
w[1]:=strtofloat(edit3.Text);
w[2]:=strtofloat(edit4.Text);
k2:=0;
e3:=0;
ur;
d2:=0;
for j:=1 to n do
begin
a[j]:=f[j]*H;
y[j]:=W[j]+a[j]/3;
end;
x:=x+h/3;
ur;
for j:=1 to n do
begin
y[j]:=W[j]+(a[j]+f[j]*H)/6;
end;
ur;
for j:=1 to n do
begin
c[j]:=f[j]*H;
y[j]:=W[j]+a[j]/8+0.375*c[j];
end;
x:=x+h/6;
ur;
for j:=1 to n do
begin
d[j]:=f[j]*H;
y[j]:=W[j]+a[j]/2-1.5*c[j]+2*d[j];
end;
x:=x+h/2;
ur;
for j:=1 to n do
begin
e[j]:=f[j]*H;
y[j]:=W[j]+(a[j]+4*d[j]+e[j])/6;
e2:=abs(-2*a[j]+9*c[j]-8*d[j]+e[j])/30;
if e2
if e2
e3:=0;
end;
if e30 then begin
x:=x-h;
for j:=1 to n do begin
y[j]:=W[j];
end;
H:=H/2;
end
else k2:=1;
if d2=n then H:=H+H;
form2.Show;
form2.edit1.text:=floattostr(y[1]);
form2.edit2.text:=floattostr(y[2]);
end;
end.
Приложение 2
/>
/>
/>
/>
/>
/>