Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика (лекции).doc
Скачиваний:
54
Добавлен:
19.03.2016
Размер:
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;

return1;

}

1.3. Метод касательных (Ньютона)

Метод основывается на утверждении, что если на отрезке [a;b] содержится корень уравнения, то значения f(a) иf(b) имеют разные знаки, т.е. f(a)·f(b)<0. Точность вычислений зависит от выбора точки, с которой начинаются вычисления. Выбор начальной точки x0 вычислений определяет условие . Схема метода аналогична предыдущим. Разница заключается в поиске значения точкиc. Для этого в методе касательных используется уравнение касательной к графику функции: . Пусть первая координата т.С(сi;0) – корень уравнения f(x)=0. Подставим координаты точки C в полученное уравнение. В итоге получаем уравнение для получения значений точек сi при вычислении корня исходного уравнения:

.

Если |ci-ci-1|>=eps, то вычисления продолжаются. Если |ci-ci-1|<eps, то вычисления можно прекратить, а за значение корня взять одно из этих значений, т.е. корень уравнения вычислен с заданной точность eps. Если нет, то вычисляется новое значение сi и т.д. Графически этот метод изображен на рис.16.

Опишем алгоритм и соответствующую программу для нахождения корней уравнения ln(x-3)=0 на отрезке [3.5;5] с помощью этого метода:

Алгоритм

Программа

объявление вещ: f_2p,fa,fb,a,b,c,c1,eps

ввод а

ввод b

fa=ln(a-3)

fb=ln(b-3)

если fa*fb<0

ввод eps

f_2p=-1/(a-3)2

если fa*f_2p>0

c1=a

иначе

c1=b

все_если

c=c1-ln(c1-3)/(1/(c1-3))

пока (|c-c1|>=eps)

c1=c

c=c1-ln(c1-3)/(1/(c1-3))

всё_цикл

печать c

печать ln(c-3)

иначе

печать “на отрезке нет корня”

все_если

#include "stdio.h"

#include "math.h"

#include "iostream.h"

#include "iomanip.h"

int main()

{

float f_2p, fa, fb, a, b, c, c1, 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;

f_2p=-1/pow(a-3,2);

if(fa*f_2p>0)

c1=a;

else

c1=b;

c=c1-log(c1-3)/(1/(c1-3));

while(fabs(c-c1)>=eps)

{ c1=c;

c=c1-log(c1-3)/(1/(c1-3));

}

cout<<"корень уравнения х*=";

cout<<c<<endl;

cout<<"значение f(x*)="<<log(c-3)<<endl;

}

else

cout<<"неверно введены концы"

<<"отрезка"<<endl;

return1;}