МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра ЗІ
/
Звіт
до лабораторної роботи №1
з курсу: «Комп’ютерні методи дослідження інформаційних процесів та систем»
на тему: «Методи уточнення коренів нелінійних рівнянь»
Метод половинного ділення
Теоретичні відомості
Метод поділу проміжку навпіл
Цей метод відомий також за назвами методу бісекцій або методу дихотомії. Це простий і надійний алгоритм уточнення коренів рівняння (1).
Суть методу полягає в тому, що відрізок ділиться навпіл, тобто вибирається перше наближення кореня (Рис.1):
(3)
Якщо , тоді є коренем рівняння (1).
Рис.1.
Якщо , то вибирають той з відрізків чи , на кінцях якого функція має різні знаки. Обраний відрізок знову ділять навпіл і т.д. Процес обчислень проводиться доти, доки величина відрізку не стане меншою від заданої похибки Е.
Метод досить стійкий до похибок заокруглень. Але й збігається теж повільно. При збільшенні точності значно зростає об’єм обчислень. Тому на практиці метод часто використовують для грубого визначення початкового наближення кореня, а далі застосовують швидко збіжний ітераційний метод.
Метод бісекцій збігається для будь-яких неперервних функцій. Кількість ітерацій, необхідних для досягнення точності E, оцінюють співвідношенням:
Завдання
Знайти корінь рівняння з граничною абсолютною похибкою Е = 10–4, відокремлений на відрізку [a, b]. Методи чисельного розв’язування задаються викладачем.
Варіант
Рівняння
Відрізок
22
4x2 – cos x – 4= 0
[1;1.2]
Блок-схема алгоритму програми
Список індефікаторів, констант, змінних, функцій, використаних у блок-схемі алгоритму і програмі, та їх пояснення
X1 – змінна дійсного типу, яка є початком проміжку;
X2 – змінна дійсного типу, яка є кінцем проміжку;
Е – змінна дійсного типу, яка є граничною абсолютною похибкою;
Cout – метод виводу даних;
Cin – метод вводу даних дійсного типу;
Текст програми
#include <iostream>
#include <cmath>
using namespace std;
float f(float x)
{
return 4*x*x - cos (x) - 4;
}
float n(float x1, float x2)
{
float x = (x2 + x1) / 2;
while (abs(f(x)) > 0.0001)
{
if (f(x) > 0)
x2 = x;
else
x1 = x;
x = (x2 + x1) / 2;
}
return x;
}
int main()
{
cout << n(1, 1.2) << endl;
}
Розв’язування нелінійного рівняння в системі MatLab
f = @(x) 4 * x * x -cos(x) - 4;
options = optimset('Display','iter','TolFun',1e-10);
optnew = optimset(options,'TolX',1e-10);
z = fzero(f, [1 2],optnew);
fprintf('z=%6.18f\n',z)
Func-count x f(x) Procedure
2 1 -0.540302 initial
3 1.0417 -0.164185 interpolation
4 1.05967 0.0024194 interpolation
5 1.05941 -1.96193e-005 interpolation
6 1.05941 -2.30546e-009 interpolation
7 1.05941 8.88178e-016 interpolation
Zero found in the interval [1, 2]
z=1.059408769070037600
Результат роботи програми
Висновок:
В даній лабораторній роботі я ознайомився з методами уточнення коренів нелінійних рівнянь з одним невідомим. Також навчився писати та підлагоджувати програми за алгоритмом методу половинного ділення для уточнення коренів нелінійних рівнянь