Алгоритм поиска интервала нахождения корня нелинейной функции
Страница 2. Программа окружения корня нелинейной функции


 

Программа окружения корня нелинейной функции

Ниже расположена программа окружения корня нелинейной функции, которая реализует данный алгоритм.

/* Окружение корня функции. 
Предполагается, что функция существует на бесконечном и непрерывном промежутке.

int BracketRoot(double x0,double *a,double *b,double d0,
double di, double dmax,double (*fun)(double));
Параметры:
x0 - начальное приближение;
a - левая граница;
b - правая граница;
d0 - начальный интервал поиска;
di - интервал расширения (в геометрической прогрессии);
dmax - максимальный интервал;
fun - указатель на функцию.
Возвращает:
1 - если корень окружен;
0 - сбой
*/

int BracketRoot(double x0,double *a,double *b,double d0,
double di, double dmax,double (*fun)(double)) {
double fa,fb,f0;
f0=(*fun)(x0); *a=x0-d0; *b=x0+d0; fa=(*fun)(*a); fb=(*fun)(*b);
while((d0*=di)<dmax) {
if(f0>=0.) {
if(fa<0.) {*b=x0;return(1);}
if(fb<0.) {*a=x0;return(1);}
if(fa>fb) {*a=x0; x0=(*b); *b+=d0; fa=f0; f0=fb; fb=(*fun)(*b);}
else if(fa<fb) {*b=x0; x0=(*a); *a-=d0; fb=f0; f0=fa; fa=(*fun)(*a);}
else {*a-=d0; *b+=d0; fa=(*fun(*a);fb=(*fun)(*b);}
}
else if(f0<0.) {
if(fa>=0.) {*b=x0;return(1);}
else if(fb>=0.) {*a=x0;return(1);}
if(fa<fb) {*a=x0; x0=(*b); *b+=d0; fa=f0; f0=fb; fb=(*fun)(*b);}
else if(fa>fb) {*b=x0; x0=(*a); *a-=d0; fb=f0; f0=fa; fa=(*fun)(*a);}
else {*a-=d0; *b+=d0; fa=(*fun(*a);fb=(*fun)(*b);}
}
}
return(0);
}
 
« Предыдущая статья   Следующая статья »