Метод бісекціїМетод бісекції або метод поділу відрізка навпіл — найпростіший чисельний метод для вирішення нелінійних рівнянь виду f(x)=0. Передбачається тільки безперервність функції f(x). Пошук ґрунтується на теоремі про проміжні значення. ОбґрунтуванняАлгоритм заснований на наступному наслідку з теореми Больцано — Коші:
Таким чином, якщо ми шукаємо нуль, то на кінцях відрізка функція повинна бути протилежних знаків. Розділимо відрізок навпіл і візьмемо ту з половинок, на кінцях якої функція як і раніше приймає значення протилежних знаків. Якщо значення функції в серединній точці виявилося потрібним нулем, то процес завершується. Точність обчислень задається одним з двох способів:
Процедуру слід продовжувати до досягнення заданої точності. Для пошуку довільного значення досить відняти від значення функції шукане значення і шукати нуль функції що вийшла. Опис алгоритмуЗавдання полягає в знаходженні коренів нелінійного рівняння Для початку ітерацій необхідно знати відрізок значень , на кінцях якого функція приймає значення протилежних знаків. Протилежність знаків значень функції на кінцях відрізка можна визначити багатьма способами. Один з безлічі цих способів — множення значень функції на кінцях відрізка і визначення знака похідної шляхом порівняння результату множення з нулем: в дійсних обчисленнях такий спосіб перевірки протилежності знаків при крутих функціях призводить до передчасного переповнення. Для усунення переповнення і зменшення витрат часу, тобто для збільшення швидкодії, на деяких програмно-комп'ютерних комплексах протилежність знаків значень функції на кінцях відрізка потрібно визначати за формулою: так як одна операція порівняння двох знаків двох чисел вимагає меншого часу ніж дві операції: множення двох чисел (особливо з плаваючою комою і подвійною довжиною) і порівняння результату з нулем. При даному порівнянні, значення функції в точках і можна не обчислювати, досить обчислити тільки знаки функції в цих точках, що вимагає меншого машинного часу. З безперервності функції і умови (2.2) випливає, що на відрізку існує хоча б один корінь рівняння (в разі не монотонної функції функція має кілька коренів і метод призводить до знаходження одного з них). Знайдемо значення в середині відрізка: в дійсних обчисленнях, для зменшення числа операцій, на початку, поза циклом, обчислюють довжину відрізка за формулою: а в циклі обчислюють довжину чергових нових відрізків за формулою: і нову середину за формулою: Обчислимо значення функції в середині відрізка :
Тепер знайдемо новий відрізок, на якому функція змінює знак:
За кількість ітерацій поділ навпіл здійснюється раз, тому довжина кінцевого відрізка в разів менше довжини вихідного відрізка. Існує схожий метод, але з критерієм зупинки обчислень по осі [1], в цьому методі обчислення тривають до тих пір, поки, після чергового поділу навпіл, новий відрізок більше заданої точності по осі : . У цьому методі відрізок на осі може досягти заданої величини , а значення функцій (особливо крутих) на осі можуть дуже далеко стояти від нуля, при пологих же функціях цей метод призводить до великої кількості зайвих обчислень. У дискретних функціях і — це номера елементів масиву, які не можуть бути дробовими, і, в разі другого критерію зупину обчислень, різниця не може бути менше . ПсевдокодНехай
Тоді алгоритм методу бісекції можна записати в псевдокоді наступним чином:
Пошук значення кореня монотонної дискретної функціїПошук найбільш наближеного до кореня значення в монотонної дискретної функції, заданої таблично і записаної в масиві, полягає в розбитті масиву навпіл (на дві частини), виборі з двох нових частин тієї частини, в якій значення елементів масиву змінюють знак шляхом порівняння знаків серединного елемента масиву зі знаком граничного значення і повторенні алгоритму для половини в якій значення елементів масиву змінюють знак. Нехай змінні ліваГраниця і праваГраниця містять, відповідно, ліву лівГран и праву правГран межі масиву, в якій знаходиться наближення до кореня. Дослідження починається з розбиття масиву навпіл (на дві частини) шляхом знаходження номера середнього елемента масиву середина . Якщо знаки значень масиву масив[ліваГраниця] та масив[середина] протилежні, то наближення до кореня шукають в лівій половині масиву, тобто значенням праваГраниця стає середина і на наступній ітерації досліджується тільки ліва половина масиву. Якщо знаки значень масив[ліваГраниця] і масив[середина] однакові, то здійснюється перехід до пошуку наближення до кореня в правій половині масиву, тобто значенням змінної ліваГраниця стає середина і на наступній ітерації досліджується тільки права половина масиву. Т.о., в результаті кожної перевірки область пошуку звужується вдвічі. Наприклад, якщо довжина масиву дорівнює 1023, то після першого порівняння область звужується до 511 елементів, а після другого — до 255. Т.о. для пошуку наближення до кореня в масиві з 1023 елементів досить 10 проходів (ітерацій). ліваГраниця = лівГран
праваГраниця = правГран
while (праваГраниця - ліваГраниця > 1) {
довжинаВідрізка = правГран - лівГран
половинаВідрізка = int(довжинаВідрізка / 2)
середина = ліваГраниця + половинаВідрізка
if (sign(масив[ліваГраниця]) ≠ sign(масив[середина]))
праваГраниця = середина
else
ліваГраниця = середина
}
printf середина
Див. також
Примітки
Джерела
Посилання
|
Portal di Ensiklopedia Dunia