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("\n\n нажмите любой номер: ");
while(2)
{
nom=getch()-48;
if((nom>0)&(nom<10))
break;
}
while(3)
{
clrscr();
printf("\n поокончаниивводаконстантнажать - Esc");
printf("\n\n выбронная формула имеет вид\n ");
formyl(nom);
printf("\n\n\n\n ввод констант в формулу дифференциального уравнения:\n\n ");
formyl2(nom,C1,C2,C3,C4);
printf("\n\n\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("\n\n\n выброннаяформулаимеетвид\n ");
formyl(nom);
printf("\n\n\n\n ввод констант в формулу дифференциального уравнения:\n\n ");
formyl2(nom,C1,C2,C3,C4);
printf("\n\n\n уточните границы изменения Х, от A= ");
scanf("%lf",&A);
clrscr();
printf("\n\n\n выбронная формула имеет вид\n ");
formyl(nom);
printf("\n\n\n\n ввод констант в формулу дифференциального уравнения:\n\n ");
formyl2(nom,C1,C2,C3,C4);
printf("\n\n\n уточните границы изменения Х, от A= %.2f до B= ",A);
scanf("%lf",&B);
if(B<=A)
{
printf("\n\n неправильно заданны границы!!! ");
delay(1000);
goto AB;
}
clrscr();
printf("\n\n\n выбронная формула имеет вид\n ");
formyl(nom);
printf("\n\n\n\n ввод констант в формулу дифференциального уравнения:\n\n ");
formyl2(nom,C1,C2,C3,C4);
printf("\n\n\n уточните границы изменения Х, от A= %.2f до B= %.2f",A,B);
printf("\n задайте начальное значение Y(%.2f) = ",A);
scanf("%lf",&y[0]);
printf("\n\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("\n\n\n выбраннаяформулаимеетвид\n");
formyl(nom);
printf("\n\n\n\n ввод констант в формулу дифференциального уравнения:\n\n ");
formyl2(nom,C1,C2,C3,C4);
printf("\n\n\n уточните границы изменения Х, от A= %.2f до B= %.2f",A,B);
printf("\n задайте начальное значение Y(%.2f) = %.2f",A,y[0]);
printf("\n\n\n\n данные были прочитаны из ранее сохраненного файла");
getch();
goto menu;
}
}
//----Решение примера--------------------------------------------------------
else if(vv==2)
{
if((A==0)&(B==0))
{
clrscr();
printf("\n\n\n\n Сперва необходимо записать пример!");
delay(2000);
goto menu;
}
clrscr();
printf("\n\n\n для решения этой задачи нужно:\n\n");
printf(" задать колличество отрезков, на которое расделится\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("\n\n\n Решениезадачи:\n\n");
printf("
╔════════╦═══════════════════╦════════════════════════╗\n");
printf(" ║ i ║ x=h*i ║ y(i) ║\n");
printf(" ╠════════╬═══════════════════╬════════════════════════╣\n");
for(i=0;i<N;i++)
printf(" ║ %3d ║ %11lf ║ %14f ║ \n",i+1,x[i],y[i]);
printf(" ╚════════╩═══════════════════╩════════════════════════╝\n");
getch();
}
//----График-----------------------------------------------------------------
else if(vv==3)
{
if(N==0)
{
clrscr();
printf("\n\n\n\n Сперва необходимо решить пример!");
delay(2000);
goto menu;
}
initgraph(&g_driver,&g_mode,"c:\BORLAND\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("\n график дифференциального уравнения - ");
formyl2(nom,C1,C2,C3,C4);
printf("\n построенный с шагом h = %f",h);
printf(" на промежутке от %.2f до %.2f",A,B);
printf("\n выполненный в масштабе %.4f: 1",M);
printf("\n\n найти решение в точке - Enter");
printf("\n изменение масштаба увеличить - +");
printf("\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("\n\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