Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по С++.doc
Скачиваний:
34
Добавлен:
15.12.2018
Размер:
2.31 Mб
Скачать

1.2. Метод хорд

Метод основывается на утверждении, что если на отрезке [a;b] содержится корень уравнения, то значения f(a) и f(b) имеют разные знаки, т.е. f(a)·f(b)<0.

Схема метода аналогична предыдущему. Разница заключается в поиске значения точки c. Для этого в методе хорд используется уравнение хорды – прямой, проходящей через две точки некоторой кривой. Возьмём т.А(a;f(a)) и т.B(b;f(b)) на кривой y=f(x). Уравнение прямой проходящей через эти точки . Пусть первая координата т.С(с;0) – корень уравнения f(x)=0. Подставим координаты точки C в полученное уравнение. В итоге получаем уравнение для получения значений точек сi при вычислении корня исходного уравнения:

.

Вычисляется точка c. Если |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 и т.д. Графически этот метод изображен на рис.15.

Опишем алгоритм и соответствующую программу для нахождения корней уравнения 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=а-(b-a)*fa/ (fb-fa)

fc=log(c-3)

пока (|a-b|>=eps )

если (fa*fc<0)

b=c

иначе

a=c;

всё если

c=а-(b-a)*fa/ (fb-fa)

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= а-(b-a)*fa/ (fb-fa);

fc=log(c-3);

while(fabs(a-b)>=eps)

{

if(fa*fc<0)

b=c;

else

a=c;

//вычисляется новое значение с

c=а-(b-a)*fa/ (fb-fa);

//вычисляются значения

//функций в новых точках

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;

}