Курсовая работа по предмету "Программирование, компьютеры и кибернетика, ИТ технологии"


Програма розв’язання звичайних диференціальних рівнянь однокроковими методами



Зміст

1. Короткі теоретичні відомості

2. Розробка алгоритму розвязання задачі

3. Результати обчислень і оцінка похибки

Висновки

Література

Додаток

1. Короткі теоретичні відомості

Часто задачі техніки і природознавства математично зводяться до відшукання розвязку певного диференціального рівняння (або системи таких рівнянь), який задовольняє певні початкові умови (задачі Коші). Про інтегрувати таке рівняння в скінченому вигляді вдається досить рідко. при цьому дістають здебільшого такий вигляд, до якого шукана функція входить неявно, а тому користуватись ним не зручно.

На практиці застосовують здебільшого наближене інтегрування диференціальних рівнянь. Воно дає змогу знайти наближений розвязок задачі Коші або у вигляді певного аналітичного виразу (наприклад, ряду Тейлора), або у вигляді деякої таблиці значень.

Розглянемо окремі методи чисельного розвязування задачі Коші для звичайного диференціального рівняння першого порядку, розвязаного відносно похідної. Наближений розвязок задачі Коші записують у вигляді певної таблиці значень.

Задача Коші полягає в тому, щоб знайти розвязок y(x) диференціального рівняння

, (1.1)

який задовольняє початкову умову

(1.2)

Геометрично це означає, що треба знайти ту інтегральну криву y(x) рівняння (1.1), яка проходить через точку (x0,y0).

Задача Коші (1.1) - (1.2) має єдиний розвязок, наприклад при виконанні умови такої теореми.

Теорема (Пікара). Якщо функція f(x,y) двох змінних х і у неперервна в замкнутому прямокутнику

з центром у точці (х0,у0) і задовольняє в ньому умову Лівшиця по змінній у, тобто існує число K>0, яке не залежить від х і у, таке, що

(1.3)

для будь-яких точок 11) і 22) , то існує єдина диференційована функція , яка є розвязком диференціального рівняння (1.1). Цей розвязок визначений і неперервно диференційований принаймні на відрізку [x0-h; x0+h], де

(1.4)

Розглянемо так звані однокрокові чисельні методи розвязування задачі Коші (1.1)-(1.2), в яких, щоб знайти наближений розвязок у точці хk+1=xk+h, досить знайти її розвязок в точці хk.

І оскільки розвязок задачі в точці х0 відомий з початкових умов, то ці методи дають змогу послідовно обчислити значення розвязку в наступних точках х10+h, x2=x1+h,...

Окремим представником однокрокових чисельних методів є методи типу Ейлера. Надалі припускатимемо, що функція f(x,y) рівняння (1.1) задовольняє умови теореми Пікара [1].

Метод Ейлера

Нехай на відрізку [x0,x0+l] треба знайти чисельний розвязок задачі Коші(1.1)-(1.2). Для цього відрізок [x0,x0+l] поділимо на n (для простоти) рівних частин точками

х0, х1, х2,..., хn=x0+l, де хk=x0+kh (k=0,1,2,...,n), .

Величину h називають кроком чисельного інтегрування диференціального рівняння (1.1).

Розвязати задачу (1.1)-(1.2) чисельно - це означає для заданої послідовності х0, х1,…, хn=b=x0+l незалежної змінної х та числа у0 знайти числову послідовність у1, у2,…, уn, тобто для заданої послідовності значень незалежної змінної xk=x0+kh (k=0, 1, ..., n) побудувати таблицю наближених значень шуканого розвязку задачі Коші.

Якщо наближений розвязок задачі (1.1)-(1.2) в точці хk відомий, то, проінтегрувавши рівняння (1.1) в межах від хk до хk+1, знайдемо його розвязок в точці хk+1 за формулою:

(1.5)

Саме ця формула є вихідною для побудови багатьох чисельних методів розвязування задачі (1.1) - (1.2). Якщо інтеграл у правій частині формули (1.5) обчислити за формулою лівих прямокутників, то знайдемо

(1.6)

Відкинувши в цій рівності доданок порядку О(h2), дістанемо розрахункову формулу:

(1.7)

яку називають формулою Ейлера. уk i y(xk) - відповідно наближене і точне значення шуканого розвязку задачі (1.1) і (1.2) у точці хk. Різницю уk-y(xk) називають похибкою наближеного значення уk у точці xk.

