Смекни!
smekni.com

Решение дифференциальных уравнений по методу Эйлера (стр. 3 из 3)

setcolor(7);

outtextxy(100,240,"2.Reshenie");

outtextxy(100,320," Exit");

vst=getch();

if(vst==13) { vv=3; closegraph(); goto resh; }

else if(vst==72) { st=2; goto izm; }

else if(vst==80) { st=4; goto izm; }

else goto d3;

d4:

setfillstyle(1,5);

setfillstyle(7,8);

bar(280,160,600,400);

setcolor(2);

outtextxy(100,320," Exit");

setcolor(7);

outtextxy(100,200,"1.Formyla");

outtextxy(100,240,"2.Reshenie");

outtextxy(100,280,"3.Graphic");

vst=getch();

if(vst==13) { vv=4; closegraph(); goto resh; }

else if(vst==72) { st=3; goto izm; }

else if(vst==80) { st=1; W=0; goto izm; }

else goto d4;

//----Вводданных------------------------------------------------------------

resh:

if(vv==1)

{

if(vv1==1)

{

C1=0;C2=0;C3=0;C4=0;

clrscr();

printf("\n\n Выбор формулы решения\n");

for(i=1;i<10;i++)

formyl(i);

printf("&bsol;n&bsol;n нажмите любой номер: ");

while(2)

{

nom=getch()-48;

if((nom>0)&(nom<10))

break;

}

while(3)

{

clrscr();

printf("&bsol;n поокончаниивводаконстантнажать - Esc");

printf("&bsol;n&bsol;n выбронная формула имеет вид&bsol;n ");

formyl(nom);

printf("&bsol;n&bsol;n&bsol;n&bsol;n ввод констант в формулу дифференциального уравнения:&bsol;n&bsol;n ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n&bsol;n&bsol;n C");

i=getch();

if(i==49)

{

printf("1 = ");

scanf("%lf",&C1);

}

else if(i==50)

{

printf("2 = ");

scanf("%lf",&C2);

}

else if(i==51)

{

printf("3 = ");

scanf("%lf",&C3);

}

else if(i==52)

{

printf("4 = ");

scanf("%lf",&C4);

}

else if(i==27)

{

break;

}

}

AB:

clrscr();

printf("&bsol;n&bsol;n&bsol;n выброннаяформулаимеетвид&bsol;n ");

formyl(nom);

printf("&bsol;n&bsol;n&bsol;n&bsol;n ввод констант в формулу дифференциального уравнения:&bsol;n&bsol;n ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n&bsol;n&bsol;n уточните границы изменения Х, от A= ");

scanf("%lf",&A);

clrscr();

printf("&bsol;n&bsol;n&bsol;n выбронная формула имеет вид&bsol;n ");

formyl(nom);

printf("&bsol;n&bsol;n&bsol;n&bsol;n ввод констант в формулу дифференциального уравнения:&bsol;n&bsol;n ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n&bsol;n&bsol;n уточните границы изменения Х, от A= %.2f до B= ",A);

scanf("%lf",&B);

if(B<=A)

{

printf("&bsol;n&bsol;n неправильно заданны границы!!! ");

delay(1000);

goto AB;

}

clrscr();

printf("&bsol;n&bsol;n&bsol;n выбронная формула имеет вид&bsol;n ");

formyl(nom);

printf("&bsol;n&bsol;n&bsol;n&bsol;n ввод констант в формулу дифференциального уравнения:&bsol;n&bsol;n ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n&bsol;n&bsol;n уточните границы изменения Х, от A= %.2f до B= %.2f",A,B);

printf("&bsol;n задайте начальное значение Y(%.2f) = ",A);

scanf("%lf",&y[0]);

printf("&bsol;n&bsol;n сохранить данные в файле (Да/Нет) ");

while(11)

{

i=getch();

if((i==76)||(i==108)||(i==132)||(i==164))

{

printf("Да");

delay(300);

fopen("form.txt", "w");

fwrite(&nom,1,2,fail);

fwrite(&C1,1,8,fail);

fwrite(&C2,1,8,fail);

fwrite(&C3,1,8,fail);

fwrite(&C4,1,8,fail);

fwrite(&A,1,8,fail);

fwrite(&B,1,8,fail);

fwrite(&y[0],1,8,fail);

fclose(fail);

break;

}

else if((i==89)||(i==121)||(i==141)||(i==173))

{

printf("Нет");

delay(300);

break;

}

}

goto menu;

}

if(vv1==2)

{

fopen("form.txt", "r");

fread(&nom,1,2,fail);

fread(&C1,1,8,fail);

fread(&C2,1,8,fail);

fread(&C3,1,8,fail);

fread(&C4,1,8,fail);

fread(&A,1,8,fail);

fread(&B,1,8,fail);

fread(&y[0],1,8,fail);

fclose(fail);

clrscr();

printf("&bsol;n&bsol;n&bsol;n выбраннаяформулаимеетвид&bsol;n");

formyl(nom);

printf("&bsol;n&bsol;n&bsol;n&bsol;n ввод констант в формулу дифференциального уравнения:&bsol;n&bsol;n ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n&bsol;n&bsol;n уточните границы изменения Х, от A= %.2f до B= %.2f",A,B);

printf("&bsol;n задайте начальное значение Y(%.2f) = %.2f",A,y[0]);

printf("&bsol;n&bsol;n&bsol;n&bsol;n данные были прочитаны из ранее сохраненного файла");

getch();

goto menu;

}

}

