Лабораторна робота
Тема: Обчислення диференціальних рівнянь за допомогою підпрограми-функції
Мета
Навчитись обчислювати диференціальні рівняння за допомогою підпрограми функції.
Теоретичні відомості
Розв’язування диференціального рівняння
Постановка задачі (задача Коші) має вигляд диференціального рівняння з початковими умовами
yР = f(t,y), y = y0 при t = t0. t Є [a, b].
Для її наближеного розв’язання застосовуються так звані однокрокові методи: Ейлера, Ейлера покращений, Ейлера-Коші та Рунге-Кута. Їх суть полягає в тому, що діапазон інтегрування [a, b] ділять на n елементарних відрізків довжиною h. Значення шуканої функції в точці t0=a відомо з початкових умов, а її обчислення в першій і наступних точках аж до точки tn=b виконують за поданими нижче формулами. При цьому h=(b-a)/n, t0 = a, tn = b, ti+1 = ti+h, yi=f(ti), i=0,1,2, ... n.
Алгоритм розв’язування дифрівняння однокроковими методами представляє собою цикл з накопиченням суми.
Метод Ейлера найпростіший, але він має лише перший порядок точності. Геометрично метод представляє собою перехід у кожну наступну точку, починаючи з заданої початковими умовами, вздовж дотичної до точного розв’язку, проведеної з попередньої точки. Цей метод враховує кут нахилу дотичної до кривої точного розв’язку лише в одній крайній точці елементарного відрізка. Ілюстрація першого кроку переходу в точку t1 подана на рисунку 2, де y1* – точне значення шуканої функції в точці t1, e – похибка. Формула Ейлера має такий вигляд: yi+1=yi+hf(xi,yi).
Метод Ейлера покращений має другий порядок точності. На кожному кроці обчислювального процесу знаходять проміжні значення шуканої функції yiп посередині кожного i-го елементарного відрізка (на відстані пів-кроку, тобто при ti+h/2) за методом Ейлера, а проміжні значення використовують для переходу в наступну точку. Геометрично це означає перехід у кожну наступну точку вздовж дотичної, проведеної до кривої точного розв’язку в середній точці. Формули мають такий вигляд:
yiп = yi + hf(ti, yi)/2;
yi+1 = yi + hf(ti+h/2, yiп).
Метод Ейлера-Коші теж має другий порядок точності. Для переходу в кожну наступну точку враховується кут нахилу дотичної до кривої точного розв’язку в обох крайніх точках (тобто в точках ti i ti+1) кожного елементарного відрізка. Для переходу в кожну наступну точку використовують середнє арифметичне значення тангенсів кутів нахилу дотичних до кривої точного розв’язку (похідних) в крайніх точках. Тут теж обчислюють проміжні значення. Формули мають такий вигляд:
yiп = yi + hf(ti, yi);
yi+1 = yi + h[f(ti+h, yiп) + f(ti, yi)]/2.
Метод Рунге-Кута має четвертий порядок точності. На кожному кроці циклічного обчислювального процесу знаходять допоміжні коефіцієнти a, b, c, d. Формули мають такий вигляд:
a = f(ti, yi);
b = f(ti+h/2, yi + ha/2);
c = f(ti+h/2, yi + hb/2);
d = f(ti+h, yi + hc);
yi+1 = yi + h(a + 2b + 2c + d)/6.
Завдання №13
y”-4y’+13y=26x+5, y(0)=11; y’(0)=0; a=0; b=2,7; h=0.1; n=2,7/
Розв’язання
f(x,y)=26x-13y*y/2-4y.
Програма
#include<stdio.h>
#include<math.h>
main()
{
float y=11,x=0,a=0,b=2.7,h=0.1,f(float,float),yi=0,m=0,n=0,c=0,d=0;
clrscr();
/*metod Ejlera*/
printf("metod Ejlera\n");
for(x=a+h;x<b;x+=h)
{
y=y+h*f(x,y);
printf("x=%f y=%f\n",x,y);
};
getch();
/*pokra64enyj Ejlera*/
printf("pokra64enyj metod Ejlera\n");
y=11;
х=0;
for(x=a+h;x<b;x+=h)
{
yi=y+h*f(x,y)/2;
y=y+h*f(x+h/2,yi);
printf("x=%f y=%f\n",x,y);
};
getch();
/*metod Ejlera-Ko6i*/
printf("metod Ejlera-Ko6i");
y=11;
yi=0;
х=0;
for(x=a+h;x<b;x+=h)
{
yi=y+h*f(x,y);
y=y+h*(f(x+h,yi)+f(x,y))/2;
printf("x=%f y=%f\n",x,y);
};
getch();
/*metod Runge-Kuta*/
printf("metod Runge-Kuta");
y=11;
х=0;
for(x=a+h;x<b;x+=h)
{
m=f(x,y);
n=f(x+h/2,y+h*m/2);
c=f(x+h/2,y+h*n/2);
d=f(x+h,y+h*c);
y=y+h*(m+2*n+2*c+d)/6;
printf("x=%f y=%f",x,y);
};
getch();
}
float f(float x,float y)
{
return (26*x-(13*pow(y,2))/2-4*y);
}
Блок-схема
Результат виконання програми
- метод Ейлера:
x=0,100000 y=-71,790001
x=0,200000 y=-3392,526855
x=0,300000 y=7483040,000000
x=0,400000 y=-363973312512000
x=0,500000 y=861097702709576611000000000.000000
Floating point error: Overflow.
- покращений метод Ейлера:
x=0.100000 y=-576.958435
x=0.200000 y=-7672759808.000000
x=0.300000 y=-237950430497516093000000000000000000000.0
Floating point error: Overflow.
-метод Ейлера-Коші:
x=0.100000 y=-1690.763428
x=0.200000 y=-1123351134208.000000
Floating point error: Overflow.
-метод Рунге-Кута:
x=0.100000 y=-599.867981
x=0.200000 y=-5939625984.000000
Floating point error: Overflow.
Висновок
На цій лабораторній роботі я навчився розв’язувати диференціальні рівняння чотирьма мматематичними способами, а саме методами Ейлера, Ейлера-Коші та Рунге-Кута за допомогою функцій.