Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Метод касательных (Ньютона)
Метод основывается на утверждении, что если на отрезке [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;}
|
|