Численное интегрирование дифференциальных уравнений методом Эйлера

Характеристика и особенности численного дифференцирования. Рассмотрение исправленного метода Эйлера, блок-схема алгоритма. Применение численного дифференцирования, Решение обыкновенных дифференциальных уравнений первого порядка с начальными данными.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 10.06.2021
Размер файла 171,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Министерство образования и науки РФ

Глазовский инженерно-экономический институт(филиал) федерального государственного учреждения высшего образования

“Ижевский государственный технический университет имени М.Т. Калашникова”

(ГИЭИ (филиал) ФГБОУ ВО “ ИжГТУ имен М.Т. Калашникова)

Кафедра основы архитектуры, устройство и функционирование ВС

КУРСОВАЯ РАБОТА

Численное интегрирование дифференциальных уравнений методом Эйлера

Выполнила

студентка группы Д19-790-31, обучающаяся по специальности «Информационные системы» Ельцова С.Г.

Научный руководитель: Савельева Т.А.

г. Глазов

2021

ВВЕДЕНИЕ

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

Решение обыкновенных дифференциальных уравнений (нелинейных) первого порядка с начальными данными (задача Коши) - классическая область применения численных методов. Имеется много разностных методов, часть из которых возникла в домашинную эпоху и оказалось пригодным для современных ЭВМ.

В этой программе использовался метод Эйлера, один из самых старых и широко известных методов численного интегрирования дифференциальных уравнений. Этот метод имеет довольно большую ошибку; кроме того, он очень часто оказывается неустойчивым - малая начальная ошибка быстро увеличивается с ростом Х. Поэтому чаще используют более точные методы, такие как: исправленный метод Эйлера и модифицированный метод Эйлера. Нужно, однако, заметить, что метод Эйлера является методом Рунге - Кутта первого порядка.

1. Численное дифференцирование

Численное дифференцирование применяется в тех случаях, кода функция f(x)задана таблично и методы дифференциального исчисления неприменимы.

В основе численного дифференцирования лежит следующий прием: исходная функция f(x) заменятся на рассматриваемом отрезке [a, b] Интерполяционным полиномом Pn (x) И считается, что f'(x). И P'n(x) Примерно равны, т.е. f'(x)=P'n(x), (a ? x ? b)

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

1.1 Постановка задачи численного дифференцирования

Множество прикладных задач, решаемых средствами классического математического анализа, сводится нахождению производной функции, первообразной или определённого интеграла от заданной функции.

При аналитическом задании указанной функции ее дифференцирования и(или) интегрирование стремится выполнить аналитически.

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

Как известно, производная аналитически заданной функции f(x) в точке x=a опредеяется следующим образом

f'(a)=

1.2 Метод Эйлера

Простейшим численным методом решения задачи Коши является метод Эйлера, называемый иногда методом ломанных Эйлера.

Угловой коэффициент касательной и интегральной кривой в точке P0(x0,y0) есть

y0'= f (x0, y0). (1)

Найдем ординату y1 касательной, соответствующей абсциссе x1 = x0 + h. Так как уравнение касательной к кривой в точке P0 имеет вид y-y0=y0'(x-x0), то

y1 = y0 + hf (xo, y0) (2)

Угловой коэффициент в точке P1(x1, y1) также находится из данного дифференциального уравнения y1'=f (x1, y1). На следующем шаге получаем новую точку P2(x2, y2), причем

x2 = x1+h (3)

y2 = y1 +hf (x1, y1). (4)

Продолжая вычисления в соответствии с незамеченной схемой, получим формулы Эйлера для m приближенных значений решения задачи Коши начальными данными (x0, y0) на сетке отрезка [a,b] с шагом h:

x1 = xi-1+h, y1 = yi-1 + hf(xi-1, yi-1) (i = 1,2,…, m) (5)

Графической иллюстрацией приближенного решения является ломаная, соединяющая последовательно точки P0, P1, P2,…, Pm, которую называют ломанной Эйлера (Рис.1)

Оценим погрешность метода Эйлера на одном шаге. Для этого запишем разложение точного решения задачи Коши в точке x1 по формуле Тейлора с остаточным членом в форме Лагранжа:

g (x1) = g (x0 + h) = g (x0) + g'(x0) *h + Ѕ g” (z)* h2 = (6)

= y0 + hf (x0, y0) + 1/2g”(z)* h2 = y1 + Ѕ g”(z) *h2, z € (x0, x1).

Погрешность метода на одном шаге имеет порядок h2, так как

d0 = |g(x1)-y1| = Ѕ |g” (z)|* h2<= Ѕ * h2. (7)

