Алгоритм поиска интервала нахождения корня нелинейной функции Страница 2. Программа окружения корня нелинейной функции
|
Страница 2 из 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); } |