//----Решение примера--------------------------------------------------------

else if(vv==2)

{

if((A==0)&(B==0))

{

clrscr();

printf("&bsol;n&bsol;n&bsol;n&bsol;n Сперва необходимо записать пример!");

delay(2000);

goto menu;

}

clrscr();

printf("&bsol;n&bsol;n&bsol;n для решения этой задачи нужно:&bsol;n&bsol;n");

printf(" задать колличество отрезков, на которое расделится&bsol;n промежуток AB=[%.2f,%.2f] N= ",A,B);

scanf("%d",&N);

ii=B; jj=A;

h=(B-A)/N;

N++;

//-------------------------------------

for(i=0;i<N;i++)

{

x[i]=A+h*i;

y[i+1]=formyl3(nom,h,x[i],y[i],C1,C2,C3,C4);

}

clrscr();

printf("&bsol;n&bsol;n&bsol;n Решениезадачи:&bsol;n&bsol;n");

printf("


╔════════╦═══════════════════╦════════════════════════╗&bsol;n");

printf(" ║ i ║ x=h*i ║ y(i) ║&bsol;n");

printf(" ╠════════╬═══════════════════╬════════════════════════╣&bsol;n");

for(i=0;i<N;i++)

printf(" ║ %3d ║ %11lf ║ %14f ║ &bsol;n",i+1,x[i],y[i]);

printf(" ╚════════╩═══════════════════╩════════════════════════╝&bsol;n");

getch();

}

//----График-----------------------------------------------------------------

else if(vv==3)

{

if(N==0)

{

clrscr();

printf("&bsol;n&bsol;n&bsol;n&bsol;n Сперва необходимо решить пример!");

delay(2000);

goto menu;

}

initgraph(&g_driver,&g_mode,"c:&bsol;BORLAND&bsol;bgi");

cleardevice();

setbkcolor(0);

setcolor(11);

settextstyle(4,0,5);

outtextxy(100,280,"Open graphic...");

setfillstyle(1,7);

bar(218,238,422,252);

setfillstyle(1,5);

bar(220,240,420,250);

setcolor(9);

for(i=0;i<200;i=i+2)

{

line(221+i,241,221+i,249);

delay(10);

}

M=5;

while(31)

{

// Фон

clrscr();

cleardevice();

setbkcolor(0);

setcolor(10);

settextstyle(5,0,4);

// Выводданныхпографику

printf(" выход в меню - Esc");

printf("&bsol;n график дифференциального уравнения - ");

formyl2(nom,C1,C2,C3,C4);

printf("&bsol;n построенный с шагом h = %f",h);

printf(" на промежутке от %.2f до %.2f",A,B);

printf("&bsol;n выполненный в масштабе %.4f: 1",M);

printf("&bsol;n&bsol;n найти решение в точке - Enter");

printf("&bsol;n изменение масштаба увеличить - +");

printf("&bsol;n уменьшить - -");

// обводка слов

setcolor(3);

line(455,0,630,0);

line(455,15,630,15);

line(455,0,455,15);

line(630,0,630,15);

setcolor(9);

// Оси

setcolor(10);

line(50,250,600,250);

line(580,245,600,250);

line(580,255,600,250);

line(325,50,325,440);

line(325,50,330,70);

line(325,50,320,70);

setcolor(15);

settextstyle(1,0,1);

outtextxy(600,260,"X");

outtextxy(345,50,"Y");

outtextxy(300,260,"O");

// единичныенасечки

if(M>4)

for(i=1;i<70;i++)

{

if(i*M<=255)

{

line(325+M*i,248,325+M*i,252);

line(325-M*i,248,325-M*i,252);

}

if(i*M<=170)

{

line(323,250-M*i,327,250-M*i);

line(323,250+M*i,327,250+M*i);

}

}

// Прорисовка графика

setcolor(9);

for(i=1;i<N;i++)

{

if((M*y[i]>-1000)&(M*y[i]<1000))

{

line(325+M*((i-1)*h+A),250-M*y[i-1],325+M*(i*h+A),250-M*y[i]);

delay(10);

}

}

k=getch();

if(k==43) // масштаб +

{

if (M>=1) M++;

else if((M<1) &&(M>=0.1)) M=M+0.1;

else if((M<0.1) &&(M>=0.01)) M=M+0.01;

else if((M<0.01) &&(M>=0.001)) M=M+0.001;

else if((M<0.001) &&(M>=0.0001)) M=M+0.0001;

else if((M<0.0001) &&(M>=0)) M=M+0.00001;

}

else if(k==45) // масштаб -

{

if (M>1.000001) M--;

else if((M<=1) &&(M>0.100001)) M=M-0.1;

else if((M<=0.100001)&&(M>0.010001)) M=M-0.01;

else if((M<=0.010001)&&(M>0.001001)) M=M-0.001;

else if((M<=0.001001)&&(M>0.000101)) M=M-0.0001;

else if((M<=0.000100)&&(M>0.000010)) M=M-0.00001;

}

else if(k==13) // Нахождение y по значению x

{

printf("&bsol;n&bsol;n введите значение абсциссы x= ");

scanf("%lf",&xtoch);

if((A<=xtoch)&&(xtoch<=B))

{

setcolor(11);

for(i=1;i<N;i++)

{

if((x[i-1]<=xtoch)&&(xtoch<=x[i]))

{

H=xtoch-x[i-1];

ytoch=formyl3(nom,H,x[i-1],y[i-1],C1,C2,C3,C4);

printf("ордината точки равна y= %lf",ytoch);

line(325+M*xtoch,250,325+M*xtoch,250-M*ytoch);

break;

}

}

setcolor(9);

}

else

printf("введенаабсцисса, непренадлежащаяпромежуткурешения");

getch();

}

else if(k==27)

break;

}

closegraph();

}

//----Выходизпрограммы-----------------------------------------------------

else if(vv==4)

{

exit(2);

}

//----Ввод программы в бесконечный цикл--------------------------------------

goto menu;

}