После m шагов погрешность вычисления значения ym в конечной точке отрезка возрастает не более чем в m раз. Погрешность метода Эйлера можно оценить неравенством

d Ѕ h2m = Ѕ * (b-a) h (8)

или представить в виде d = Ch, где C € [0, Ѕ

Это означает, что метод Эйлера имеет первый порядок точности. В частности, при уменьшении шага h в 10 раз погрешность уменьшится примерно в 10 раз.

Практическую оценку погрешности решения, найденного на сетке с шагом h/2, в точке x1 € [a, b] производят с помощью приближенного равенства - правила Рунге :

|g (zi) - yi (h/2) (| yi (h) -yi (h/2)|) / (2p - 1)(9)

Где p - порядок точности численного метода. Таким образом, оценка полученного результата по формуле (9) вынуждает проводить вычисления дважды: один раз с шагом h, другой- с шагом h/2.

В основе метода ломанных Эйлера лежит идея графического построения решения дифференциального уравнения, однако этот метод дает одновременно и способ нахождения искомой функции в численной (табличной) форме.

Пусть дано уравнение

y' = f (x, y) (10)

с начальным условием

y(x0) = y0 (11)

.е. подавлена задача Коши). Вначале найдем простейшим способом приближенное значение решения в некоторой точке x1 = x0 + h, где h достаточно малый шаг. Заметим, что уравнение (10) совместно с начальным условием (11) задают направление касательной к искомой интегральной кривой в точке M0 (x0, y0). Двигаясь вдоль этой касательной (рисунок 2), получим приближенное значение решения в точке x1:

y1 = y0 + hf(x0, y0) (12)

Приближенным значением в точке M1(x1, y1), можно повторить описанную выше процедуру: построить прямую, проходящую через эту точку под углом, определяемым условием tgв = f (x1, y1), и по ней найти приближенное значение решения в точке x2 = x1 + h. Заметим, что, в отличие от ситуации, изображенной на рисунке 2, эта прямая не есть касательная к реальной интегральной кривой, поскольку точка ~M1 нам недоступна. Однако представляется интуитивно ясным, если h достаточно мало, то получаемые приближения будут близки к точным значениям решения.

Продолжая эту идею, построим систему равноотстоящих точек xi = x0 + ih (i = 0, 1, 2, …, n). Получение таблицы значений искомой функции y(x) по методу Эйлера заключается в циклическом применении пары формул:

yi = hf (xi, yi); yi+1 = yi + yi (i= 0, 1, 2, …, n). (13)

Геометрическая иллюстрация метода Эйлера приведена на рис 3. Вместо интегральной кривой в реальности получается совокупность прямых (так называется ломаная Эйлера).

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

Особенностью любого пошагового метода является то, что, начиная со второго шага, исходное значение yi в формуле (13) само является приближенным, т.е., погрешность на каждом следующем шаге систематически возрастает.

Наиболее используемым эмпирическим методом оценки точности, как метода Эйлера, так и других пошаговых методов приближенного численного интегрирования обыкновенных дифференциальных уравнений является способ двойного прохождения заданного отрезка - с шагом h и с шагом h/2.

Метод Эйлера легко распространяется на системы дифференциальных уравнений и на дифференциальные уравнения высших порядков. Последние должны быть предварительно приведены к системе дифференциальных уравнений первого порядка.

1.3 Исправленный метод Эйлера

В исправленном методе Эйлера мы находим средний тангенс наклона касательный для двух точек: xm , ym и xm +h, ym+hy'm . Последняя точка есть та самая, которая в простом методе обозначалась xm+1 , ym+1 . Геометрический процесс нахождения точки xm+1 , ym+1. С помощью метода Эйлера находится точка xm +h, ym +hy'm, лежащая на прямой L1. В этой точке снова вычисляется тангенс угла наклона касательной, на рисунке этому значению соответствует прямая L2 . Усреднение двух тангенсов дает прямую L'3 . Наконец, через точку xm , ym мы проводим прямую L3 параллельную L'3 . Точка, в которой прямая L3 пересечется с ординатой, восстановленной из x= xm+1 =xm +h, и будет искомой точкой y= ym+1 = ym +hy'm . Тангенс угла наклона L3 равен:

