1.2. Метод хорд. 1.3. Метод касательных (Ньютона)
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;
}
|
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;
return 1; }
|
Воспользуйтесь поиском по сайту: