Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Метод дихотомии (половинного деления)
Данный метод основывается на утверждении, что если на отрезке [a; b] содержится корень уравнения, то значения f(a) и f(b) имеют разные знаки, т.е. f(a)·f(b)< 0.
Схема метода
Отрезок делится пополам – середина обозначается через точку c (рис.14). Если |a-b|> =eps, то вычисле-ния продолжаются. Эта проверка означает, что если |a-b|< eps, то длина отрезка, на котором находится корень уравнения, достаточна мала и вычисления можно прекратить, а за значение корня можно взять середину этого отрезка, т.е. корень уравнения вычислен с заданной точность eps. Происходит проверка f(a)·f(c)< 0 или нет. Если да, то значение c присваивается перемен-ной b, иначе значение c присваива-ется переменной a. Если |a-b|> =eps, то опять происходит проверка f(a)·f(c)< 0 или нет. Если да, то значение c присваивается переменной b, иначе значение c присваивается перемен- ной a и т.д. Графически этот метод изображен на рис.14.
Опишем алгоритм и соответствующую программу для нахождения корней уравнения ln(x-3)=0 на отрезке [3.5; 5] с помощью этого метода:
Алгоритм
| Программа
| объявление вещ: fa, fb, fc, a, b, c, eps
ввод а
ввод b
fa=ln(a-3)
fb=ln(b-3)
если fa*fb< 0
ввод eps
c=(a+b)/2
fc=log(c-3)
пока (|a-b|> =eps)
если (fa*fc< 0)
b=c
иначе
a=c;
всё если
c=(a+b)/2
fa=ln(a-3)
fb=ln(b-3)
fc=ln(c-3)
всё пока
печать c
печать fc
иначе
печать “на отрезке нет корня”
все_если
| #include " stdio.h"
#include " math.h"
#include " iostream.h"
#include " iomanip.h"
int main()
{
float fa, fb, fc, a, b, c, eps;
cout< < " a=";
cin> > a;
cout< < " b=";
cin> > b;
fa=log(a-3);
fb=log(b-3);
if(fa*fb< 0)
{
cout< < " eps=";
cin> > eps;
c=(a+b)/2;
fc=log(c-3);
while(fabs(a-b)> =eps)
{
if(fa*fc< 0)
b=c;
else
a=c;
//вычисляется новая середина
//отрезка
c=(a+b)/2;
//вычисляются значения
//функций в новых точках
fa=log(a-3);
fb=log(b-3);
fc=log(c-3);
}
cout< < " корень уравнения х*=" < < c< < endl;
cout< < " значение f(x*)=" < < fc< < endl;
}
else
cout< < " неверно введены концы"
< < " отрезка" < < endl;
return 1;
}
|
|