Оскільки дотична до графіка функція у(х) в точці (xk,yk) матиме вигляд:

або

Звідси для ординати точки уk+1 перетину цієї дотичної з прямою х=хk+1 дістанем формулу (1.7), а це означає, що на кожному з відрізків [xk,xk+1], (k=0, 1, 2, ..., n-1 ) інтегральна крива наближено замінюється відрізком дотичної до неї в точці (xk,yk). Якщо в площині Оху позначити точки Мk(xk;yk), k=0, 1, 2,...,n і сполучити їх по порядку відрізками, то дістанемо ламану (її називають ламаною Ейлера), яка наближено зображує графік шуканого розвязку задачі (1.1) - (1.2). У цьому і полягає геометричний зміст методу Ейлера (див. рис. 1)

Зазначимо, що похибка методу Ейлера на кожному кроці є величина порядку О(h2). Точність методу досить мала і переходом від точки xk до точки xk+1 її похибка систематично зростає.

Виправлений метод Ейлера.

Якщо інтеграл у правій частині формули (1.5) обчислити за формулою середніх прямокутників, тобто значення підінтегральної функції f(x,y(x)) обчислити в точці

, то знайдемо

(1.8)

Величину невідомого значення функції у() обчислимо за формулою (1.6) з кроком . Матимемо:

Підставивши це значення у() в (1.8), дістанемо

Відкинувши тут доданок пропорційний h3, матимемо

Розрахункові формули вдосконаленого методу Ейлера можна записати у вигляді

Отже, в удосконаленому методі Ейлера спочатку за метод Ейлера обчислюють наближений розвязок у задачі (1.1)-(1.2) в точці а потім наближений розвязок уk+1 у точці хk+1; на кожному кроці інтегрування праву частину рівняння (1.1) обчислюють двічі (у точках (хkk) і ()).

Геометрично це означає, що на відрізку [xk,xk+1] графік інтегральної кривої задачі (1.1)-(1.2) замінюється відрізком прямої, яка проходить через точку (xk,yk) і має кутовий коефіцієнт k=. Іншими словами, ця пряма утворює з додатним напрямом осі Ох кут .

Що ж до точки (), то це точка перетину дотичної до інтегральної кривої задачі (1.1)-(1.2) в точці (хk,yk) з прямою Похибка на кожному кроці має порядок О(h3).

Модифікований метод Ейлера.

Якщо інтеграл в правій частині формули (1.5)обчислити за формулою трапеції, то матимемо

(1.11)

Невідоме значення у(хk+1), що входить до правої частини цієї рівності, можна обчислити за формулою (1.7). Підставивши його в праву частину рівності (1.11), дістанемо рівність:

Звідси для удосконаленого методу Ейлера-Коші матимемо такі розрахункові формули:

(1.12)

(1.13)

Отже, і в цьому методі на кожному кроці інтегрування праву частину рівняння (1.1) обчислюють двічі: спочатку за методом Ейлера (формула (1.12)) обчислюють наближене значення шуканого розвязку у точці хk+1, яке потім уточнюють за формулою (1.13). Похибка методу на кожному кроці має порядок О(h3).

Така побудова наближеного розвязку задачі (1.1)1(1.2) з геометричної точки зору означає, що на відрізку [xk,xk+1] графік інтегральної кривої наближають відрізком прямої, яка проходить через точку (xk,yk) і має кутовий коефіцієнт Тобто ця пряма утворює з додатним напрямком осі Ох кут

Координати точки (xk+1,) визначають як точку перетину дотичної у=уk+f(xk,yk)(x-xk) до графіка інтегральної кривої задачі (1.1)-(1.2) в точці (xk,yk) з прямою х=хk [2].

2. Розробка алгоритму розвязання задачі

Стандартний спосіб розвязання задачі Коші чисельними однокроковими методами - це зведення диференціальних рівнянь n-го порядку до систем з n рівнянь 1-го порядку і подальшого розвязання цієї системи стандартними однокроковими методами:

Для рівняння введемо заміну тоді для даного рівняння можна записати еквівалентну систему із двох рівнянь:

Запишемо для кожного з цих рівнянь ітераційне рівняння:

для модифікованого методу :Ейлера:

для виправленого методу Ейлера:

Таким чином знаходиться масив точок функції ymn з різними кроками тобто n1=(b-a)/0,1=10+1 раз з кроком 0,1 і n2=(b-a)/0,05 раз з кроком 0,05. Це необхідно для оперативного визначення похибки за методом Рунге (екстраполяції Рідчардсона) [3].

Загальний вигляд похибки для цих двох методів , де с визначається саме за методом Рунге , звідки с на кожному кроці обчислень знаходиться за формулою:

.

Знаючи с можна знайти локальну похибку і просумувавши її по всьому діапазону інтегрування визначити загальну похибку обчислень.

Мовою програмування було обрано Turbo C++. Вона виявилась найзручнішою із тих мов, в яких мені доводилось працювати.

Програма складається з трьох допоміжних функцій float f(x,y,z), void eylermod() i eylerisp(). eylermоd() реалізовує модифікований метод Ейлера, eylerisp() - виправлений метод, а функція f(x,y,z) повертає значення другої похідної рівняння.

Лістинг програми приведено в додатку.

3. Результати обчислень і оцінка похибки

Результатом розвязання задачі Коші являється функція. В даному випадку отримати цю функцію в аналітичному вигляді обчислювальні однокрокові методи не дозволяють. Вони представляють функцію в табличному вигляді, тобто набір точок значень х і відповідних їм значень функції у(х). Тому для більшої наглядності було вирішено по цим точкам намалювати графіки функцій у(х) для кожного з методів окремо (дивись рисунок 4). На тому ж малюнку виведені значення похибок для кожного методу окремо. На рисунку 5 виведено значення функції у(х) в дискретному вигляді з кроком h1=0.1.

Рисунок 4.

Рисунок 5.

Висновки

В даній курсовій роботі я ознайомився з однокроковими методами розвязання звичайних диференціальних рівнянь. Завдяки їй я остаточно розібрався застосовуванням цих методів до розвязання диференціальних рівнянь вищих порядків на прикладі рівняння другого порядку.

Література

1. Мудров А.Е. Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль. - Томск: МП «Раско», 1991. - 272 с.

2. Бортків А.Б., Гринчишин Я.Т. Turbo Pascal: Алгоритми і програми: чисельні методи в фізиці і математиці. Навчальний посібник. - К.: Вища школа, 1992. - 247 с.

3. Квєтний Р.Н. Методи компютерних обчислень. Навчальний посібник. - Вінниця: ВДТУ, 2001 - 148 с.

Додаток

Лістинг програми

#include<stdio.h>

#include<conio.h>

#include<math.h>

#include<graphics.h>

float f(float x,float y,float z)

{return 0.7*z+x*y+0.7*x;}

float h1=0.1;

float h2=0.05;

float a=0;

float b=1;

float x2[21],ye2[21],ym1[11],zm2[21],ym2[21],ye1[11];

float ze1[11],zm1[11],ze2[21],x1[11],yi1[11],yi2[21];

float zi1[11],zi2[21];

int n1=(b-a)/h1;

int n2=(b-a)/h2;

void eylermod()