F(xm , ym) = Ѕ [f(xm , ym)+f(xm +h, ym +hy'm)], (14)

где ym = f(xm , ym) (15)

Уравнение линии L3 при этом записывается в виде:

y = ym + (x - xm)*F(xm) (16)

так что:

ym+1 = ym+ h*F(xm) (17)

Соотношения 14, 15, 16 и 17 описывают исправленный метод Эйлера. (рис 4)

Рис 4.

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

Рис 5.

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

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

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

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

2. Численное дифференцирование

Численное дифференцирование применяется в тех случаях, кода функция f(x)задана таблично и методы дифференциального исчисления неприменимы.

В основе численного дифференцирования лежит следующий прием: исходная функция f(x) заменятся на рассматриваемом отрезке [a, b] Интерполяционным полиномом Pn (x) И считается, что f'(x). И P'n(x) Примерно равны, т.е. f'(x)=P'n(x), (a ? x ? b)

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

Практическая часть

Приложение 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("\n 1. C1*y' = C2*y + C3*x + C4*x*y");

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

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

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

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

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

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

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

else if(p==9) printf("\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:\\BORLAND\\bgi");

g_error=graphresult();

if(g_error!=grOk)

{

puts("error");

printf("\n error=%d, reason=%s\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:\\BORLAND\\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);

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

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");

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(" L========¦===================¦========================-\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);

}

}

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

else if(vv==4)

{

exit(2);

}

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

goto menu;

}

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

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

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 )+б0 h; 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 )+б1 h; x2 =0,2+0,2=0,4; x1+1/2 =x1 +h/2=0,2+0,1=0,3

н (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

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

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

С самого начала программа предоставляет пользователю меню выполняемых функций, которые выделяются при помощи стрелок ^ и v выбор клавишей 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 Лапчик М.П. Численные методы: Учебное пособие для студенческих вузов - М.: Издательский центр «Академия», 2004

2. Ракитин В.И., Первушин В.Б. Практическое руководство по методам вычислений c приложением программ для персональных компьютеров

Размещено на Allbest.ru


Подобные документы

  • Математическое объяснение метода Эйлера, исправленный и модифицированный методы. Блок-схемы алгоритмов, описание, текст и результаты работы программы. Решение обыкновенных дифференциальных (нелинейных) уравнений первого порядка с начальными данными.

    курсовая работа [78,1 K], добавлен 12.06.2010

  • Решение нелинейных уравнений методом касательных (Ньютона), особенности и этапы данного процесса. Механизм интерполирования функции и численное интегрирование. Приближенное решение обыкновенных дифференциальных уравнений первого порядка методом Эйлера.

    курсовая работа [508,1 K], добавлен 16.12.2015

  • Методы численного интегрирования, основанные на том, что интеграл представляется в виде предела суммы площадей. Геометрическое представление метода Гаусса с двумя ординатами. Численные примеры и сравнение методов. Решение систем алгебраических уравнений.

    курсовая работа [413,4 K], добавлен 11.06.2014

  • Дифференциальное уравнение первого порядка, разрешенное относительно производной. Применение рекуррентного соотношения. Техника применения метода Эйлера для численного решения уравнения первого порядка. Численные методы, пригодные для решения задачи Коши.

    реферат [183,1 K], добавлен 24.08.2015

  • Численное решение уравнения методом Эйлера и Рунге-Кутта в Excel. Программа на языке Turbo Pascal. Блок-схема алгоритма. Метод Рунге-Кутта для дифференциального уравнения второго порядка. Модель типа "хищник-жертва" с учетом внутривидового взаимодействия.

    курсовая работа [391,5 K], добавлен 01.03.2012

  • Практическое решение дифференциальных уравнений в системе MathCAD методами Рунге—Кутты четвертого порядка для решения уравнения первого порядка, Булирша — Штера - системы обыкновенных дифференциальных уравнений первого порядка и Odesolve и их графики.

    лабораторная работа [380,9 K], добавлен 23.07.2012

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

    контрольная работа [92,7 K], добавлен 09.02.2012

  • Общая постановка задачи решения обыкновенных дифференциальных уравнений, особенности использования метода Адамса в данном процессе. Решение системы обыкновенных дифференциальных уравнений методом Адамса и точным методом, сравнение полученных результатов.

    курсовая работа [673,6 K], добавлен 27.04.2011

  • Проведение численного моделирования системы, описанной системой дифференциальных уравнений первого порядка. Схемы моделирования методом последовательного (непосредственного) интегрирования, вспомогательной переменной и методом канонической формы.

    контрольная работа [550,9 K], добавлен 12.12.2013

  • Соотношения между операторами дифференцирования и конечных разностей. Разностная аппроксимация дифференциальных уравнений. Интерполяционные рекуррентные формулы, метод Эйлера. Интерполяция конечными разностями "назад". Рекуррентные формулы Адамса.

    реферат [156,8 K], добавлен 08.08.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.