Приложение 2. Результаты работы программы

Приведем расчет дифференциального уравнения первого, второго и третьего порядка методом Эйлера

1. Пусть дано дифференциальное уравнение первого порядка: y/=2x-y

Требуется найти решение на отрезке [0,1] c шагом h=(1-0)/5=0,2

Начальные условия: у0=1;

Пользуясь рекурентными формулами (4), находим:

1). x1=0,2; х1/2=0,1; y(x1)=y(x0)+α0h; y(x1/2)=y(x0)+f(x0,y0)h/2;

f(x0,y0)=2*0-1=-1

y(x1/2)=1-1*0,1=0,9

α0=2*0,1-0,9=-0,7

y1=1-0,1*0,2=0,86

2). y(x2)=y(x1)+α1h; x2=0,2+0,2=0,4; x1+1/2=x1+h/2=0,2+0,1=0,3

y(x1+1/2)=y(x1)+f(x1,y(x1))h/2

f(x1,y1)=2*0,2-0,86=-0,46

y(x1+1/2)=0,86-0,46*0,1=0,814

α1=2*0,3-0,814=-0,214

y2=0,86-0,214*0,2=0,8172

3). x3=0,4+0,2=0,6; x2+1/2=x2+h/2=0,4+0,1=0,5

f(x2,y2)=2*0,4-0,8172=-0,0172

y2+1/2=0,8172-0,0172*0,1=0,81548

α2=2*0,5-0,81548=0,18452

y3=0,8172+0,18452*0,2=0,854104

4).x4=0,8; x3+1/2=x3+h/2=0,6+0,1=0,7

f(x3,y3)=2*0,6-0,854104=0,345896

y3+1/2=0,854104+0,345896*0,1=0,8886936

α3=2*0,7-0,89=0,5113064

y4=0,854104+0,5113064*0,2=0,95636528

5).x5=1; x4+1/2=0,8+0,1=0,9

f(x4,y4)=2*0,8-0,956=0,64363472

y4+1/2=0,956+0,643*0,1=1,020728752;

α4=2*0,9-1,02=0,779271248

y5=0,956+0,7792*0,2=1,11221953