Вы находитесь на странице: 1из 19

Содержание

1.Теоритические сведения......................................................................................................2
Метод Рунге-Кутта...........................................................................................................3
Метод А.Н. Крылова последоватеотных приближений...............................................3
Метод Адамса...................................................................................................................4
2. Разрабротка программного обеспечения..........................................................................5
2.1 Вычислительная схема метода Рунге-Кута:................................................................5
2.2 Вычислительная схема метода Адамса:......................................................................9
2.3 Вычислительная схема метода Крылова:..................................................................11
2.4 Структура программы.................................................................................................13
2.5 Описание работы программы.....................................................................................16
2.6 Описание интерфейса пользователя..........................................................................17
2.7 Пример работы программы.........................................................................................18
Введение

1.Теоритические сведения

Обыкновенным дифференциальным уравнением называется уравнение,


содержащее производные неивестной функции и одной независимой
переменной. Простейшим обыкновенным диффернциальным уравнением
является уравнение 1-го порядка

y`=f(x,y). (1)

Основная задача, относящаяся к этому уравнению, есть задача Коши: найти


решение уравнения (1)
y=y(x), (2)

удовлетворяющее начальному условию y(х0)= y0; иными словами, требуется


найти интегральную кривую у=(х), проходящую через заданную точку
М(х0, y0) (рис. 1).
у
Если правая часть f(x,y) непре-
рывна в некоторой области R, определяемый у=у(х)
неравенствами М0
| x-x0 |<a; | y-y0 |<b,
у0 у
то существует по меньшей мере
одно решение(2), определённое в 0 х0 х х
окресности | x- x0 |<h, где h- положительное число.
Рис.1

Это решение единственно, если в R выполнено условие Липшица


| f( x,y ) – f(x,y) |  N |y – y |, (3)

где N- некоторая постоянная (костанта Липшица), зависящая, в общем случае,


от a и b. Если f(x,y) имееет ограничениую производную f y` (x,y) в R, то можно
положить
N=max|f `(x,y) | при (x,y)R.
Метод Рунге-Кутта

Рассмотрим часные случаи общего подхода под названием метод Рунге-


Кутта, в котором значения функции yn+1 в точке xn+1 вычисляют только с
помощью значения функции yn в предыдущей функции xn . Сущность метода
состоит в том, что для замкнутого отрезка [xn , xn + h] находятся точки /0,1,
… m , 0,…n-1 , n / и подбирают константы R0, R1,… ,Rm так, чтобы для
интегральной кривой у=f(x), проходящей через точку / x0, y0 / , ордината
aпроксимировалась выражением

K= y0 + h[ R0f(0, 0) + R1 f(1 ,1 ) + … + Rm f(m, m)].

При этом 0 = x0; 0 = y0; 1 = x0 + 0h; 1 = y0 + 0k1;


K1= h f(0, 0); 2 = x0 + 1h; 2 = y0 + 1k1 + 2 k2;
K2= h f(1, 1).

Количество апроксимируемых членов в квадратных скобках опредиляет


порядок методода Рунге-Кутта.
В частном случае, алгоритм четвёртого порядка имеет вид:

K1 = h * f(xn,yn); K2 = h*f(xn + h/2, yn + K1/2);


K3 = h*f(xn + h/2, yn + K2/2); K4 = h*f(xn + h, yn + K3);
yn+1 = yn + (1/6)*( K1+ 2 K2+ 2 K3+ K4),

Коэффициенты и выбираемые точки опредиляют при разлодении


функции  и f в ряд Тейлора по степеням шага h и приравниванием
одинаковых степеней h в левой и правой частях равенства

’(x0 + h) = f (x0 + h, ( x0 + h)).

Оценка погрешности метода весьма затруднительна. Порядок точности


метода – h4.

Метод А.Н. Крылова последоватеотных приближений

Рассмотрим дифференциальное уравнение типа

y’ =f(x,y) (1)
С начальным условием
y(x0)= y0.
Выведем сначала ряд вспомогательных формул, пологая
yi = y(x0+ih) и yi =f(xi, yi) (i=0, 1, 2, …).
Академик Крылов предложил формулу для вычислений начала таблицы
решения задачи, полученую из формулы Ньютона для интерполирования
вперед аналогично тому, как были получены фомулы Адамса:

yi+1 = yi + qi +½ qi -1/12 2qi-1 (2)

Далее смотреть в книге 2, со списка литературы на стр. 89-92.

Метод Адамса

Метод Адамса относится к так называемым методам, использующим


«прогноз и корекцию». Он позволяет получить достаточно высокую степень
тосности интегрирования без значительного уменьшения шага интегрирования,
не вычисляя многократно кривой части уравнения.
Основная идея этого метода заключается в применении при
интегрировании второй интерполяционной формулы Ньютона. Если для
управления у’=f(х, у) в равностоящих точках оси / xn+1 - xn = h / найти
приближённое значение рещения у =(x), проходящая через точку /x0, y0/, то в
качестве подготовительного шага для некоторого числа точек по любому
методу находят приближённое значение y1 = (x1); y2 = (x2); y3 = ( x3) и
составляют интерполяционный многочлен Ньютона, который в выбранных
точках x1, x2, x3 принимает вычисленные значения y1, y2, y3. Интегрируя этот
многочлен в пределах одного шага, получаем приближённое значение yn+1. Это
первый этап экстраполяции, затем можно использовать интерполяцию для
следущего шага и т.д. Интерполяционная формула Адамса имеет вид

yn = yn+1 - yn = qn + ½ qn-1 + 5/12 2qn-2 + 3/8 3qn-3, (1.1)


где
qn =h f(xn, yn); qn-1 =h f(xn-1, yn-1);
qn-2 =h f(xn-2, yn-2); qn-3 =h f(xn-3, yn-3).

Схема решения методом Адамса:


x0(n-3) y0(n-3) q0(n-3) q0 (n-3) 2q0 (n-3) 3q0 (n-3);
x1(n-2) y1(n-2) q1(n-2) q1 (n-2) 2q1 (n-2);
x2(n-1) y2(n-1) q2(n-1) q2 (n-1);
x3(n) y3(n) q3(n).

Формула у’ = f(x,y) применяется для продолжения этой таблицы и


экстраполяции значения:
yn+1= yn + yn.
Для уточнения полученого значения по формуле у’ = f(x,y) можно применить
формулу «корекции»:

yn = qn + ½ qn -1/2 qn-1 – 1/24 3 qn-3 . (1.2)

Формула (1.1) называется интерполяционной формулой Адамса. По формуле


(1.1) находят сначала первое приближённое значение y(0) n+1, а после
пересчета, по формуле (1.2), получают втрое y(1) n+1 и по этой же итерационной
формуле находят дальнейшие приблидения до тех пор, пока не будет получено
хорошее приближение.
Это произойдет в том случае, когда два последующих значения будут мало
отличаться друг от друга.
Для работы с ЭВМ применяем формулу соответствия:
экстраполяционную формулу Адамса

y n+1 = y n + h/24 (55 y n - 59 y n-1 +37 y n-2 - 9 y n-3).

Применение формул Адамса позволяет получить достаточно большую


точность интегрирования, но оценка погрешности их довольно сложна.

2. Разрабротка программного обеспечения

2.1 Вычислительная схема метода Рунге-Кута:


1. Вызов функции Yravnen() - примеры уравнений пользователю.

2. Вводим исходные данные:


а). номер уравнения, которое нужно решить - chose;
б). начало и конец данного отрезка [x0,x];
в). количество шагов n;
г). значение y0.

3. Вычисляем величину шага.


h=(x-x0)/h

4. Присваиваем у0 к первому элементу массива у.


y[0]=y0

5. Вычисляем решение выбраного уравнения. Для этого делаем цикл от 0 до n


и для каждого значения х вычисляем значение у:
for(int i=0; i<=n; i++)
{
а). вычисляем i-ый шаг. x1=x0+i*h;
б). опередиляем первый коэфициент данного метода.
k1=h*F(x1,y[i],chose)

в). опередиляем второй коэфициент данного метода.


k2=h*F(x1+h/2,y[i]+k1/2,chose)

г). опередиляем третий коэфициент данного метода.


k2=h*F(x1+h/2,y[i]+k2/2,chose)

д). опередиляем четвёроый коэфициент данного метода.


k2=h*F(x1+h,y[i]+k3,chose)

е). вычисляем значение у:


y[i+1]=y[i]+(k1+2*k2+2*k3+k4)/6;

ж). выводим значение у[i+1] при его значении х1:


cout <<x1<<” ”<<y[i+1]

}// конец цыкла при i=n.

5. Конец программы.

Описание функции F(x,y).


Функция имеет три формальные переменные:
1. значение х;
2. значение у;
3. номер выбранного уравнения chose.

double F(float x,float y,int chose)

Данная функция,сравнивая значение chose,выбирает нужное


уравнение:

double f;
if (chose==1) f=x+y;
if (chose==2) f=cos(x)+sin(y);
if (chose==3) f=2*x*x+sqrt(y+x);
if (chose==4) f=cos(x)+y/6;
if (chose==5) f=(x*x+2*y)/sin(x);

Данная функция возвращает значение типа double


return f;

Описание функции Yravnen();


Данная функция не имеет формальных переменных и возвращает тип void.
В ней выводятся на экран примеры уравнений для пользователя:
cout<<"1. f=x+y \n";
cout<<"2. f=cos(x)+sin(y) \n";
cout<<"3. f=2*x*x+sqrt(y) \n";
cout<<"4. f=cos(x)+y/6 \n";
cout<<"5. f=(x*x+2*y)/sin(x) \n";

Блок – схема.

Начало A
|
x,Yravnen()
x0 , y0, y[i+1]=y[i]+
k4=h*F(x1+ ----------| (k1+2*k2+2*k3+k4)/6
n,chose h,y[i]+k3, |
chose)
х1, y[i+1]

h=(x-x0)/n
Yravnen()
y[0]= y0
Начало
B i=0..n
1. f=x+y
2. f=cos(x)
+sin(y)
x1=x0 + ih

3. f=2*x*x
+sqrt(y)
k1=h*F(x1,
y[i],chose)

4.f=cos(x)
+ y/6
k2=h*F(x1+
h/2,y[i] 5.f=(x*x+
+k1/2,chose
)k3=h*F(x1+ B 2*y)/sin(x)
h,y[i]+k2/2,
chose)
A Конец Конец

F(x,y)-выбор нужной ф-ции


Начало A

chose=1 нет chose=5 нет

да да

f=x+y f=(x*x+2*y)/
sin(x)
нет Конец
chose=2

да

f=cos(x)+
sin(y)

chose=3
нет

да

f=2*x*x+
sqrt(y)

нет
chose=4

да

f=cos(x)+y/6

2.2 Вычислительная схема метода Адамса:

1. Вызов функции Yravnen() - примеры уравнений пользователю.

2. Вводим исходные данные:


а). номер уравнения, которое нужно решить - chose;
б). начало и конец данного отрезка [x0,x];
в). количество шагов n;
г). значение y0.

3. Вычисляем величину шага.


h=(x-x0)/h
4. Присваиваем у0 к первому элементу массива у.
y[0]=y0

5. Вычисляем решение выбраного уравнения. Для этого делаем цикл от 3 до


n+2 и при каждом последующем шаге вычисляем значение у:
for (int i=3; i<=n+2; i++)
{
а). вычисляем i-ый шаг. x1=x0+(i-2)*h;

б). опередиляем первое начальное значение метода Адамса.


y1=F(x0+i*h,y[i],chose)

в). опередиляем второе начальное значение метода Адамса.


y2=F(x0+(i-1)*h,y[i-1],chose)

г). опередиляем третее начальное значение метода Адамса.


y3=F(x0+(i-2)*h,y[i-2],chose)

д). опередиляем четвёртое начальное значение метода Адамса.


y4=F(x0+(i-3)*h,y[i-3],chose)

е). вычисляем значение у:


y[i+1]=y[i]+(h/24)*(55*y1-59*y2+37*y3-9*y4);

ж). выводим значение у[i+1] при его значении х1:


cout <<x1<<” ”<<y[i+1]
}// конец цыкла при i=n+2.

6. Конец программы.

Функция F(x,y) имеет три формальные переменные и она идентична с


функцией, которая описана в методе Рунге-Кутта.
Функция Yravnen() не имеет формальных переменных, возвращает
значение типа void; описана выше, в методе Рунге-Кутта.

Начало A
x, x0 , y0,
Yravnen() y2=F(x0+(i-
y3=F(x0+(i-
n,chose 1)*h,y[i-1],
2)*h,y[i-2])
chose)
y4=F(x0+(i-
h=(x-x0)/n 3)*h,y[i-3],
y[0]= y0 chose)
|
i=3..n+2 -------------| (h/24)*(55*y1-59*y2+37*y3-*y4).
y[i+1]=y[i]+
|

x1=x0 +(i-2)*h
y[i+1]

y1=F(x0+
i*h,y[i],
chose)

Конец

2.3 Вычислительная схема метода Крылова:

1. Вызов функции Yravnen() - примеры уравнений пользователю.

2. Вводим исходные данные:


а). номер уравнения, которое нужно решить - chose;
б). начало и конец данного отрезка [x0,x];
в). количество шагов n;
г). значение y0.

3. Вычисляем величину шага.


h=(x-x0)/h

4. Присваиваем у0 к первому элементу массива у.


y[0]=y0

5. Вычисляем решение выбраного уравнения. Для этого делаем цикл от 0 до n


и при каждом последующем шаге вычисляем значение у:
for (int i=0; i<=n; i++)
{
а). вычисляем i-ый шаг. x1=x0+i*h;

б). вычисляем значения:


q[i]=h*F(x1,y[i],chose); y1[i+1]=y[i]+(5/12)*q[i].

в). вычисляем значения:


q1[i+1]=h*F(x1+h,y1[i+1],chose), y1[i+2]=y[i]+(5/12)q[i]+(2/3)*q1[i+1];
q1[i+2]=h*F(x1+h,y1[i+2],chose).

г). вычисляем значения:


y2[i+2]=y1[i+2]+(2/3)*q1[i+2]-(1/12)*q[i]; q2[i+2]=h*F(x1+2*h,y2[i+2]).

д). вычисляем значения:


y2[i+3]=y1[i+2]+(2/3)*q1[i+2]-(1/12)*q[i]+(5/12)*q2[i+2],
q2[i+3]=h*F(x1+2*h,y2[i+3]).

е). вычисляем значение у:


y1[i+3]=y[i]+(5/12)*q[i]+(2/3)*q1[i+2]-(1/12)*q2[i+3],
y[i+1]=y1[i+3].

ж). выводим значение у[i+3] при его значении х1:


cout <<x1<<” ”<<y[i+3]
}// конец цыкла при i=n.

6. Конец программы.

Функция F(x,y) и Yravnen() имеет такой же вид, как и в методе Рунге-


Кутта, Адамса, описаные выше.

Начало A B

Yravnen() y1[i+2]=y[i]+(5/ Конец


12)*q[i]+(2/3)*
q1[i+1]

x0, x, n, q1[i+2]=h*F
y0,chose (x1+h,y1[i+
2],chose)

h=(x-x0)/n y2[i+2]=y1[i+2]+
y[0]=y0 (2/3)*q1[i+2]-(1/
12)*q[i]

q2[i+2]=h*F
B i =1..n (x1+2*h,y2[
i+2],chose)

y2[i+3]=y1[i+2]+ |
x1=x0+i*h (2/3)*q1[i+2]-(1/ ---------------| q2[i+2]
12)*q[i]+(5/12)* |
q[i]=h*F(x1, q2[i+3]=h*F
y[i],chose) (x1+2*h,y2[
i+3],chose)

|
y1[i+1]=y[i] y1[i+3]=y[i]+
-------------------| (5/12)*q[i]+(2/3)*q1[i+2]-(1/12)*q2[i+3]
+(5/12)*q[i] y[i+1]=y1[i+3]
|

q1[i+1]=h*F y[i+3],x1
(x1+h,y1[i+
1],chose)

2.4 Структура программы

Данная программа состоит из множества модулей и функций, что делает


её более читабельной и понятной для пользователя.
Основным модулем программы является - main_pr.cpp. Данный модуль
состоит из функции Osnovna_progr(). Эта функция инициализирует
графический режим, передвигает рамку по пунктам меню и вызывает функции
других модулей.
Вспомогательные модуля – это
menu.cpp, его структура:
В данном модуле вызываются функции других модулей, описан класс Ramka,
class Ramka
{
public:
int kod_klav(); // код нажатой клавиши
void ramka_1(); // меню пользователя
void ramka_2(); // рамка для пунктов меню
void uslovie(); // выбор нужной функции
void Help(); // помощ для работы спрограммой
};

который состоит из открытых функций- членов:


int Ramka :: kod_klav() – возвращает значение нажатой клавиши,
int kod_klav()
{
klav=getch();
return klav;
};

void ramka_1() – выводит на экран меню пользователя,


void Ramka :: ramka_1()
{
outtextxy(180,50,"РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ.");
outtextxy(230,180,"1.Метод Адамса.");
outtextxy(230,200,"2.Метод Рунге-Кутта.");
outtextxy(230,220,"3.Метод Крылова.");
outtextxy(230,240,"4.Пример для пользователя.");
setcolor(9);
outtextxy(100,420,"F1-Помощ Esc - Выход ");
};

void ramka_2() – рисует рамку для пунктов меню,


void ramka_2()
{
setcolor(0);rectangle(220,p,400,pp); // закрашивает рамку
setcolor(2);rectangle(220,y1,400,y2); // рисует рамку
};

void uslovie() – вызывает нужную функцию:


При выборе первого пункта меню вызывается функция Adamca().
При выборе второго пункта меню вызывается функция Runge_Kuta().
При выборе третьего пункта меню вызывается функция Krulov().
При выборе четвёртого пункта меню вызывается функция All_Metods().

void Ramka :: uslovie()


{if (y1= =170){closegraph(); // выбор первого пункта меню
Adamca(); //вызов метода Адамса
initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");
}
else
if (y1= =190) {closegraph(); // выбор второго пункта меню
Runge_Kuta(); //вызов метода Рунге-Кутта
initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");
}
else if (y1= =210) // выбор третьего пункта меню
{closegraph();
Krulov(); //вызов метода Крылова
initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");
}
else
{closegraph(); // выбор четвертого пункта меню
All_Metods(); // вызов всех методов реш. диф. уравнений
initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");
}
};
void Help() – выводит из файла вспомогательную информацию о программе.

void Ramka :: Help()


{ cleardevice();
setcolor(15);
FILE *f;
int Nstr=0;
char buff[612]; //буфер для выводимой информации
f=fopen("c:\\borlandc\\help_srm.txt","r"); //открытие файла для считывания
while (!feof (f)) // чтение данных пока не конец файла
{
buff[0] = fgetc(f);
for(it i=1;!feof (f)&&buff[i-1]!='\n';i++)
buff[i] =fgetc(f);
buff[i-1]='\0';
outtextxy (10,Nstr*10,buff); //вывод информации на экран
Nstr++;
}

ad.cpp, его структура:


В данном модуле описано три функции:
void Yravnen() – выводит на экран примеры уравнений, которые даются
пользователю для решения(описание функции выше в методе Рунге-Кутта).

double Function(float x,float y,int chose) – выбирает какое уравнение нужно


решить и подставляет в него значения x, y и возвращает найденое значение
(описание функции выше в методе Рунге-Кутта).

void Adamca() – решение дифференциального уравнения методом Адамса


(описание функции выше в методе Адамса).

run.cpp, его структура:


В данном модуле описано три функции:
void Yravnen() – выводит на экран примеры уравнений, которые даются
пользователю для решения(описание функции выше в методе Рунге-Кутта).

double Function(float x,float y,int chose) – выбирает какое уравнение нужно


решить и подставляет в него значения x, y и возвращает найденое значение
(описание функции выше в методе Рунге-Кутта).

void Runge_Kuta() – решение дифференциального уравнения методом Рунге-


Кутта(описание функции выше в методе Рунге-Кутта) .

krulov.cpp, его структура:


В данном модуле описано три функции:
void Yravnen() – выводит на экран примеры уравнений, которые даются
пользователю для решения(описание функции выше в методе Рунге-Кутта).

double Function(float x,float y,int chose) – выбирает какое уравнение нужно


решить и подставляет в него значения x, y и возвращает найденое значение
(описание функции выше в методе Рунге-Кутта).

void Krulov() – решение дифференциального уравнения методом Крылова


(описание функции выше в методе Крылова).

allmet.cpp, его структура:


В данном модуле описано пять функции:
double Function(float x,float y) –подставляет в уравнение значения x, y и
возвращает найденое значение.
double Function(float x,float y)
{double f;
f=x+y;
return f;
}

void Adamca() – решение дифференциального уравнения методом Адамса


(описание функции выше в методе Адамса, только без ввода начальных
данных; данные задаются самим пользователем).

void Runge_Kuta() – решение дифференциального уравнения методом Рунге-


Кутта(описание функции выше в методе Рунге-Кутта, только без ввода
начальных данных; данные задаются самим пользователем).

void Krulov() – решение дифференциального уравнения методом Крылова


(описание функции выше в методе Крылова, только без ввода начальных
данных; данные задаются самим пользователем).

void All_Metods() – вызываются все три метода решения


дифференциального уравнения.
void All_Metods()
{
Adamca(); // вызов функции решения диф. ур. методом Адамса
Runge_Kuta(); // вызов функции решения диф. ур. методом Рунге-Кута
Krulova(); // вызов функции решения диф. ур. методом Крылова
}

2.5 Описание работы программы

1. Начало.
2. Инициализация графического режима.

3. Объявление объекта на класс Ramka


Ramka r;
4. Создание цикла на нажатие клавиши <Esc>

4.1 Вызов функции – меню для пользователя r.ramka_1()

4.2 Вызов функции – рамка для пунктов меню r.ramka_2()

4.3 Вызов функции опредиления кода нажатой клавиши r.kod_klav()

4.4 Опредиление кода нажатой клавиши:

4.4.1 Если код 72 – нажата клавиша вверх, следовательно


уменьшаем координату y и вызываем функцию r.ramka_2()-
рамка передвигается на пункт выше.
4.4.2 Если код 80 – нажата клавиша вниз, следовательно

увеличиваем координату y и вызываем функцию r.ramka_2()


-рамка передвигается на пункт ниже.

4.4.3 Если код 59 – нажата служебная клавиша F1, следовательно


вызываем функцию r.Help()- выводятся вспомогательные
данные о программе.

4.4.4 Если код 13 – нажата клавиша <Enter>, следовательно


вызываем функцию r.uslovie():

а). Если выбран первый пункт меню – вызываем


функцию Adamca() из модуля ad.cpp ;
б). Если выбран второй пункт меню – вызываем
функцию Runge_Kuta() из модуля run.cpp;
в). Если выбран третий пункт меню – вызываем
функцию Krulova() из модуля krulov.cpp;
г). Если выбран четвертый пункт меню – вызываем
функцию All_Metods() из модуля allmet.cpp;

5. Конец цикла.

6. Конец программы.
2.6 Описание интерфейса пользователя

Разработанная программа позволяет увидеть решение дифференциальных


уравнений разными методами и возмодное сравнение резельтатов данных
методов.
Программа выполняется в операционной среде Windows95/98/2000, DOS,
написана на алгоритмическом языке С++ и является достаточно удобной для
пользователя.

При запуске программы появляется главное меню, предлагающее сделать


следующий выбор:

“1” – Метод Адамса.

При выборе этого пункта на экране появляются несколько уравненний, решение


которые пользователь может узнать, используя метод Адамса. Для выбора
одного из уравнений пользователь должен выбрать его порядковый номер и
ввести с клавиатуры, а дальше следовать дальнейшим инструкциям программы.
При нажатии любой клавиши - выход в главное меню.

“2” – Метод Рунге-Кутта.

При выборе этого пункта на экране появляются несколько уравненний, решение


которые пользователь может узнать, используя метод Рунге-Кута. Для выбора
одного из уравнений пользователь должен выбрать его порядковый номер и
ввести с клавиатуры, а дальше следовать дальнейшим инструкциям программы.
При нажатии любой клавиши - выход в главное меню.

“3” – Метод Крылова.

При выборе этого пункта на экране появляются несколько уравненний, решение


которые пользователь может узнать, используя метод Рунге-Кута. Для выбора
одного из уравнений пользователь должен выбрать его порядковый номер и
ввести с клавиатуры, а дальше следовать дальнейшим инструкциям программы.
При нажатии любой клавиши - выход в главное меню.

“4” – Пример для пользователя.

При выборе этого пункта меню пользователю показывается решение


дифференциального уравнения методом Адамса, после, при нажатиии клавиши
<Enter> показывается решение по методу Рунге-Кутта, при повторном нажатии
<Enter> - решение по методу Крылова. Пользователь сможет сравнить
резельтаты трёх данных методов.
Для получения вспомогательной информации нужно нажать служебную
клавишу “F1”.

Для выхода из программы нажмите “Esc”.

2.7 Пример работы программы

Для того, чтобы показать работоспособность программы возмем, для


решения, дифференциальное уравнение f =x+y и начальные значения: х0=1,
х=2, у0=0 и n=10.
Решим данное уравнение тремя методами: Рунге-Кутта, Адамса,
Крылова. Решение можно увидеть при входе в четвертый пункт меню.
При решение этого уравнения на экнане для пользователя выведутся
результаты тремя методами, они будут такие:

Метод Адамса: Метод Крылова:


Y(1.000)=0.110530417 Y(1.000)=0.110780417
Y(1.100)=0.134999983 Y(1.100)=0.243803443
Y(1.200)=0.310937496 Y(1.200)=0.401416230
Y(1.300)=0.504006507 Y(1.300)=0.586213602
Y(1.400)=0.728881703 Y(1.400)=0.801064221
Y(1.500)=0.989889204 Y(1.500)=1.049139457
Y(1.600)=1.288596224 Y(1.600)=1.333945346
Y(1.700)=1.629020812 Y(1.700)=1.649357884
Y(1.800)=2.015833021 Y(1.800)=2.029662071
Y(1.900)=2.453864896 Y(1.900)=2.449595121
Y(2.000)=2.948468326 Y(2.000)=2.924394106

Метод Рунге-Кутта:
Y(1.000)=0.110341666
Y(1.100)=0.242805142
Y(1.200)=0.399716997
Y(1.300)=0.583648486
Y(1.400)=0.797441291
Y(1.500)=1.044235940
Y(1.600)=1.327503276
Y(1.700)=1.651079157
Y(1.800)=2.019202866
Y(1.900)=2.436559545
Y(2.000)=2.908327041

Сравнив данные результаты, можно убедится, что погрешность между


методами Адамса, Крылова и Рунге-Кутта не велика.

Заключение: в данной работе были реализованы методы решения


дифференциальных уравнений. Данная программа является
работоспособной, она состоит из функций и модулей и это делает
пользователю возможность использовать каждый модуль в
отдельности. Реализовав методы решения дифференциальных
уравнений – Адамса, Рунге-Кутта и Крылова, можно убедится,
что погрешность между решениями этих методов небольшая. В
дальнейшем данная программа может быть использована в
помощи для пользователя, при нахождении решения
дифференциальных уравнений.

Список литературы:

1. Авторский коллектив: В.М Глушков, И.Н. Молчанов, А.А. Стогний,


Б.Н. Брусникин, Г.И. Визнюк, Е.Г.Геец, В.Ф. Гук, А.А. Дородницына и др.
Программное обеспесение ЭВМ «МИР-1» и «МИР-2» т.2, 1976.

2. В.Е. Краскевич, К.Х. Зеленский, В.Н. Грегко Численные методы в


инженерных исследованиях. –Киев: Вища школа, 1986.

3. Б.П. Димидович, И.А.Марон, Шувалова Э.З. Численные методы анализа.

Вам также может понравиться