МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний Університет „Львівська Політехніка”
Звіт до лабораторної роботи №2
на тему:
„ЧИСЕЛЬНЕ РОЗВ’ЯЗУВАННЯ
НЕЛІНІЙНИХ РІВНЯНЬ”
Варіант 21п
f (x) = = 0.
Завдання:
Графічно відокремити корені рівняння, побудувавши графік функції y = f(x) за допомогою ЕОМ (наприклад, використати пакет програм Maple).
Використовуючи будь-яку з відомих Вам мов програмування, розв’язати задачу на ЕОМ з точністю ε = 0.001 методом ділення навпіл.
Уточнити одержаний результат з точністю ε = 0.00001 за допомогою методу послідовних наближень. Перевірити умови застосування вибраного чисельного методу.
Розв’язання:
1. Графічно відокремлюю корені рівняння, будуючи графік функції y = f(x) за допомогою ЕОМ, використовуючи пакет програм Maple.
2. Використовуючи мову програмування С++, розв’язую задачу на ЕОМ з точністю ε = 0.001 методом ділення навпіл. З результатів, отриманих з попередньої частини завдання очевидно, що розв’язок рівняння єдиний і лежить в інтервалі [0..1]. Ці межі використовую як вхідні дані для другої частини завдання. В основі методу лежить перевірка добутку значень функції на краях інтервалу: якщо він <0, то на цьому інтервалі є корінь і навпаки – якщо >0, то немає. Щоразу зменшуючи довжину інтервалу вдвічі в результаті прийдемо до такої довжини інтервалу, яка буде < ε і тоді припинемо роботу. Число x, що лежатиме посередині останнього інтервалу і буде шуканим.
Уточнюю одержаний результат з точністю ε = 0.00001 за допомогою методу послідовних наближень. Він полягає у заміні рівняння f(x)=0 на еквівалентне: x = φ (x), де φ (x) = x + ρ (x)*f (x), а ρ (x) – довільна функція, що не має коренів в інтервалі [0..1], зокрема ρ (x) ≡ 1.
Метод простої ітерації визначається формулою:
xn+1= φ (xn), n = 0,1,2,...,
де n – номер ітерації, x0 – початкове наближення.
Перевіряю умови застосування вибраного чисельного методу:
Як видно з графіка функції, зробленого на Maple, розв’язок рівняння єдиний і лежить в межах (0,4; 0,7). Потрібно вибрати таку функцію φ (x), щоб вона задовольняла умови збіжності методу простих ітерацій ( |φ΄(x)| < 1, φ (x) є [a,b] x є [a,b]).
Такою функцією є φ (x) = e-x, що отримана з функції f (x) = = 0 наступним шляхом:
;
e-x = x.
xn+1 = .
Справді, |(e-x)΄| = |(-e-x)| = e-x < 1, x є [0,4;0,7], оскільки функція спадна і невід’ємна, а отже максимальне її значення при x = 0,4 і дорівнює ≈ 0,67. Мінімальне – при x = 0,7 і дорівнює ≈ 0,49. Отже, φ (x) є [0,4;0,7] x є [0,4;0,7].
На основі цієї формули і проводитимо розв’язання методом простої ітерації.
Код програми на мові С++:
#include <fstream.h>
#include <math.h>
float a,b,xmiddle,e1,e2,f,max;
int lichylnyk;
float function(float); // функція f(x)=0;
float function (float x)
{
return exp(-x/2)-sqrt(x);
}
void main()
{
lichylnyk=0;
cout<<"Vvedit tochnist:"<<'\n';
cin>>e1;
a=0;
b=1;
do
{ //
lichylnyk++; //
xmiddle=(b+a)/2; // метод половинного
if (function(a)*function(xmiddle)<0) // ділення
b=xmiddle; //
else a=xmiddle; //
} //
while (fabs(b-a)>e1); //
f=function((b+a)/2);
cout<<"Rezultat metodu dilennja navpil:"<<'\n'; // вивід результатів
cout<<"X = "<<(b+a)/2<<'\n';
cout<<"F = "<<f<<'\n';
cout<<"Kilkist iteracij: "<<lichylnyk<<'\n';
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
cout<<"Vvedit tochnist:"<<'\n';
cin>>e2;
cout<<"Vvedit livu mezhu:"<<'\n';
cin>>a;
while (a<=0)
{
cout<<"Nekorektna mezha. Vvedit shche raz!"<<'\n';
cin>>a;
}
cout<<"Vvedit pravu mezhu:"<<'\n';
cin>>b;
while (b<=a)
{
cout<<"Nekorektna mezha. Vvedit shche raz!"<<'\n';
cin>>b;
}
while((exp(-a)>=1) || (exp(-a)>b) || (exp(-b)<a)) // перевірка умов збіжності
{
cout<<"!!!V cykh mezhax metod prostoji iteracii ne vykonujetsja!!!"<<'\n';
cout<<"Vvedit livu mezhu:"<<'\n';
cin>>a;
while (a<=0)
{
cout<<"Nekorektna mezha. Vvedit shche raz!"<<'\n';
cin>>a;
}
cout<<"Vvedit pravu mezhu:"<<'\n';
cin>>b;
while (b<=a)
{
cout<<"Nekorektna mezha. Vvedit shche raz!"<<'\n';
cin>>b;
}
}
a=(b+a)/2;
lichylnyk=0;
do //
{ //
lichylnyk++; // метод простих
b=exp(-a); // ітерацій
f=exp(-b); //
max=fabs(b-a); //
a=b; //
} //
while ((max>e2) && (fabs(f)>e2)); //
cout<<"Rezultat metodu prostykh iteracij:"<<'\n';
cout<<"X = "<<b<<'\n';
cout<<"F = "<<f<<'\n';
cout<<"Kilkist iteracij: "<<lichylnyk<<'\n';
}
Результат:
Висновок: лабораторна робота складалася з трьох частин: спершу я намалював графік за допомогою Maple (корінь рівняння виявився єдиним, тому відокремлювати корені не довелось); в другій частині я уточнив корінь (ε = 0.001) за допомогою методу ділення навпіл (цей метод не дуже ефективний, бо має повільну збіжність); в третій частині я ще більше уточнив корінь (ε = 0.00001) за допомогою методу послідовних наближень, перевіривши спершу умови застосування цього методу.
СПИСОК ЛІТЕРАТУРИ
Бахвалов Н.С., Жидков Н.П., Кобельков Г.М.. Численные методы.-М.:Наука, 1987.
Гаврилюк І.П., Макаров В.Л. Методи обчислень. –К.:Вища школа, 1995, ч.1, ч.2.
Данилович В., Кутнів М. Чисельні методи.-Львів:Кальварія, 1998.
Калиткин Н.Н. Численные методы.-М.:Наука, 1978.
Самарский А.А., Гулин А.В. Численные методы. - М.:Наука, 1989.
Трифонов Н.П., Пасхин Е.Н. Практикум работы на ЭВМ.-М.: Наука, 1982.