Смекни!
smekni.com

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

yк+1=yккh

xk+1=xk+h

αk=f(xk+h/2, xk+f(xk,yk)h/2) (12)

yk=yk-1+f(xk-1,yk-1)h

Эти формулы называются рекуррентными формулами метода Эйлера.

Сначала вычисляют вспомогательные значения искомой функции yк+1/2 в точках xк+1/2, затем находят значение правой части уравнения (1) в средней точке

y/k+1/2=f(xk+1/2, yk+1/2) и определяют yк+1.


3. Блок-схема алгоритма

где A — начальное значение x, B — конечное значение x, F(x) — значение функции в точке xn, N — количество промежутков, st – выбор операции, C1,C2,C3 – константы для формул, nom - сохраняет номер используемой функции.

На рисунке представлена блок-схема процесса решения дифференциального уравнения методом Эйлера

Подсчитывая каждый раз новое значение уравнения F(x), получаем последовательность значений xn yn, n=1,2,…

По этим значениям строим график.


4. Описание программы

Программа весьма проста. В ней много предусмотрено моментов неправильного ввода данных, о которых программа предупреждает пользователя и сразу же просит повторно ввести данные.

С самого начала программа предоставляет пользователю меню выполняемых функций, которые выделяются при помощи стрелок ↑ и ↓ выбор клавишей Enter:

Formyla -> Enter

-> Open in fails

Reshenie

Graphic

Exit

После запуска программы нужно выбрать Formyla -> Enter, эта опция позволит из предложенного списка формул выбрать одну, по которой компьютер будет производить расчет и строить график. Все предложенные формулы имеют номерацию; чтобы выбрать интересующий вас пример нажмите на цифру равную номеру примера, и сразу же появится новое окно, в котором сверху будет записан ваш пример. Также в окне будет этот же пример но с нулями на месте констант. Под примером будет высвечена большая буква С, это используется для ввода констант. Для этого вам нужно нажать номер константы, он появится, и после знака равно запишите чему она равна (вводятся целые и вещественные значения). По окончании набора нажать Enter. Операцию повторять пока не будут введены все числа. По окончании нажать Esc. После появится строчка «уточните границы изменения Х, от A= до B= » здесь нужно занести данные на каком промежутке абсциссы будет рассматриваться функция. Следующая строчка попросит ввести начальные данные y(A)=. Следующей строчкой будет вопрос: «сохранить данные в файле? Да/Нет» ответить на этот вопрос с помощью клавиш Д и Н (рус), после чего программа вернется в первоначальное меню. Если данные были сохранены (в папке с программой появляется файл form.txt), то в следующий раз чтобы не набирать снова выберите в меню опцию Formyla -> Open in fails и на экране появятся введенные данные с пометкой снизу, сообщая что данные были прочитаны из файла.

Следующая опция Reshenie. После нажатия в окне просят ввести N(целое число) – число промежутков, на которые разделится рассматриваемый участок (ось ОХ). После появится таблица рассчитанных данных (номер точки, значение абсциссы, значение ординаты). При нажатии любой клавиши произойдет переход в меню.