{// printf("[0] %5.2f %5.2f %5.2f",x2[0],y2[0],z2[0]);

// moveto((x2[0])*100,480-((ym2[0])*100));

for(int i=1;i<=n2+1;i++)

{x2[i]=x2[i-1]+h2;

ze2[i]=ze2[i-1]+h2*f(x2[i-1],ye2[i-1],ze2[i-1]);

ye2[i]=ye2[i-1]+h2*ze2[i-1];

zm2[i]=zm2[i-1]+(h2/2)*(f(x2[i-1],ye2[i-1],zm2[i-1])+f(x2[i],ye2[i],ze2[i]));

ym2[i]=ym2[i-1]+(h2/2)*(ze2[i]+zm2[i-1]);

// printf("n[%d] %5.2f %5.2f %5.2f",i,x2[i],ye2[i],ym2[i]);

// setcolor(YELLOW);

// lineto((x2[i])*100,480-((ym2[i])*100));}

moveto((x1[0])*250+20,480-((ym1[0])*100)-30);

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

{x1[i]=x1[i-1]+h1;

ze1[i]=ze1[i-1]+h1*f(x1[i-1],ye1[i-1],ze1[i-1]);

ye1[i]=ye1[i-1]+h1*ze1[i-1];

zm1[i]=zm1[i-1]+(h1/2)*(f(x1[i-1],ye1[i-1],zm1[i-1])+f(x1[i],ye1[i],ze1[i]));

ym1[i]=ym1[i-1]+(h1/2)*(ze1[i]+zm1[i-1]);

// printf("n[%d] %5.2f %5.2f %5.2f",i,x1[i],ye1[i],ym1[i]);

setcolor(12);

lineto((x1[i])*250+20,480-((ym1[i])*100)-30);}

float c;

float s=0;

for(i=0;i<=n1+1;i++)

{c=(ym2[i*2]-ym1[i])/(h1*h1*h1-h2*h2*h2);

s+=c*h1*h1*h1;}

char *ch;

sprintf(ch,"%f",fabs(s));

setcolor(15);

settextstyle(0,0,1);

outtextxy(5,108,"Похибка:");

settextstyle(2,0,5);

outtextxy(70,102,ch);}

void eylerisp()

{// printf("[0] %5.2f %5.2f %5.2f",x2[0],y2[0],z2[0]);

// moveto((x2[0])*100,480-((ym2[0])*100));

for(int i=1;i<=n2+1;i++)

{x2[i]=x2[i-1]+h2/2;

ze2[i]=ze2[i-1]+h2/2*f(x2[i-1],ye2[i-1],ze2[i-1]);

ye2[i]=ye2[i-1]+h2/2*ze2[i];

zi2[i]=zi2[i-1]+h2*f(x2[i],ye2[i],ze2[i]);

yi2[i]=yi2[i-1]+h2*zi2[i];

x2[i]+=h2/2;

// printf("n[%d] %5.2f %5.2f %5.2f",i,x2[i],ye2[i],ym2[i]);

// setcolor(YELLOW);

// lineto((x2[i])*100,480-((ym2[i])*100));}

moveto((x1[0])*250+350,480-((yi1[0])*100)-30);

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

{x1[i]=x1[i-1]+h1/2;

ze1[i]=ze1[i-1]+h1/2*f(x1[i-1],ye1[i-1],ze1[i-1]);

ye1[i]=ye1[i-1]+h1/2*ze1[i];

zi1[i]=zi1[i-1]+h1*f(x1[i],ye1[i],ze1[i]);

yi1[i]=yi1[i-1]+h1*zi1[i];

x1[i]+=h1/2;

// printf("n[%d] %5.2f %5.2f %5.2f",i,x1[i],ye1[i],ym1[i]);

setcolor(12);

lineto((x1[i])*250+350,480-((yi1[i])*100)-30);}

float c;

float s=0;

for(i=0;i<=n1+1;i++)

{c=(yi2[i*2]-yi1[i])/(h1*h1*h1-h2*h2*h2);

s+=c*h1*h1*h1;}

char *ch;

sprintf(ch,"%f",fabs(s));

setcolor(15);

settextstyle(0,0,1);

outtextxy(335,108,"Похибка:");

settextstyle(2,0,5);

outtextxy(405,102,ch);}

void main()

{float c=0,s=0;

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "");

cleardevice();

x2[0]=x1[0]=a;

ye2[0]=ye1[0]=1;

ym2[0]=ym1[0]=1;

ze2[0]=ze1[0]=1;

zm2[0]=zm1[0]=1;

yi2[0]=yi1[0]=1;

zi2[0]=zi1[0]=1;

char v=50;

while(v!=27)

{//setgraphmode(getgraphmode());

setbkcolor(16);

outtextxy(190,0,"Курсова робота з дисциплiни");

setcolor(10);

outtextxy(205,10,"<<Обчислювальнi методи>>");

setcolor(12);

outtextxy(95,20,"на тему: <<Дослiдження однокрокових методiв розвязання");

outtextxy(165,30,"звичайних диференцiальних рiвнянь>>");

setcolor(14);

outtextxy(25,90,"Модифiкованний метод Ейлера");

outtextxy(355,90,"Виправлений метод Ейлера");

setcolor(15);

outtextxy(455,50,"Виконав ст. гр. 2АВ-01");

outtextxy(455,60,"Сторожук Костянтин");

settextstyle(8,0,1);

outtextxy(45,45,"y=0.7y+xy+0.7x");

settextstyle(0,0,1);

setcolor(7);

line(20,475,20,120); //левая ось у

line(0,450,300,450); //левая ось х

line(350,475,350,120);//правая ось у

line(330,450,630,450);//правая ось х

line(20,120,18,130);

line(20,120,22,130); //стрелки оу

line(18,130,22,130);

line(300,450,290,448);

line(300,450,290,452); //срелки ох

line(290,448,290,452);

line(350,120,348,130);

line(350,120,352,130); //стрелки оу

line(348,130,352,130);

line(630,450,620,448);

line(630,450,620,452); //срелки ох

line(620,448,620,452);

char t[5];

char m[5];

settextstyle(2,0,5);

outtextxy(285,430,"x");

outtextxy(28,122,"y(x)");

outtextxy(615,430,"x");

outtextxy(358,122,"y(x)");

for(float i=0;i<11;i++)

{line(20+i*25,447,20+i*25,453);

if(i<10)line(18,450-(i*50)/1.5,22,450-(i*50)/1.5);

sprintf(t,"%.1f",i/10);

if(int(i)%2==0) outtextxy(i*25+12,460,t);

sprintf(m,"%.0f",i+1);

if(i<3)outtextxy(8,342-i*100,m);}

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

{line(350+i*25,447,350+i*25,453);

if(i<10)line(348,450-(i*50)/1.5,352,450-(i*50)/1.5);

sprintf(t,"%.1f",i/10);

if(int(i)%2==0) outtextxy(i*25+342,460,t);

sprintf(m,"%.0f",i+1);

if(i<3)outtextxy(338,342-i*100,m);}

settextstyle(0,0,1);

eylermod();

eylerisp();

v=getch();

if(v==27)break;

restorecrtmode();

setgraphmode(getgraphmode());

printf("tt Модифiкований метод:t Виправлений метод:");

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

{printf("n x[%.f]=%.1ftty(x)=%f tt y(x)=%f",i,x1[i],ym1[i],yi1[i]);}

settextstyle(0,0,1);

v=getch();

cleardevice();}

closegraph();}




Не сдавайте скачаную работу преподавателю!
Данную курсовую работу Вы можете использовать для написания своего курсового проекта.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем курсовую работу самостоятельно:
! Как писать курсовую работу Практические советы по написанию семестровых и курсовых работ.
! Схема написания курсовой Из каких частей состоит курсовик. С чего начать и как правильно закончить работу.
! Формулировка проблемы Описываем цель курсовой, что анализируем, разрабатываем, какого результата хотим добиться.
! План курсовой работы Нумерованным списком описывается порядок и структура будующей работы.
! Введение курсовой работы Что пишется в введении, какой объем вводной части?
! Задачи курсовой работы Правильно начинать любую работу с постановки задач, описания того что необходимо сделать.
! Источники информации Какими источниками следует пользоваться. Почему не стоит доверять бесплатно скачанным работа.
! Заключение курсовой работы Подведение итогов проведенных мероприятий, достигнута ли цель, решена ли проблема.
! Оригинальность текстов Каким образом можно повысить оригинальность текстов чтобы пройти проверку антиплагиатом.
! Оформление курсовика Требования и методические рекомендации по оформлению работы по ГОСТ.

Читайте также:
Разновидности курсовых Какие курсовые бывают в чем их особенности и принципиальные отличия.
Отличие курсового проекта от работы Чем принципиально отличается по структуре и подходу разработка курсового проекта.
Типичные недостатки На что чаще всего обращают внимание преподаватели и какие ошибки допускают студенты.
Защита курсовой работы Как подготовиться к защите курсовой работы и как ее провести.
Доклад на защиту Как подготовить доклад чтобы он был не скучным, интересным и информативным для преподавателя.
Оценка курсовой работы Каким образом преподаватели оценивают качества подготовленного курсовика.

Сейчас смотрят :

Курсовая работа Административная ответственность
Курсовая работа Бизнес-план пекарни
Курсовая работа Юбка
Курсовая работа Развитие памяти у детей дошкольного возраста
Курсовая работа Структура оценки персонала
Курсовая работа Экономическая безопасность
Курсовая работа Организация технического обслуживания и текущего ремонта автомобилей
Курсовая работа Оценка инвестиционной привлекательности предприятия
Курсовая работа Маркетинг в сфере авиапассажирских перевозок (на примере ОАО "Аэрофлот – российские авиалинии")
Курсовая работа Расчет основных параметров склада
Курсовая работа Финансовая система РФ
Курсовая работа Пути совершенствования производственной структуры предприятия
Курсовая работа Особенности гендерных стереотипов в современном обществе
Курсовая работа Влияние игрушек на психическое развитие ребенка дошкольного возраста
Курсовая работа Становление и развитие имущественного страхования