Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій.doc
Скачиваний:
46
Добавлен:
11.02.2016
Размер:
3.99 Mб
Скачать

2.3 Обчислювальна схема методу Крилова:

1. Виклик функції Yravnen() - приклади рівнянь користувачу.

2. Вводимо вихідні дані:

а). номер рівняння, яке потрібно вирішити - chose;

б). початок і кінець даного відрізка [x0,x];

в). кількість кроків n;

г). значення y0.

3. Обчислюємо величину кроку.

h=(x-x0)/h

  1. Привласнюємо у0 першому елементу масива у.

y[0]=y0

  1. Обчислюємо розв’язання рівняння, яке обрали. Для цього робимо цикл від 0 до n і при кожнім наступному кроці обчислюємо значення у:

for (int i=0; i<=n; i++)

{

а). обчислюємо i-ий шаг. x1=x0+i*h;

б). обчислюємо значення:

q[i]=h*F(x1,y[i],chose); y1[i+1]=y[i]+(5/12)*q[i].

в). обчислюємо значення:

q1[i+1]=h*F(x1+h,y1[i+1],chose), y1[i+2]=y[i]+(5/12)q[i]+(2/3)*q1[i+1];

q1[i+2]=h*F(x1+h,y1[i+2],chose).

г). обчислюємо значення:

y2[i+2]=y1[i+2]+(2/3)*q1[i+2]-(1/12)*q[i]; q2[i+2]=h*F(x1+2*h,y2[i+2]).

д). обчислюємо значення:

y2[i+3]=y1[i+2]+(2/3)*q1[i+2]-(1/12)*q[i]+(5/12)*q2[i+2],

q2[i+3]=h*F(x1+2*h,y2[i+3]).

е). обчислюємо значення в:

y1[i+3]=y[i]+(5/12)*q[i]+(2/3)*q1[i+2]-(1/12)*q2[i+3],

y[i+1]=y1[i+3].

ж). виводимо значення в[i+3] при його значенні х1:

cout <<x1<<” ”<<y[i+3]

}// кінець циклу при i=n.

6. Кінець програми.

Функція F(x,y) і Yravnen() має такий же вид, як і в методі Рунге-Кутта, Адамса, описані вище.

y1[i+2]=y[i]+(5/

12)*q[i]+(2/3)*

q1[i+1]

x0, x, n,

y0,chose

y2[i+2]=y1[i+2]+

(2/3)*q1[i+2]-(1/

12)*q[i]

y2[i+3]=y1[i+2]+ |

(2/3)*q1[i+2]-(1/ ---------------| q2[i+2]

12)*q[i]+(5/12)* |

|

-------------------|(5/12)*q[i]+(2/3)*q1[i+2]-(1/12)*q2[i+3]

|

y[i+3],x1

2.4 Структура програми

Дана програма складається з модулів і функцій, що робить її більш зрозумілою.

Основним модулем програми є-main_pr.cpp. Даний модуль складається з функції Osnovna_progr(). Ця функціяініціалізуєграфічний режим, пересуває рамку по пунктах менюі викликає функції інших модулів.

Допоміжнімодуля – це

menu.cpp, йогоструктура:

У даному модулі викликаються функції інших модулів, описаний клас Ramka,

class Ramka

{

public:

int kod_klav(); // код натиснутої клавіші

void ramka_1(); // меню користувача

void ramka_2(); // рамка для пунктів меню

void uslovie(); // вибір потрібної функції

void Help(); // допомогадля роботиз програмою

};

який складається з відкритих функцій- членів:

intRamka ::kod_klav() – повертає значення натиснутої клавіші,

int kod_klav()

{

klav=getch();

return klav;

};

void ramka_1() – виводить на екран меню користувача,

void Ramka :: ramka_1()

{

outtextxy(180,50,"РОЗВ’ЯЗАННЯ ДИФЕРЕНЦІАЛЬНИХ РІВНЯНЬ.");

outtextxy(230,180,"1.Метод Адамса.");

outtextxy(230,200,"2.Метод Рунге-Кутта.");

outtextxy(230,220,"3.Метод Крилова.");

outtextxy(230,240,"4.Приклад для користувача.");

setcolor(9);

outtextxy(100,420,"F1-Допомога Esc - Вихід ");

};

voidramka_2() – малює рамку для пунктів меню,

void ramka_2()

{

setcolor(0);rectangle(220,p,400,pp); // зафарбовує рамку

setcolor(2);rectangle(220,y1,400,y2); // малює рамку

};