Graphic эта опция позволяет визуально видеть решение, а так же на этом графике прописываются все данные: начальная формула, шаг и промежуток построения графика, масштаб, данные об его изменении(клавишами +(увеличить) и -(уменьшить), а также возможность определить точное значение функции в любой точке.

Опция Exit применяется для выхода из программы.


Заключение

Результатом выполнения курсового проекта является готовый программный продукт, позволяющий решать дифференциальные уравнения по методу Эйлера, демонстрирующий возможности численного решения поставленной задачи с заданной степенью точности.

Данная программа решает заданную пользователем дифференциальное уравнение за минимальный промежуток времени. При этом пользователю предоставляется возможность визуально оценить решение, рассматривая график полученного решения.

К достоинствам программы можно отнести также удобный пользовательский интерфейс, возможность ввода пользовательских дифференциальных уравнений, а также давольно высокая стабильность работы. Однако имеются и некоторые недостатки. К недостаткам программы можно отнести: критичность к вводимым пользователем урававней, отсутствие обработки исключительных событий. Это, естественно, ограничивает возможности программы.


Список использованной литературы

1. Д. Мак-Кракен, У. Дорн. Численные методы и программирование на фортране. –М.: Мир,1977.-389,396-408 с.

2. А.А. Самарский. Введение в численные методы. – М.:Наука,1987.-176 с.

3. Алгоритмы вычислительной математики: Лабораторный практикум по курсу «Программирование» для студентов 1 - 2-го курсов всех специальностей БГУИР/А.К. Синицын, А.А. Навроцкий.- Мн.: БГУИР, 2002.- 65-69 с.

4. ГОСТ 2.105-95. Общие требования к текстовым документам.

5. ГОСТ 7.32-91. Система стандартов по информации, библиотечному и издательскому делу. Отчет о НИР. Структура и правила оформления.


Приложение 1. Текст программы.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include <math.h>

#include <bios.h>

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

void formyl(int p)

{

if(p==1) printf("&bsol;n 1. C1*y' = C2*y + C3*x + C4*x*y");

else if(p==2) printf("&bsol;n 2. y'/(C1-100) = C2*y + C3*x + (C4+x)*y");

else if(p==3) printf("&bsol;n 3. pow(e,C1)*y' = C2*y + C3*cos(x) + (C4+x+y)");

else if(p==4) printf("&bsol;n 4. C1*sin(x)*y' = e*C2*y + C3*arcsin(x) + C4*y/x");

else if(p==5) printf("&bsol;n 5. C1*y' = sin(C2)*y + tg(C3*x) + C4*ln(x)*y");

else if(p==6) printf("&bsol;n 6. C1*y' = y*C2 + C3*sin(x) + C4*cos(x)*y");

else if(p==7) printf("&bsol;n 7. (C1+C2+C3+C4)*y' = C2*y + (C3-x) + lg(C4*x)*y");

else if(p==8) printf("&bsol;n 8. y'/C1 = y/C2 + C3*sin(x) + C4*x*y");

else if(p==9) printf("&bsol;n 9. sin(C1)*y' = C2*y + |C3|*x + x*y/C4");

}

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

void formyl2(int p,double C1,double C2,double C3,double C4)

{

if(p==1) printf("%.2f*y'=%.2f*y+%.2f*x+%.2f*x*y",C1,C2,C3,C4);

else if(p==2) printf("y'/(%.2f-100)=%.2f*y+%.2f*x+(%.2f+x)*y",C1,C2,C3,C4);else if(p==3) printf("pow(e,%.2f)*y'=%.2f*y+%.2f*cos(x)+(%.2f+x+y)",C1,C2,C3,C4);

else if(p==4) printf("%.2f*sin(x)*y'=e*%.2f*y+%.2f*arcsin(x)+%.2f*y/x",C1,C2,C3,C4);

else if(p==5) printf("%.2f*y'=sin(%.2f)*y+tg(%.2f*x)+%.2f*ln(x)*y",C1,C2,C3,C4);

else if(p==6) printf("%.2f*y'=y*%.2f+%.2f*sin(x)+%.2f*cos(x)*y",C1,C2,C3,C4);

else if(p==7) printf("(%.2f+%f+%.2f+%.2f)*y'=%.2f*y+(%.2f-x)+lg(%.2f*x)*y",C1,C2,C3,C4,C2,C3,C4);

else if(p==8) printf("y'/%.2f=y/%.2f+%.2f*sin(x)+%.2f*x*y",C1,C2,C3,C4);

else if(p==9) printf("sin(%.2f)*y'=%.2f*y+|%.2f|*x+x*y/%.2f",C1,C2,C3,C4);

}

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

double formyl3(int p,double h,double x,double y,double C1,double C2,double C3,double C4)

{

double Y;

if(p==1) Y=h*(C2*y+C3*x+C4*x*y)/C1+y;

else if(p==2) Y=h*(C1-100)*(y*C2+C3*x+(C4+x)*y)+y;

else if(p==3) Y=h*(C2*y+C3*cos(x)+C4+x+y)/exp(C1)+y;

else if(p==4) Y=h*(exp(1)*C2*y+C3*asin(x)+C4*y/x)/(C1*sin(x))+y;

else if(p==5) Y=h*(sin(C2)*y+tan(C3*x)+C4*log10(x)*y)/C1+y;

else if(p==6) Y=h*(y*C2+C3*sin(x)+C4*cos(x)*y)/C1+y;

else if(p==7) Y=h*(C2*y+(C3-x)+log10(C4*x)*y)/(C1+C2+C3+C4)+y;

else if(p==8) Y=h*(y/C2+C3*sin(x)+C4*x*y)*C1+y;

else if(p==9) Y=h*(C2*y+abs(C3)*x+x*y/C4)/sin(C1)+y;

return(Y);

}

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

void main(void)

{

int vv=0,vv1=0; // руководит операциями

int N=0,W; // кол промежутков

int i,j,k; // используются во всех "for"

int nom; // номер примера

int st=4,vst=0; // строчка в меню

double C1,C2,C3,C4; // константы

double M; // масштаб

double xtoch,ytoch; // считает y(x) по графику

double h,H; // шаг

double A=0,B=0,ii,jj,kk; // пределы интегрирования

double x[102],y[102]; // главные переменные x,y

//----Подключение графики и проверка-----------------------------------------

int g_driver=9,g_mode=2, g_error;

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

g_error=graphresult();

if(g_error!=grOk)

{

puts("error");

printf("&bsol;n error=%d, reason=%s&bsol;n", g_error, grapherrormsg(g_error));

getch();

exit(1);

}

closegraph();

//----Проверка или создание файла--------------------------------------------

FILE *fail;

if((fail = fopen("form.txt", "r")) == NULL)

if((fail = fopen("form.txt", "w")) == NULL)

{

clrscr();

printf("Ошибка при открытии файла");

getch();

exit;

}

fclose(fail);

//----Графическое меню-------------------------------------------------------

menu:

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

cleardevice();

setbkcolor(5);

setfillstyle(7,8); bar(0,0,getmaxx(),getmaxy());

setfillstyle(1,1); bar(200,45,465,145);

setfillstyle(1,15); bar(203,48,462,142);

setfillstyle(1,1); bar(206,51,459,139);

setcolor(11);

settextstyle(7,0,8);

outtextxy(220,40,"Menu");

setcolor(7);

settextstyle(1,0,4);

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

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

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

outtextxy(100,320," Exit");

settextstyle(2,0,5);

outtextxy(500,440,"beta ver. 101 c");

settextstyle(1,0,4);

izm: // Выборпунктаменю

if(st==1) goto d1;

else if(st==11) goto d11;

else if(st==12) goto d12;

else if(st==2) goto d2;

else if(st==3) goto d3;

else if(st==4) goto d4;

d1:

setcolor(2);

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

setcolor(7);

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

outtextxy(100,320," Exit");

if(W==0)

{

W=1;

setfillstyle(7,1);

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

{

bar(280+i*7,190,287+i*7,260);

delay(5);

}

setfillstyle(7,8);

}

outtextxy(300,185,"Enter");

outtextxy(300,215,"Open in fails");

vst=getch();

if(vst==72)

{

st=4;

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

{

bar(530-i*7,190,523-i*7,260);

delay(5);

}

goto izm;

}

else if(vst==80)

{

st=2;

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

{

bar(530-i*7,190,523-i*7,260);

delay(5);

}

goto izm;

}

else if(vst==77) { st=11; goto izm; }

else goto d1;

d11:

setfillstyle(7,1);

bar(280,190,530,260);

setfillstyle(7,8);

setcolor(2);

outtextxy(300,185,"Enter");

setcolor(7);

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

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

outtextxy(100,320," Exit");

outtextxy(300,215,"Open in fails");

vst=getch();

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

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

else if(vst==75) { st=1; goto izm; }

else if(vst==13) { vv=1; vv1=1; closegraph(); goto resh; }

else goto d11;

d12:

setfillstyle(7,1);

bar(280,190,530,260);

setfillstyle(7,8);

setcolor(2);

outtextxy(300,215,"Open in fails");

setcolor(7);

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

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

outtextxy(100,320," Exit");

outtextxy(300,185,"Enter");

vst=getch();

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

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

else if(vst==75) { st=1; goto izm; }

else if(vst==13) { vv=1; vv1=2; closegraph(); goto resh; }

else goto d12;

d2:

setfillstyle(1,5);

setfillstyle(7,8);

bar(280,160,600,400);

setcolor(2);

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

setcolor(7);

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

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

vst=getch();

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

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

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

else goto d2;

d3:

setcolor(2);

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