реферат
Главная

Рефераты по сексологии

Рефераты по информатике программированию

Рефераты по биологии

Рефераты по экономике

Рефераты по москвоведению

Рефераты по экологии

Краткое содержание произведений

Рефераты по физкультуре и спорту

Топики по английскому языку

Рефераты по математике

Рефераты по музыке

Остальные рефераты

Рефераты по авиации и космонавтике

Рефераты по административному праву

Рефераты по безопасности жизнедеятельности

Рефераты по арбитражному процессу

Рефераты по архитектуре

Рефераты по астрономии

Рефераты по банковскому делу

Рефераты по биржевому делу

Рефераты по ботанике и сельскому хозяйству

Рефераты по бухгалтерскому учету и аудиту

Рефераты по валютным отношениям

Рефераты по ветеринарии

Рефераты для военной кафедры

Рефераты по географии

Рефераты по геодезии

Рефераты по геологии

Рефераты по геополитике

Рефераты по государству и праву

Рефераты по гражданскому праву и процессу

Рефераты по делопроизводству

Рефераты по кредитованию

Рефераты по естествознанию

Рефераты по истории техники

Рефераты по журналистике

Рефераты по зоологии

Рефераты по инвестициям

Рефераты по информатике

Исторические личности

Рефераты по кибернетике

Рефераты по коммуникации и связи

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

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

Зміст

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)

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

(1.4)

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

І оскільки розв’язок задачі в точці х0 відомий з початкових умов, то ц методи дають змогу послідовно обчислити значення розв’язку в наступних точках х1=х0+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)

Подпись: l3Подпись: уПодпись: l1Подпись: l2Подпись: l4

Подпись: у4

Подпись: у=f(x)Подпись: у1


Подпись: у0

х4

 

х1

 

х

 

0

 

х0

 


Зазначимо, що похибка методу Ейлера на кожному кроці є величина порядку О(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) обчислюють двічі (у точках (хk,уk) ()).

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

0

 

Рисунок 2.

 

xk

 

xk+

 

xk+1

 

x

 

Y

 

Yk+

 

Yk

 

y=f(x)

 

l2

 

l1

 

М

 


Yk+1

 



Що ж до точки (), то це точка перетину дотичної до інтегральної кривої задачі (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) має кутовий коефіцієнт  Тобто ця пряма утворює з додатним напрямком осі Ох кут

 

M

 

l1

 

l

 

l

 


l2

 

k+1

 

yk+1

 

yk

 


0

 

хk

 

хk+1

 

х

 


Координати точки (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("\t\t Модифiкований метод:\t Виправлений метод:");

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

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

settextstyle(0,0,1);

v=getch();

cleardevice();}

closegraph();}





© 2010 Интернет База Рефератов