Professional Documents
Culture Documents
Chiselni Metody (2019)
Chiselni Metody (2019)
Chiselni Metody (2019)
ЧИСЕЛЬНІ МЕТОДИ
КОМП’ЮТЕРНИЙ ПРАКТИКУМ
Київ
КПІ ім. Ігоря Сікорського
2019
Чисельні методи. Комп’ютерний практикум [Електронний ресурс] : навч. посіб.
для студ. спеціальності 122 «Комп’ютерні науки та інформацій ні технології»,
спеціалізації «Інформацій ні технології в біології та медицині» / КПІ ім. Ігоря
Сікорського ; уклад.: О. О. Абакумова. – Електронні текстові данні (1 фай л: 2,5
Мбай т). – Київ : КПІ ім. Ігоря Сікорського, 2019. – 69 с.
Гриф надано Методичною радою КПІ ім. Ігоря Сікорського (протокол № 6 від 21.02.2019 р.)
за поданням Вченої ради факультету електроніки (протокол № 01/2019 від 28.01.2019 р.)
ЧИСЕЛЬНІ МЕТОДИ
КОМП’ЮТЕРНИЙ ПРАКТИКУМ
Відповідальний
редактор: Ямненко Ю.С., завідувач кафедри промислової електроніки
КПІ ім. Ігоря Сікорського, д-р. техн. наук, професор
3
ВСТУП
4
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №1
№1. 1) ; . №6. 1) ; .
2) а) 22.553 ( ); 2) а) 0.12356 ( );
б) 2.8546; . б) 8.24163; .
3) а) 0.2387; б) 42.884. 3) а) 12.45; б) 3.4453.
№2. 1) ; . №7. 1) ; .
2) а) 6.4257 ( ); 2) а) 2.4543 ( );
б) 17.2834; . б) 24.5643; .
3) а) 3.751; б) 0.537. 3) а) 0.374; б) 4.348.
№3. 1) ; . №8. 1) ; .
2) а) 0.5748 ( ); 2) а) 8.3445 ( );
б) 34.834; . б) 23.574; .
3) а) 11.445; б) 2.043. 3) а) 20.43; б) 0.576.
№4. 1) ; . №9. 1) ; .
2) а) 2.3485 ( ); 2) а) 3.7834 ( );
б) 0.34484; . б) 21.68563; .
3) а) 2.3445; б) 0.745. 3) а) 41.72; б) 0.678.
№5. 1) ; . №10. 1) ; .
2) а) 5.435 ( ); 2) а) 13.537 ( );
б) 10.8441; . б) 7.521; .
3) а) 8.345; б) 0.288. 3) а) 5.634; б) 0.0748.
5
№11. 1) ; . №18. 1) ; .
2) а) 13.6253 ( ); 2) а) 32.7486 ( );
б) 0.3567; . б) 2.8867; .
3) а) 18.357; б) 2.16. 3) а) 0.0384; б) 63.745.
№12. 1) ; . №19. 1) ; .
2) а) 1.784 ( ); 2) а) 4.88445 ( );
б) 0.85637; . б) 0.096835; .
3) а) 0.5746; б) 236.58. 3) а) 12.688; б) 4.636.
№13. 1) ; . №20. 1) ; .
2) а) 3.6878 ( ); 2) а) 38.4258 ( );
б) 15.873; . б) 0.66385; .
3) а) 14.862; б) 8.73. 3) а) 6.743; б) 0.543.
№14. 1) ; . №21. 1) ; .
2) а) 27.1548 ( ); 2) а) 0.39642 ( );
б) 0.3945; . б) 46.453; .
3) а) 0.3648; б) 21.7. 3) а) 15.644; б) 6.125.
№15. 1) ; . №22. 1) ; .
2) а) 0.8647 ( ); 2) а) 0.66385 ( );
б) 24.3618; . б) 5.8425; .
3) а) 2.4516; б) 0.863. 3) а) 0.3825; б) 24.6.
№16. 1) ; . №23. 1) ; .
2) а) 0.98351 ( ); 2) а) 0.75244 ( );
б) 3.7542; . б) 24.3872; .
3) а) 62.74; б) 0.389. 3) а) 16.383; б) 5.734.
№17. 1) ; . №24. 1) ; .
2) а) 5.6483 ( ); 2) а) 2.3684 ( );
б) 83.736; . б) 45.7832; .
3) а) 5.6432; б) 0.00858. 3) а) 0.573; б) 3.6761.
6
№25. 1) ; . №28. 1) ; .
2) а) 0.38725 ( ); 2) а) 15.8372 ( );
б) 72.354; . б) 0.088748; .
3) а) 18.275; б) 0.00644. 3) а) 3.643; б) 72.385.
№26. 1) ; . №29. 1) ; .
2) а) 0.36127 ( ); 2) а) 13.5726 ( );
б) 46.7843; . б) 3.87683; .
3) а) 3.425; б) 7.38. 3) а) 26.3; б) 4.8556.
№27. 1) ; . №30. 1) ; .
2) а) 4.57633 ( ); 2) а) 0.66835 ( );
б) 23.7564; . б) 23.3748; .
3) а) 3.75; б) 6.8343. 3) а) 43.813; б) 0.64
Теоретичні відомості
Абсолютна та відносна похибки
Мірою точності наближеного числа є похибка. Розрізняють абсолютну
та відносну похибку наближеного числа.
Нехай x – це наближене подання числа Х. Тоді величину ∆х=|x – Х|
називають абсолютною похибкою подання числа Х за допомогою числа x.
Як правило, ця величина має лише теоретичний інтерес, оскільки точне
значення Х зазвичай невідоме. На практиці використають максимально
можливе значення ∆х – число , що задовольняє нерівність .
називають максимальною, або граничною абсолютною
похибкою. При цьому, має виконуватися умова, що << |x| (знак <<
означає “значно менше”).
Проте, абсолютна похибка не демонструє якості обчислення або
вимірювання – важливе значення абсолютної похибки, що припадає на
одиницю вимірювання.
Очевидно, що << 1.
Відносну похибку зазвичай вимірюють у відсотках. Крім того, відносну
похибку завжди округлюють із надлишком.
Похибки округлення
У тих випадках, коли наближене число містить зайву кількість
невірних значущих цифр, удаються до округлення.
При округленні використовують наступне правило округлення. Якщо в
старшому з розрядів, що відкидаються, стоїть цифра менша п'яти, то вміст
розрядів, що зберігаються, не міняється. У противному випадку, в молодший
розряд, що зберігається, додається одиниця.
Очевидно, що абсолютна похибка округлення не перевершує половини
одиниці молодшого розряду, що залишається.
При округленні наближеного числа його абсолютна похибка
збільшується з урахуванням похибки округлення.
Відповідь: ∆x = 0.00005; .
б) Оскільки всі п’ять цифр числа х=12.384 вірні у широкому розумінні,
то гранична абсолютна похибка ∆x = 0.001, а гранична відносна похибка
0.000081 (0.0081%).
Відповідь: ∆x = 0.001; .
Приклад програми
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
float first(float, float) ;
float first(float x, float X)
{
return (abs(x -X)) / x;
}
int main(int argc, char* argv[])
{
cout << "sqrt(n1) = x1 ~ X1 \n";
cout << "Input n1: ";
float n1 = 0;
cin >> n1;
float X1 = sqrt(n1);
cout << "Input x1 = sqrt(n1)= ";
float x1 = 0;
cin >> x1;
float dx1 = 0;
dx1 = first(x1, X1);
cout << dx1 << " \n";
cout << "n2/N2 = x2 ~ X2 \n";
cout << "Input n2: ";
float n2 = 0;
cin >> n2;
cout << "Input N2: ";
float N2 = 0;
cin >> N2;
float X2 = n2 / N2;
cout << "Input x2 = n2/N2 = ";
float x2 = 0;
cin >> x2;
float dx2 = first(x2, X2);
cout << dx2 << "\n";
float L_answer = 0;
if (dx1 < dx2)
L_answer = dx1;
else
L_answer = dx2;
if (L_answer == dx1)
cout << "sqrt(" << n1 << ")" << " is more accurate \n";
else
cout << n2 << "/" << N2 << " is more accurate \n";
getch();
return 0;
}
Контрольні питання
1) Яку величину називають абсолютною похибкою наближеного числа?
2) Яку величину називають граничною абсолютною похибкою
наближеного числа?
3) Яку величину називають відносною похибкою наближеного числа?
4) Яку величину називають граничною відносною похибкою наближеного
числа?
5) Яку цифру називають значущою цифрою наближеного числа?
6) Яку цифру в десятковому поданні наближеного числа називають
вірною значущою цифрою у вузькому розумінні?
7) Яку цифру в десятковому поданні наближеного числа називають
вірною значущою цифрою у широкому розумінні?
8) Наведіть правило округлення наближених чисел.
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №2
Теоретичні відомості
Нехай відомі значення функції в різних точках: .(
): Наприклад, ці значення
знайдені експериментально або отримані у результаті розрахунків. Виникає
задача наближено відбудувати функцію у довільній точці .
Для розв’язання цієї задачі будується алгебраїчний багаточлен
степеня , який в точках приймає ті ж значення , що й функція ,
тобто:
, .
(2)
(3)
Окремі випадки:
Лінійна інтерполяція За (інтерполюємо за двома точками)
+ +
+ + .
Отже:
Відповідь: , 2.067.
Приклад програми
#include <conio.h>
#include <iostream>
using namespace std;
double XX[] = {0.43, 0.48, 0.55, 0.62, 0.70, 0.75};
double YY[] = {1.63597, 1.73234, 1.87688, 2.03345, 2.22846, 2.35973};
double g, l, r;
int i, j;
int main (int argc, char* argv[])
{
cout<<"Table of values of a function:"<<endl;
cout<<"X: ";
for(i=0; i<5; i++)
cout<<XX[i]<<" | ";
cout<<endl;
cout<<"Y: ";
for(i=0; i<5; i++)
cout<<YY[i]<<" | ";
cout<<endl;
cout<<endl;
cout<<"Enter value X: ";
cin>>r;
l=0;
for(i=0; i<5; i++)
{
g=1;
for(j=0; j<5; j++)
{
if(i != j)
g = g*((r-XX[j])/(XX[i]-XX[j]));
}
l=l+YY[i]*g;
}
cout<<"Y = "<< l;
getch();
return 0; }
Контрольні питання
1) Сформулюйте задачу апроксимації (наближення) функції.
2) Яке наближення називають точковою апроксимацією?
3) Яке наближення називають неперервною апроксимацією?
4) Яке наближення називають інтегральною апроксимацією?
5) Сформулюйте задачу інтерполяції функції.
6) Наведіть геометричну інтерпретацію задачі інтерполяції.
7) Що таке глобальна інтерполяція?
8) Що таке локальна інтерполяція?
9) Яке наближення називають екстраполяцією?
10) Які точки називають вузлами інтерполяції?
11) Який багаточлен називають інтерполяційним багаточленом Лагранжа?
12) Які багаточлени називають лагранжевими коефіцієнтами?
13) Наведіть формулу інтерполяційного багаточлена Лагранжа.
14) Наведіть формулу інтерполяційного багаточлена Лагранжа для випадку
лінійної інтерполяції.
15) Наведіть формулу інтерполяційного багаточлена Лагранжа для випадку
квадратичної інтерполяції.
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №3
Таблиця 2
1.5 2.0 2.5 3.0 3.5 4.0
10.517 10.193 9.807 9.387 8.977 8.637
4.5 5.0 5.5 6.0 6.5 7.0
8.442 8.482 8.862 9.701 11.132 13.302
Теоретичні відомості
Один із способів розв’язання задачі диференціювання – це
використання інтерполяційних багаточленів.
Для виведення формул наближеного диференціювання дану функцію
на відрізку замінюють інтерполяційною функцією та
покладають, що
за .
Аналогічно поступають для знаходження значення похідних функції
вищих порядків.
матимемо:
. (1)
Аналогічно, враховуючи, що
отримуємо:
. (2).
. (4)
, .
Отже
Відповідь: .
Приклад програми
#include <conio.h>
#include <iostream>
using namespace std;
const n=12;
double X[] = {2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6};
double Y[] = {3.526, 3.782, 3.945, 4.043, 4.104, 4.155, 4.222, 4.331, 4.507, 4.775,
5.159, 5.683};
double y1[n];
double y2[n];
double y3[n];
double y4[n];
double y5[n];
double xx, t, G, L, h;
int k, i, j;
int main(int argc, char* argv[])
{
cout<<"Table of values of a function:"<<endl;
cout<<"\tX"<<"\t|"<<"\tY"<<endl;
cout<<" ---------------------------"<<endl;
for(i=0; i<n; i++)
cout<<"\t"<<X[i]<<"\t|"<<"\t"<<Y[i]<<endl;
cout<<endl;
cout<<"Enter value X: ";
cin>>xx;
h=0;
i=1;
t=0;
k=0;
h=(X[i]-X[i-1]);
t=(xx-X[i-1])/h;
for(j=1; j<n; j++)
{
y1[k]=Y[j]-Y[j-1];
k++;
}
k=0;
for(j=1; j<n-1; j++)
{
y2[k]=y1[j]-y1[j-1];
k++;
}
k=0;
for(j=1; j<n-2; j++)
{
y3[k]=y2[j]-y2[j-1];
k++;
}
k=0;
for(j=1; j<n-3; j++)
{
y4[k]=y3[j]-y3[j-1];
k++;
}
k=0;
for(j=1; j<n-4; j++)
{
y5[k]=y4[j]-y4[j-1];
k++;
}
G=(y1[0]+y2[0]*(2*t-1)/2+y3[0]*(3*t*t-6*t+2)/6+y4[0]*(4*t*t*t-18*t*t+
22*t-6)/24+y5[0]*(5*t*t*t*t-40*t*t*t+105*t*t-100*t+24)/120)/h;
cout<<"Y' = "<<G<<endl;
L=(y2[0]+y3[0]*(t-1)+y4[0]*(12*t*t-36*t+22)/24+y5[0]*(20*t*t*t-120*t*t+
210*t-100)/120)/(h*h);
cout<<"Y\" = "<<L;
getch();
return 0;
}
Контрольні питання
1) Сформулюйте задачу числового диференціювання.
2) Назвіть похибки числового диференціювання.
3) Наведіть геометричну інтерпретацію похибки апроксимації похідної.
4) Наведіть формули числового диференціювання на основі першого
інтерполяційного багаточлена Ньютона.
5) Наведіть формули числового диференціювання на основі другого
інтерполяційного багаточлена Ньютона.
6) Наведіть формули числового диференціювання на основі
інтерполяційних багаточленів Ньютона для випадку співпадіння
шуканого значення х з одним із вузлів таблиці значень функції.
7) Наведіть формули числового диференціювання для випадку
екстраполяції.
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №4
№1. 1) 2) 3)
№2. 1) 2) 3)
№3. 1) 2) 3)
№4. 1) 2) 3)
№5. 1) 2) 3)
№6. 1) 2) 3)
№7. 1) 2) 3)
№8. 1) 2) 3)
№9. 1) 2) 3)
№10. 1) 2) 3)
№11. 1) 2) 3)
№12. 1) 2) 3)
№13. 1) 2) 3)
№14. 1) 2) 3)
№15. 1) 2) 3)
№16. 1) 2) 3)
№17. 1) 2) 3)
№18. 1) 2) 3)
№19. 1) 2) 3)
№20. 1) 2) 3)
№21. 1) 2) 3)
№22. 1) 2) 3)
№23. 1) 2) 3)
№24. 1) 2) 3)
№25. 1) 2) 3)
№26. 1) 2) 3)
№27. 1) 2) 3)
№28. 1) 2) 3)
№29. 1) 2) 3)
3.2
x x2
№30. 1) 2) 2 2 )dx
1.6
lg( 3)
Теоретичні відомості
Нехай на відрізку задана функція За допомогою точок
, , …, розіб’ємо відрізок на n елементарних відрізків (
), причому , . На кожному з цих відрізків виберемо
довільну точку (рис. 2):
Рис. 2. Геометрична інтерпретація методу прямокутників
. (2)
Метод прямокутників
Метод прямокутників використовує заміну визначеного інтеграла
інтегральною сумою (2). В якості точок можуть обиратися ліві чи
праві межі елементарних відрізків (рис. 3).
а б
Рис. 3. Геометрична інтерпретація:
а - методу лівих прямокутників; б - методу правих прямокутників
, .
Метод Сімпсона
Метод Сімпсона використовує квадратичну інтерполяцію. Відрізок
інтегрування розбивається на парне число n рівних частин із кроком h.
На кожному відрізку , , …, підінтегральну функцію
замінюють інтерполяційним багаточленом другого степеня
(наприклад, багаточленом Лагранжа). Геометрично – замінюють параболою,
що проходить через точки та ,
(рис. 4).
Метод трапецій
Метод трапецій використовує лінійну інтерполяцію. Геометрично
графік функції представляється у вигляді ламаної, що з’єднує точки
, (рис. 5).
, .
.
Формула трапецій в цьому випадку приймає вигляд:
.
Зразок виконання завдання
Завдання: 1) з точністю до 0.0001 обчислити значення визначеного інтегралу
умови п=10.
Розв’язання:
Для обчислення інтегралу методом прямокутників за умови
розіб’ємо відрізок інтегрування на 10 рівних частин з кроком
0 1.5 1.2845
1 1.58 1.2938
2 1.66 1.3031
3 1.74 1.3122
4 1.82 1.3214
5 1.90 1.3304
6 1.98 1.3394
7 2.06 1.3483
8 2.14 1.3572
9 2.22 1.3660
10 2.30 1.3748
Отже
.
Отже
0 1.54 1.2892
1 1.62 1.2985
2 1.70 1.3077
3 1.78 1.3168
4 1.86 1.3259
5 1.94 1.3349
6 2.02 1.3439
7 2.10 1.3528
8 2.18 1.3616
9 2.26 1.3704
Отже
.
Відповідь: (за формулою лівих прямокутників),
Розв’язання:
Для обчислення інтеграла методом Сімпсона за умови розіб’ємо
відрізок інтегрування на 8 рівних частин з кроком
0 1.20 0.1211
1 1.25 0.1520
2 1.30 0.1782
3 1.35 0.2000
4 1.40 0.2176
5 1.45 0.2312
6 1.50 0.2410
7 1.55 0.2473
8 1.60 0.2503
0.3713 0.8305 0.6368
Отже:
Відповідь: .
Розв’язання:
Для обчислення інтеграла методом трапецій за умови розіб’ємо
відрізок інтегрування на 20 рівних частин з кроком
Отже
Відповідь: .
Приклад програми
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
double f(double x)
{
return 1/sqrt(2*x*x+1);
}
double LeftS(double a, double b, int n) // Метод лівих прямокутників
{
double s=0;
double x=a;
double h=(b-a)/double(n);
for(int i=0; i<n; i++)
{
s+=f(x);
x+=h;
}
s*=h;
return s;
}
double RightS(double a, double b, int n) // Метод правих прямокутників
{
double s=0;
double h=(b-a)/double(n);
double x=a+h;
for(int i=1; i<=n; i++)
{
s+=f(x);
x+=h;
}
s*=h;
return s;
}
double MidelS(double a, double b, int n) // Метод середніх прямокутників
{
double s=0;
double x=a;
double h=(b-a)/double(n);
for(int i=0; i<n; i++)
{
s+=f(x+h/2);
x+=h;
}
s*=h;
return s;
}
double SiS(double a, double b, int n) // Метод Сімпсона
{
double s=0;
double s1=0;
double s2=0;
double h=(b-a)/double(n);
double x=a+h;
for(int i=1; i<n; i+=2)
{
s1+=f(x);
x+=2*h;
}
x=a+2*h;
for(int i=2; i<n; i+=2)
{
s2+=f(x);
x+=2*h;
}
s+=f(a)+f(b)+s1*4+s2*2;
s*=h/3;
return s;
}
double TrS(double a, double b, int n) // Метод трапецій
{
double s=0;
double x=a;
double h=(b-a)/double(n);
for(int i=1; i<n; i++)
{
s+=f(x);
x+=h;
}
s+=f(a)/2+f(b)/2;
s*=h;
return s;
}
int main(int argc, char* argv[])
{
double a;
double b;
int n;
cout << "Integration of a function f(x)=1/sqrt(2*x*x+1) on the interval [a;b]";
cout<< endl;
cout << "a = ";
cin >> a;
cout << "b = ";
cin >> b;
cout << "Enter the number of division segments n = ";
cin >> n;
cout << "With method of left-hand rectangles:";
cout << " S = " << LeftS(a, b, n)<<endl;
cout << "With method of right-hand rectangles:";
cout << " S = " << RightS(a, b, n)<<endl;
cout << "With mid-square method:";
cout << " S = " << MidelS(a, b, n)<<endl;
cout << "With Simpson's method:";
cout << " S = " << SiS(a, b, n)<<endl;
cout << "With method of trapezoids:";
cout << " S = " << TrS(a, b, n)<<endl;
getch();
return 0; }
Контрольні питання
1) Що називають визначеним інтегралом від функції f(x)?
2) Дайте геометричну інтерпретацію поняттю визначеного інтеграла.
3) Яку фігуру називають криволінійною трапецією?
4) Сформулюйте задачу числового інтегрування.
5) Дайте геометричну інтерпретацію методу лівих прямокутників.
6) Дайте геометричну інтерпретацію методу правих прямокутників.
7) Дайте геометричну інтерпретацію методу середніх прямокутників.
8) Наведіть формулу лівих прямокутників для числового інтегрування.
9) Наведіть формулу правих прямокутників для числового інтегрування.
10) Наведіть формулу середніх прямокутників для числового інтегрування.
11) Дайте геометричну інтерпретацію методу трапецій.
12) Наведіть формулу трапецій для числового інтегрування.
13) Дайте геометричну інтерпретацію методу Сімпсона.
14) Наведіть формулу Сімпсона для числового інтегрування.
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №5
Теоретичні відомості
Найчастіше для розв’язання нелінійних алгебраїчних рівнянь виду
f ( x ) 0 (де f ( x ) – деяка неперервна нелінійна функція) застосовують
ітераційні методи, т. б. методи послідовних наближень.
Алгоритм знаходження коренів рівняння складається з двох етапів:
1) відокремлення коренів, т. б. знаходження наближеного значення кореня
або відрізка, що містить його;
2) уточнення наближеного розв’язку із деякою заданою мірою точності.
Наближене значення кореня (початкове наближення) може бути
знайдене у різний спосіб: з фізичних міркувань, з розв’язання аналогічної
задачі за інших вихідних даних, за допомогою графічних методів. Якщо такі
оцінки початкового наближення провести не вдається, то знаходять якомога
малий проміжок [а ; b], на кінцях якого неперервна функція f ( x) приймає
значення різних знаків, т. б. f (a ) f (b) 0 . В цьому випадку між точками а і b
існує принаймні одна точка, в якій f ( x) 0 .
Ітераційний процес полягає в послідовному уточненні початкового
наближення.
Метод бісекції
х 4 х 3 2 х 2 3 х 3 0 з точністю до 0.01
Розв’язання:
1) Відокремлення коренів рівняння проводимо аналітично.
Позначимо f x x x 2 x 3x 3
4 3 2
x -1 34 1
sign f x + – – – +
Оскільки відбуваються дві зміни знаків, то робимо висновок, що
рівняння має два дійсних кореня:
х1 (; 1] , x2 [1, )
Зменшимо якомога проміжки, в яких знаходяться корені:
x -2 -1 1 2
sign f x + – – +
Отже, маємо
x1 2;1, x2 1;2 .
n xn f xn f ( xn ) xn xn1
0 -2 7 -33
1 -1.787879 1.1759957 -22.29791 0.21212121
2 -1.735139 0.061515 -19.987533 0.05274018
3 -1.732061 0.0002012 -19.856836 0.00307767
Оскільки , а також , то
ітераційний процес зупиняємо. Можемо прийняти x1 1.73 .
Методом бісекції уточнимо другий корінь x2 1;2 .
Обчислення проводимо за формулою і заносимо до таблиці:
n an bn xn an bn / 2 f xn
0 1 2 1.5 -1.3125<0 1
1.5 0.144531> 0.5
1 2 1.75
0
2 1.5 1.75 1.625 -0.72437<0 0.25
3 1.625 1.75 1.6875 -0.32909<0 0.125
4 1.6875 1.75 1.71875 -0.1026<0 0.0625
1.75 0.018318> 0.03125
5 1.71875 1.734375
0
6 1.71875 1.734375 1.726563 -0.04279<0 0.015625
Оскільки , то ітераційний
процес зупиняємо. За наближене значення кореня можемо прийняти
середину відокремленого проміжку:
Приклади програм
// 1) Розв’язання нелінійного рівняння методом Ньютона
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
float F(float x)
{
float y;
y=3*pow(x, 4)+4*pow(x, 3)-12*pow(x, 2)+1;
return y;
};
float dF(float x)
{
float y;
y=12*pow(x, 3)+12*pow(x, 2)-24*x;
return y;
};
int main(int argc, char* argv[])
{
clrscr();
int p=0;
float a, b, x, e, i=0, q;
float y1, y2, x1, x2;
do {
clrscr();
cout<<"\n ROZV’JAZANNJA NELINIJNOGO RIVNJANNJA METODOM
NJUTONA: ";
cout<<"\n \n 3*x^4+4*x^3-12*x^2+1=0";
cout<<"\n \n 1) Znajtu koreni zadanogo nelinijnogo rivnjannja \n \n \n";
cout<<"2) Exit \n \n \n";
cout<<"Vash vubir(1, 2)\t";
cin>>p;
if(p==2) exit(1);
if(p==1)
{
clrscr();
cout<<"\n Vvedit promigok [a;b]:";
cout<<"\na=";
cin>>a;
cout<<"\nb=";
cin>>b;
cout<<"\nVvedit pohubky e=";
cin>>e;
i=0;
if(a>b)
{
x=a;
a=b;
b=x;
}
cout<<"\n\nKoreni:\n";
for(x=a; x<b; x+=e*100)
{
y1=F(x);
y2=F(x+e*100);
if(((y1>0)&&(y2<0))||((y1<0)&&(y2>0)))
{
i++;
do {
x1=x;
x2=x1-F(x1)/dF(x1);
x1=x2;
q=fabs(x1-x2);
} while(q>e);
cout<<"\nx"<<i<<"="<<x1<<"\n";
}
}
}
getch();
} while(p!=2);
getch();
return 0;
}
// 2) Розв’язання нелінійного алгебраїчного рівняння методом бісекції
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
int const W=60;
int const M=W*1;
float const CY=0.1;
int const CX=1;
char ss[11];
int gd, gm, errorcode;
int flag, x1, y1, z, k, q, s, i, l;
float x, y, a, b, t, p, p1, p2, n, c;
char ch;
float f(float x)
{
return 3*pow(x, 4)+4*pow(x, 3)-12*pow(x, 2)+1;
}
void calc()
{
clrscr();
cout<<"Vvedit promigok [a;b]:";
cout<<"\na=";
cin>>a;
cout<<"\nb=";
cin>>b;
if (a>=b) goto A;
cout<<"\nVvedit pohubky e=";
cin>>t;
p1=a; p2=b; p=(p1+p2)/2; n=1; q=0; z=6; k=5; i=1;
do {
n*=10;
q++;
} while (n*t<1);
if (f(p1)*f(p2)>0) goto A;
y=f(p);
cout<<"f("<<p<<")="<<y<<endl;
do {
if (f(p1)*f(p)<0)
{
p1=p1;
p2=p;
p=(p1+p2)/2;
}
else
{
p1=p;
p2=p2;
p=(p1+p2)/2;
}
z++; i++;
y=f(p);
cout<<"f("<<p<<")="<<y<<endl;
if (z==21)
{
k=42;
l=z;
z=5;
}
} while (fabs(f(p))>t);
c=fabs((p1-p2)/2);
cout<<"Koren' rivnjannja x="<<p<<endl;
getch();
goto C;
A:
cout<<"Na zadanom intervali koreniv nema ";
getch();
C:
}
int main(int argc, char* argv[])
{
B: clrscr();
cout<<"\nRivnjannja 3x^4+4x^3-12x^2+1=0 \n \n";
cout<<"1) Exit \n \n";
cout<<"2) Rozvjazok rivnjannja metodom bisekcii \n \n";
cout<<"Vash vybir (1, 2): ";
cin>>ch;
if (ch=='1') exit(0);
if (ch=='2')
{
calc();
goto B;
}
if (ch==13) goto D;
else goto B;
D: calc();
goto B;
}
Контрольні питання
1) Сформулюйте задачу числового розв’язання нелінійних рівнянь.
2) Наведіть алгоритм числового розв’язання нелінійного рівняння.
3) У чому полягає етап відокремлення коренів нелінійного рівняння?
4) У чому полягає етап уточнення коренів нелінійного рівняння?
5) Наведіть умови відокремлення коренів нелінійного рівняння.
6) Назвіть відомі вам методи відокремлення коренів нелінійного рівняння.
7) Назвіть відомі вам методи уточнення коренів нелінійного рівняння.
8) Наведіть алгоритм уточнення коренів нелінійного рівняння методом
бісекції.
9) Дайте геометричну інтерпретацію методу бісекції.
10) Наведіть розрахункову формулу методу бісекції.
11) Наведіть критерій зупинки ітераційного процесу методу бісекції.
12) Наведіть алгоритм уточнення коренів нелінійного рівняння методом
Ньютона (дотичних).
13) Дайте геометричну інтерпретацію методу Ньютона (дотичних).
14) Наведіть розрахункову формулу методу Ньютона (дотичних).
15) Наведіть критерій зупинки ітераційного процесу методу Ньютона
(дотичних).
16) Наведіть правила вибору початкового наближення методу Ньютона
(дотичних).
КОМП’ЮТЕРНИЙ ПРАКТИКУМ №6
Теоретичні відомості
Найпростішим звичайним диференційним рівнянням є рівняння
першого порядку:
F ( x, y , y ) 0 (1)
Розв’язком диференційного рівняння (1) називають всяку функцію
початкову умову): Y x0 Y0 .
Метод Ейлера
Y '( xi ) f ( xi , Y ( xi )) f ( xi , yi ).
Враховуючи введені позначення та нехтуючи членами, що містять
похідні другого й вищих порядків, з рівняння (2) отримуємо формулу:
yi 1 yi hf ( xi , yi ), i 0,1,2,... (3)
y1 y 0 hf x0 , y0 .
i xi yi
0 0 1
1 0.2 0.8919
2 0.4 0.8061
3 0.6 0.7455
4 0.8 0.7115
5 1 0.7035
i xi yi
0 0 1
1 0.2 0.9030
2 0.4 0.8316
3 0.6 0.7882
4 0.8 0.7734
5 1 0.7862
Приклади програм
// 1) Розв’язання задачі Коші для звичайного диференційного рівняння
першого порядку методом Ейлера
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
float a, b, h, n;
int i, k, punkt=0;
float X[100], Y[100], F[100];
do{
cout<<endl<<"ZDR. Metod Eilera."<<endl;
cout<<"y'=sin(x)-cos(y)"<<endl<<endl;
cout<<"1) Obchuslutu zi standartnumu znachenyamu a, b, h"<<endl;
cout<<"2) Vvestu znachenya a, b, h."<<endl;
cout<<"3) Vuhid."<<endl;
cin>>punkt;
if (punkt==1)
{
clrscr();
a=0;
b=1;
X[0]=0;
Y[0]=1;
h=0.2;
n=(b-a)/h;
cout<<endl<<"Metod Eilera:"<<endl<<endl;
for (int i=0; i<=n; i++)
{
X[i+1]=X[i]+h;
Y[i+1]=Y[i]+h*(sin(X[i])-cos(Y[i]));
cout<<X[i]<<'\t'<<Y[i]<<endl;
}
getch();
}
if (punkt==2)
{
clrscr();
cout<<"Vvedit pochatok vidrizku [a;b]: a=";
cin>>a;
cout<<"Vvedit kinets vidrizku [a;b]: b=";
cin>>b;
cout<<"Vvedit krok h=";
cin>>h;
cout<<"Pochatkova umova: y("<<a<<")=";
cin>>Y[0];
X[0]=a;
n=(b-a)/h;
cout<<endl<<"Metod Eilera:"<<endl;
for (int i=0; i<=n; i++)
{
X[i+1]=X[i]+h;
Y[i+1]=Y[i]+h*(sin(X[i])-cos(Y[i]));
cout<<X[i]<<'\t'<<Y[i]<<endl;
}
getch();
}
if (punkt==3)
{
exit(1);
}
}while(punkt!=3);
getch();
}
// 2) Розв’язання задачі Коші для звичайного диференційного рівняння
першого порядку методом Ейлера-Коші
#include <conio.h>
#include <cmath>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]){
float a, b, h, n;
int i, k, punkt=0;
float X[100], Y[100], F[100];
do{
cout<<endl<<endl<<endl<<"ZDR. Metod Eilera z utochnenyam."<<endl;
cout<<"y'=sin(x)-cos(y)"<<endl<<endl;
cout<<"1) Obchuslutu zi standartnumu znachenyamu a, b, h"<<endl;
cout<<"2) Vvestu znachenya a, b, h."<<endl;
cout<<"3) Vuhid."<<endl<<endl;
cin>>punkt;
if (punkt==1)
{
clrscr();
a=0;
b=1;
X[0]=0;
Y[0]=1;
h=0.2;
n=(b-a)/h;
cout<<endl<<"Metod Eilera z utochnenyam:"<<endl<<endl;
for (int i=0; i<=n; i++)
{
X[i+1]=X[i]+h;
Y[i+1]=Y[i]+h/2*(sin(X[i])-cos(Y[i])+sin(X[i+1])-cos(Y[i]+
h*(sin(X[i])-cos(Y[i]))));
cout<<X[i]<<'\t'<<Y[i]<<endl;
}
getch();
}
if (punkt==2)
{
clrscr();
cout<<"Vvedit pochatok vidrizku [a;b]: a=";
cin>>a;
cout<<"Vvedit kinets vidrizku [a;b]: b=";
cin>>b;
cout<<"Vvedit krok h=";
cin>>h;
cout<<"Pochatkova umova: y("<<a<<")=";
cin>>Y[0];
X[0]=a;
n=(b-a)/h;
cout<<endl<<"Metod Eilera z utochnenyam:"<<endl;
for (int i=0; i<=n; i++)
{
X[i+1]=X[i]+h;
Y[i+1]=Y[i]+h/2*(sin(X[i])-cos(Y[i])+sin(X[i+1])-cos(Y[i]+
h*(sin(X[i])-cos(Y[i]))));
cout<<X[i]<<'\t'<<Y[i]<<endl;
}
getch();
}
if (punkt==3)
{
exit(1);
}
}while(punkt!=3);
getch();
return 0;
}
Контрольні питання
1) На які основні групи поділяють наближені методи розв’язання
диференційних рівнянь?
2) Що називають розв’язком диференційного рівняння?
3) Сформулюйте задачу Коші.
4) Наведіть алгоритм знаходження розв’язку задачі Коші для звичайного
диференційного рівняння методом Ейлера?
5) В якій формі можна отримати розв’язок диференційного рівняння за
методом Ейлера?
6) Наведіть алгоритм знаходження розв’язку задачі Коші для звичайного
диференційного рівняння методом Ейлера з уточненням?
7) Чому метод Ейлера відносять до одно крокових методів розв’язання
диференційних рівнянь?
СПИСОК ЛІТЕРАТУРИ