Министерство образования Республики Беларусь
Учреждение образования: Белорусский государственный университет транспорта
Электротехнический факультет
Кафедра «Высшая математика»
Глобальное домашнее задание
по теме: «Операционное исчисление»
Выполнил: студент гр. ЭС-21 Рубцов К.М. |
Проверил: доцент Дудко С. А. |
2005
Цель работы: изучить свойства и особенности реализации и применения приближённых методов решения дифференциального уравнения (метод Эйлера, метод Рунге-Кутта).
Задание.
Решение.
Листинг 1 (метод Эйлера):
#include <stdio.h>
#include <math.h>
typedef struct _tagXY
{
float x,y;
} TXY;
inline float doubleFunc(float x,float y,float a,float b)
{
return cos(y)/(a+x)+b*y*y;
}
int recurseCalc(float prevx,float prevy,float a,float b,float xborder,float xstep,int curpoint,TXY *table)
{
float nowx,nowy;
if((nowx=prevx+xstep)>(xborder+1e-4)) return (curpoint-1);
nowy=prevy+xstep*doubleFunc(prevx,prevy,a,b);
table[curpoint].x=nowx;
table[curpoint].y=nowy;
return recurseCalc(nowx,nowy,a,b,xborder,xstep,curpoint+1,table);
};
void main(void)
{
TXY tabtable[600];
float a,b,x0,y0,xborder,xstep;
int num;
register int cyc;
printf("Введите параметры уравнения a, b : ");
scanf("%f %f",&a,&b);
printf("Укажите шаг вычислений : ");
scanf("%f",&xstep);
printf("Введите начальные условия (x0,y0) : ");
scanf("%f %f",&x0,&y0);
printf("Укажите правую границу отрезка пробора [x0,z] : ");
scanf("%f",&xborder);
tabtable[0].x=x0;
tabtable[0].y=y0;
num=recurseCalc(x0,y0,a,b,xborder,xstep,1,tabtable);
printf("|# | X[i] | Y[i] |\n");
for(cyc=0;cyc<=num;cyc++)
printf("|%4d|%12.4f|%12.4f|\n",cyc,tabtable[cyc].x,tabtable[cyc].y);
return;
}
Консоль:
Введите параметры уравнения a, b : 0.7 0.3
Укажите шаг вычислений : 0.1
Введите начальные условия (x0,y0) : 0 0
Укажите правую границу отрезка пробора [x0,z] : 1
|# | X[i] | Y[i] |
| 0| 0.0000| 0.0000|
| 1| 0.1000| 0.1429|
| 2| 0.2000| 0.2672|
| 3| 0.3000| 0.3765|
| 4| 0.4000| 0.4738|
| 5| 0.5000| 0.5614|
| 6| 0.6000| 0.6414|
| 7| 0.7000| 0.7154|
| 8| 0.8000| 0.7846|
| 9| 0.9000| 0.8503|
| 10| 1.0000| 0.9132|
Листинг 2 (метод Рунге-Кутта):
#include <stdio.h>
#include <math.h>
typedef struct _tagXY
{
float x,y;
} TXY;
//Individual data
inline float doubleFunc(float x,float y,float sy)
{
return (y*sy-cos(x));
};
//------------------------
int recurseCalc(float prevx,float prevy,float prevsy,float xborder,float xstep,int curpoint,TXY *table)
{
float nowx,nowy,nowsy,k1,k2,k3,k4,K1,K2,K3,K4;
if((nowx=prevx+xstep)>(xborder+1e-4)) return (curpoint-1);
K1=doubleFunc(prevx,prevy,prevsy);
k1=prevsy;
K2=doubleFunc(prevx+xstep/2,prevy+xstep*k1/2,prevsy+xstep*K1/2);
k2=prevsy+xstep*K1/2;
K3=doubleFunc(prevx+xstep/2,prevy+xstep*k2/2,prevsy+xstep*K2/2);
k3=prevsy+xstep*K2/2;
K4=doubleFunc(prevx+xstep,prevy+xstep*k3,prevsy+xstep*K3);
k4=prevsy+xstep*K3;
nowsy=prevsy+xstep/6*(K1+2*K2+2*K3+K4);
nowy=prevy+xstep/6*(k1+2*k2+2*k3+k4);
table[curpoint].x=nowx;
table[curpoint].y=nowy;
return recurseCalc(nowx,nowy,nowsy,xborder,xstep,curpoint+1,table);
};
void main(void)
{
TXY tabtable[600];
float x0,y0,sy0,xborder,xstep;
int num;
register int cyc;
printf("Укажите шаг вычислений : ");
scanf("%f",&xstep);
printf("Введите начальные условия (x0,y0,y'0) : ");
scanf("%f %f %f",&x0,&y0,&sy0);
printf("Укажите правую границу отрезка пробора [x0,z] : ");
scanf("%f",&xborder);
tabtable[0].x=x0;
tabtable[0].y=y0;
num=recurseCalc(x0,y0,sy0,xborder,xstep,1,tabtable);
printf("|# | X[i] | Y[i] |\n");
for(cyc=0;cyc<=num;cyc++)
printf("|%4d|%12.4f|%12.4f|\n",cyc,tabtable[cyc].x,tabtable[cyc].y);
return;
}
Консоль:
Укажите шаг вычислений : 0.1
Введите начальные условия (x0,y0,y'0) : 0 0 1
Укажите правую границу отрезка пробора [x0,z] : 1
|# | X[i] | Y[i] |
| 0| 0.0000| 0.0000|
| 1| 0.1000| 0.0952|
| 2| 0.2000| 0.1812|
| 3| 0.3000| 0.2589|
| 4| 0.4000| 0.3290|
| 5| 0.5000| 0.3921|
| 6| 0.6000| 0.4487|
| 7| 0.7000| 0.4995|
| 8| 0.8000| 0.5450|
| 9| 0.9000| 0.5859|
| 10| 1.0000| 0.6229|
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.