Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_1_05_ВНУ.doc
Скачиваний:
2
Добавлен:
08.09.2019
Размер:
1.71 Mб
Скачать

Наближене знаходження коренів рівнянь Дослідження рівняння. Відокремлення коренів

Нехай задано неперервну функцію y=f(x) і потрібно знайти деякі або всі корені рівняння

f(x) = 0. (1)

Здебільшого, як відомо, корені рівняння (1) можна знайти лише наближено. Для знаходження наближених значень коренів даного рівняння з потрібною точністю доводиться розв'язувати такі задачі: 1) досліджувати кількість коренів та їх розміщення; 2) знаходити наближені значення коренів; 3) обчислювати потрібні корені з необхідною точністю.

Перші дві задачі розв'язують аналітичними і графічними методами. Наприклад, складають таблицю функції f(х), і якщо в двох сусідніх вузлах таблиці функція має різні знаки, то між ними лежить принаймні один корінь. Для відокремлення коренів інколи вдається використати властивості функції f(х), її графік тощо.

Розглянемо графічний метод. Для наближеного розв'язання рівняння f(х)=0 будують графік функції у = f(х). Абсциси точок перетину цього графіка з віссю абсцис і є коренями рівняння f(х)=0.

Оскільки, практично графік функції у=f(х) точно побудувати неможливо, то цим методом можна визначити лише наближені значення коренів рівняння f(х) = 0.

Графічний метод не дає можливості знайти корінь рівняння з наперед заданою точністю, і тому найчастіше його використовують для знаходження початкового, наближеного розв'язку та для визначення меж, в яких міститься розв'язок.

Наближені значення кореня уточнюють різними ітераційними методами. Розглянемо деякі з них.

Метод поділу проміжку пополам

Н ехай на проміжку [а; b] функція f(х) неперервна і набуває на кінцях проміжку значень різних знаків, тобто f(а)•f(b) < 0. Це означає, що на [а; b] рівняння (1) має принаймні один корінь. Цей корінь можна визначити з наперед заданою точністю методом поділу проміжку пополам.

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

Позначимо лівий кінець проміжку, на якому міститься корінь, буквою u, правий – буквою v і знайдемо середину цього проміжку: х = (u+v)/2. Оскільки (за умовою) f(u)f(v)<0, то f(x)f(a)>0, або f (х) f (а)< 0

Якщо f(x) = 0, то корінь х* = х.

Зрозуміло, що у випадку f(х)f(а)>0 корінь міститься на проміжку [x; v].

У випадку f(х)f(а)<0 корінь міститься на проміжку [u; х]. Якщо довжина проміжку, на якому міститься корінь, не перевищує заданої величини , то це означає, що х* знайдено з точністю до , бо |х - х*| x-u. Якщо заданої точності ще не досягнуто, то, позначивши х через u у випадку f(х) f(а) > 0 або через v у випадку f(х)f(а)<0, знову знаходимо середину проміжку [u; v] і повторюємо обчислення.

Переконатися в тому, що потрібна точність при обчисленні кореня х* уже досягнута, можна й іншим способом. Якщо на деякому проміжку [u; v] функція f(х) диференційовна і 0 < m |f(х)| (у цьому випадку на [u; v] міститься єдиний корінь рівняння f(х) = 0) і якщо

то можна вважати, що х — наближене значення кореня х* з точністю до .

Приклад.

Методом поділу проміжку пополам знайти з точністю до 0,005 корінь рівняння x3+1,76439x2+2,21584x – 3,31344 = 0, що лежить на проміжку [0;1].

Розв’язання.

Як бачимо, проміжок локалізації кореня рівняння нам задано: [0;1], тобто залишилось скласти програму для даної задачі. Оскільки точність наближеного визначення кореня буде визначати момент закінчення циклу, то, очевидно, доцільно скористатись в даному випадку циклом з умовою. Той факт, що проміжок локалізації кореня значно перевищує точність, то наперед можна сказати, що як мінімум один раз тіло циклу буде виконуватись, а отже ми можемо використовувати як цикл з передумовою, так і цикл з післяумовою без будь-яких обмежень. Один з варіантів програми реалізації поставленої задачі може виглядати так:

program Podil;

const e = 0.005;

var a, b, c, d, y1, у2: real;

begin

writeln (’ввести значення кінців проміжка локалізації кореня’);

readln (a, b);

repeat

c:=(a+b)/2;

y1:=a*a*a+1.76439*a*a+2.21584*a – 3.31344;

y2:=c*c*c+1.76439*c*c+2.21584*c – 3.31344;

if y1*y2<0 then b:=c else a:=c;

d:=b-a;

until d >= e;

writeln (‘x*=’,c,’+-e’);

end.

Результатом розв’язку даної задачі буде х*=0,785  0,005;