void uslovie() – викликає потрібну функцію:

При виборі першого пункту меню викликається функція Adamca().

При виборі другого пункту меню викликається функція Runge_Kuta().

При виборі третього пункту меню викликається функція Krulov().

При виборі четвертого пункту меню викликається функція All_Metods().

void Ramka :: uslovie()

{if (y1= =170){closegraph(); // вибір першого пункту меню

Adamca(); //виклик методу Адамса

initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");

}

else

if (y1= =190) {closegraph(); // вибір другого пункту меню

Runge_Kuta(); //виклик методу Рунге-Кута

initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");

}

else if (y1= =210) // вибір третього пункту меню

{closegraph();

Krulov(); //виклик методу Крилова

initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");

}

else

{closegraph(); // вибір четвертого пункту меню

All_Metods(); // виклик усіх методів

initgraph(&gdriver,&gmode,"c:\\borlandc\\bgi");

}

};

voidHelp() – виводить з файлу допоміжну інформацію про програму.

void Ramka :: Help()

{ cleardevice();

setcolor(15);

FILE *f;

int Nstr=0;

char buff[612]; //буфер для виведеної інформації

f=fopen("c:\\borlandc\\help_srm.txt","r"); //відкриття файлу для зчитування

while (!feof (f)) // читання даних поки не кінець файлу

{

buff[0] = fgetc(f);

for(it i=1;!feof (f)&&buff[i-1]!='\n';i++)

buff[i] =fgetc(f);

buff[i-1]='\0';

outtextxy (10,Nstr*10,buff); //висновок інформації на екран

Nstr++;

}

ad.cpp, йогоструктура:

У даному модулі описано три функції:

voidYravnen() – виводить на екран приклади рівнянь, що даються користувачу длярозв’язання(опис функції вище в методіРунге-Кута).

doubleFunction(floatx,floaty,intchose) – вибирає яке рівняння потрібно вирішити і підставляє в нього значенняx,yі повертаєотриманезначення (опис функції вище в методіРунге-Кутта).

voidAdamca() –розв’язаннядиференціального рівняння методом Адамса (опис функції вище в методі Адамса).

run.cpp, йогоструктура:

У даному модулі описано три функції:

voidYravnen() – виводить на екран приклади рівнянь, що даються користувачу длярозв’язання(опис функції вище в методіРунге-Кута).

doubleFunction(floatx,floaty,intchose) – вибирає яке рівняння потрібно вирішити і підставляє в нього значенняx,yі повертаєотриманезначення (опис функції вище в методіРунге-Кута).

voidRunge_Kuta() –розв’язаннядиференціального рівняння методомРунге-Кута(опис функції вище в методіРунге-Кутта) .

krulov.cpp, йогоструктура:

У даному модулі описано три функції:

voidYravnen() – виводить на екран приклади рівнянь, що даються користувачу длярозв’язання(опис функції вище в методіРунге-Кутта).

doubleFunction(floatx,floaty,intchose) – вибирає яке рівняння потрібно вирішити і підставляє в нього значенняx,yі повертаєотриманезначення (опис функції вище в методіРунге-Кута).

voidKrulov() –розв’язаннядиференціального рівняння методом Крилова

(опис функції вище в методі Крилова).

allmet.cpp, йогоструктура:

У даному модулі описано п'ять функції:

doubleFunction(floatx,floaty) -підставляє в рівняння значенняx,yі повертаєотриманезначення.

double Function(float x,float y)

{double f;

f=x+y;

return f;

}

void Adamca() – розв’язання диференціального рівняння методом Адамса

(опис функції вище в методі Адамса, тільки без уведення початкових даних; дані задаються самим користувачем).

voidRunge_Kuta() –розв’язаннядиференційногорівнянняметодомРунге-Кутта(опис функції вище в методіРунге-Кутта, тільки без уведення початкових даних; дані задаються самим користувачем).

voidKrulov() –розв’язаннядиференційногорівнянняметодом Крилова (опис функції вище в методі Крилова, тільки без уведення початкових даних; дані задаються самим користувачем).

voidAll_Metods() – викликаються всітри методирозв’язаннядиференційногорівняння.

void All_Metods()

{

Adamca(); // виклик функції розв’язання диференційного рівняння. методом Адамса

Runge_Kuta(); // виклик функції розв’язання диференційного рівняння. методом Рунге-Кута

Krulova(); // виклик функції розв’язання диференційного рівняння. методом Крилова

}