Решение задачи Коши для систем обыкновенных дифференциальных уравнений методом Рунге-Кутта-Мерсо

ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ……………………………………………………………….…………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=1N-номер каждой зависимой переменной yj, x-независимая переменная .

Решение системы (1) при заданных начальных условиях



 x=x0,

	 y1(x0)=y10,…,       	(2)

y2(x0)=y20, 

yN(x0)=yN0 



сводиться к нахождению зависимостей (интегральных кривых) y1(x),…,y2(x), yN(x), проходящих через точки (x0,y10), (x0,y20),…, (x0,yN0). Задача Коши сводиться к интегрированию дифференциальных уравнений. Порядок метода численного интегрирования при этом определяется и порядок метода решения.



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

unit Unit1;

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<=e1 then

  if e2<e1/20 then d2:=d2+1 else

  e3:=0;

  end;

if e3<>0 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































































































	





2