Метод касательных (Ньютона)
Метод основывается на утверждении, что если на отрезке [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;} |
Дата добавления: 2015-08-08; просмотров: 513;