Завдання:
Розв'язати звичайне диференційне рівняння.
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define C_1 1.2*exp(cos(2))
float f(float x, float y)
{ return y*sin(x+1);
}
main ()
{
clrscr();
float x,y;
float ye_0=1.2, ye_1, h=0.1;
float yrk_0=1.2, yrk_1, k1, k2, k3, k4;
for (x=1;x<3;x+=0.1)
{ y=C_1*exp(-cos(x+1));
printf ("\n x=%4.2f y=%4.2f",x,y);
}
getch();
for(x=1;x<3;x+=0.1)
{ printf("\n x=%4.2f ye_0=%4.2f",x,ye_0);
ye_1=ye_0+h*f(x, ye_0);
ye_0=ye_1;
}
getch();
for(x=1;x<3;x+=0.1)
{ printf("\n x=%4.2f yrk_0=%4.2f",x,yrk_0);
k1=h*f(x,yrk_0);
k2=h*f(x+h/2,yrk_0+k1/2);
k3=h*f(x+h/2,yrk_0+k2/2);
k4=h*f(x+h,yrk_0+k3);
yrk_1=yrk_0+1.0/6*(k1+2*k2+2*k3+k4);
yrk_0=yrk_1;
}
getch();
return(0);
}
Ейлера
Рунге-Кутта
x=
1.00
y=
1.20
ye_0=
1.20
yrk_0=
1.20
x=
1.10
y=
1.31
ye_0=
1.31
yrk_0=
1.31
x=
1.20
y=
1.43
ye_0=
1.42
yrk_0=
1.43
x=
1.30
y=
1.54
ye_0=
1.54
yrk_0=
1.54
x=
1.40
y=
1.65
ye_0=
1.65
yrk_0=
1.65
x=
1.50
y=
1.76
ye_0=
1.76
yrk_0=
1.76
x=
1.60
y=
1.86
ye_0=
1.87
yrk_0=
1.86
x=
1.70
y=
1.95
ye_0=
1.97
yrk_0=
1.95
x=
1.80
y=
2.03
ye_0=
2.05
yrk_0=
2.03
x=
1.90
y=
2.09
ye_0=
2.12
yrk_0=
2.09
x=
2.00
y=
2.13
ye_0=
2.17
yrk_0=
2.13
x=
2.10
y=
2.15
ye_0=
2.20
yrk_0=
2.15
x=
2.20
y=
2.15
ye_0=
2.21
yrk_0=
2.15
x=
2.30
y=
2.12
ye_0=
2.20
yrk_0=
2.12
x=
2.40
y=
2.08
ye_0=
2.16
yrk_0=
2.08
x=
2.50
y=
2.02
ye_0=
2.11
yrk_0=
2.02
x=
2.60
y=
1.94
ye_0=
2.03
yrk_0=
1.94
x=
2.70
y=
1.85
ye_0=
1.94
yrk_0=
1.85
x=
2.80
y=
1.75
ye_0=
1.84
yrk_0=
1.75
x=
2.90
y=
1.64
ye_0=
1.73
yrk_0=
1.64
x=
3.00
y=
1.52
ye_0=
1.61
yrk_0=
1.52