Метод деления пополам можно улучшить, если использовать для следующего вычисления не середину отрезка, а то значение x, в котором дает нуль линейная интерполяция между двумя известными значениями функции f(x).
Геометрический способ интерполяции эквивалентен замене кривой y=f(x) хордой, проходящей через точку А(а,f(a)) и через точку B(b,f(b)).
Уравнение хорды: , где точка пересечения с осью ОX.
f(b)
x*
f(a) f(c)
Найдем точку пересечения хорды с осью ОХ:
( х=с; y=0 ) координаты этой точки
c=a-(*)
Алгоритм метода хорд состоит из следующих шагов.
1) Вычислитьf(a) и f(b).
2) Вычислить спо формуле с (*).
Вычислить f(c)
3) Как только c-a<e или b-c<e нужно закончить вычисление.
Корень будет равен x=c.
4) Как только f(c)*f(a)>0,то a=c иf(a)=f(c).
Иначе b=c и f(b)=f(c).
5) Дальше снова переходим к пункту номер 2.
Пример: Найти корни уравнения 2*x-=0 на интервале [0.2;1.5] e=.
#include <stdio.h>
#include <math.h>
void main( )
{ float a, b, eps;
float c, fa, fc;
printf (“\n Введите интервал [a,b] и точность eps \n”);
printf (“\n a=”); scanf (“%f”,&a);
printf (“\n b=”); scanf (“%f”,&b);
printf (“\n eps=”); scanf (“%f”,&eps);
printf (“\n Введено a=%f \t b=%f \t eps=%f”, a, b, eps);
fa=cos(a);
if (fa!=0)
{ do
{ fa=2*a-exp(-0.1*a);
fb=2*b-exp(-0.1*b);
c=a-fa/(fb-fc)*(b-a);
fc=2*c-exp(-0.1*c);
if((c-a)<eps || (b-c)<eps )
{ printf (“\n Корень уравнения =%f”,c);
break;
}
else
if (fa*fc>0)
{ a=c;
fa=fc;
}
else
{ b=c;
fb=fc;
}
} while (1);
}
}
f(b)
x*
f(a) f(c)
Метод хорд, как и метод деления пополам абсолютно надежен. В большинстве случаев он имеет более быструю сходимость, чем метод деления пополам. Однако основное достоинство метода деления пополам состоит в том, что скорость сходимости не зависит от вида функции f(x) и заранее известно, что будет в каждом конкретном случае, что нельзя сказать о методе хорд .