КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Метод Рибакова
Метод Рибакова призначений для визначення всіх дійсних коренів рівняння f(x) = 0 на відрізку [а, b]. Для збіжності цього методу достатньо, щоб f(x) була безперервною, а похідна цієї функції обмежена на всьому відрізку [а, b]. Потрібно визначити M > max|f'(x)| на цьому відрізку. Відмітимо, що завищення M не порушує збіжності методу, а тільки уповільнює її. Як початкове наближення вибирається лівий кінець відрізку – x0 = а. Для кожного n обчислюють чергове наближення за формулою: xn+1 = xn + |f(xn)|/M. При цьому перевіряється умова xn+1<b. Якщо вона не виконана, то вважається, що всі корені знайдені, інакше продовжують обчислення, перевіряючи нерівність: |f(xn)|<e. Якщо нерівність виконана, то вважають, що xn черговий корінь рівняння f(x). Далі вважають xn+1 = xn + e та продовжують процес знаходження коренів за формулою. Таким чином знаходяться всі дійсні корені без урахування їх кратності. Цей метод нагадує модифікований метод Ньютона. Слід відмітити, що збіжність методу Рибакова достатньо повільна. Наведемо фрагмент програми реалізації методу Рибакова на прикладі рівняння x2 + 5x + 6 = 0 (проміжок пошуку коренів [-1000; 1000]).
#include <iostream> #include <cmath> using namespace std;
#include <conio.h>
double func(double x) { return x*x + 5*x + 6; }
double difer(double x,double h) { return (func(x+h)-func(x-h))/(2*h); }
// Розв’язання рівняння методом Рибакова // (знаходження всіх дійсних коренів)
void main() { double a,b,h,x,y,y1,m,eps,difa,difb;
a = -1000; b = 1000;
eps = 0.00000001; h = eps;
// Знаходження максимального модулю похідної // на заданому відрізку
difa = fabs(difer(a,h)); difb = fabs(difer(b,h));
m = (difa>difb)?difa:difb; m++; //////////////////////////////
x = a; do { y = func(x); y1 = difer(x,h); if(fabs(y1)>=m) { cout<<"\nПерша похідна функції повинна бути менше m по модулю !"; getch(); exit(0); }
if(fabs(y)<eps) { cout<<"\nКорінь рівняння x="<<x; x+=10*eps; y=func(x); }
x+=fabs(y/m);
}while(x<b);
getch(); }
Важливим у даному фрагменті є вибір максимальної похідної на заданому відрізку (величина m). У якості варіанта запропоновано знайти максимальне значення похідної по абсолютній величині на кінцях відрізку. Результат виконання програми:
Корінь рівняння x = -3 Корень рівняння x = -2
Контрольні питання
1. Які ви знаєте чисельні методи розв’язання алгебраїчних рівнянь? 2. Розкрийте сутність методу половинного ділення розв’язання алгебраїчних рівнянь. Наведіть фрагмент програми. 3. Розкрийте сутність методу Ньютона розв’язання алгебраїчних рівнянь. Наведіть фрагмент програми. 4. Розкрийте сутність методу Рибакова розв’язання алгебраїчних рівнянь. Наведіть фрагмент програми.
|