- •Модуль 1 (Лекції №1-3) Розв’язання нелінійних алгебраїчних і трансцендентних рівнянь Лекція 1
- •1. Методи розв’язання нелінійних рівнянь.
- •Одне рівняння
- •2. Теоретичні положення.
- •3. Чисельні методи розв’язання нелінійних рівнянь
- •3.1 Метод половинного ділення.
- •Лекція 2
- •3.2 Метод пропорційних частин (хорд)
- •3.3 Метод Рибакова
- •Лекція 3
- •3.4 Метод Ньютона (дотичних)
- •3.5 Метод січних
- •Лекція 4-5. Початкова обробка даних
- •Лекція 6-7 Інтерполяція функцій Постановка задачі інтерполяції
- •Поліноміальна інтерполяція
- •Багатоінтервальна інтерполяція
- •Інтерполяція для випадку рівновіддалених вузлів
- •Інтерполяційні формули Ньютона
- •Інтерполяційні формули Гаусса
- •Перша інтерполяційна формула Гауса:
- •Друга інтерполяційна формула Гауса:
- •Інтерполяційна формула Стірлінга
- •Інтерполяційна формула Бесселя
- •Інтерполяція для випадку довільних вузлів. Інтерполяційна формула Лагранжа
- •Лінійних алгебраїчних рівнянь.
- •Метод гауса.
- •Метод Рунге-Кута
- •Метод а.Н. Крилова послідовних наближень
- •Метод Адамса
- •2. Розробка програми
- •2.1 Обчислювальна схема методу Рунге-Кута:
- •2.2 Обчислювальна схема методу Адамса:
- •2.3 Обчислювальна схема методу Крилова:
- •2.4 Структура програми
- •2.5 Опис роботи програми
- •2.6 Опис інтерфейсу користувача
- •2.7 Приклад роботи програми
- •Список літератури:
- •Лекція 14-15.Чисельне інтегрування функцій
- •1. Вступ. Загальні відомості про чисельні інтегрування.
- •2. Огляд методів чисельного інтегрування.
- •2.1 Метод прямокутників.
- •2.2 Метод трапецій
- •1.1.2 Метод Сімпсона (парабол)
- •1.1.3Метод Ньютона-Котеса.
- •2. Функції обчислення інтегралів у вигляді підпрограм.
- •Обчислення інтеграла за допомогою методу трапецій та парабол
- •Лекція 17. Системи диференціальних рівнянь.
- •Дифференціальні рівняння вищого порядку
- •Метод прогону.
- •Проекційні методи (на прикладі методу Гальоркіна).
- •Метод прогону.
- •Проекційні методи (на прикладі методу Гальоркіна).
2.3 Обчислювальна схема методу Крилова:
1. Виклик функції Yravnen() - приклади рівнянь користувачу.
2. Вводимо вихідні дані:
а). номер рівняння, яке потрібно вирішити - chose;
б). початок і кінець даного відрізка [x0,x];
в). кількість кроків n;
г). значення y0.
3. Обчислюємо величину кроку.
h=(x-x0)/h
Привласнюємо у0 першому елементу масива у.
y[0]=y0
Обчислюємо розв’язання рівняння, яке обрали. Для цього робимо цикл від 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(); // виклик функції розв’язання диференційного рівняння. методом Крилова
}