// Очень ВАЖНЫЙ параметр остановки счёта !!! #define EPS 1.e-6 // общий итерационный процесс поиска решения // модификация Исаева-Сонина int resh(int n1,int n2,ext_value1 p[]) { int i,j,l=0; ext_value1 q[n2],pn[n1]; // массивы невязок и пробных параметров пристрелки double df0,dfn,w,dp; double A[n2*n2]; // матрица производных double b[n2]; // столбец правой части double gamma=1; // коэффициент Исаева-Сонина // цикл требуется для правильной инициализации размерности и сохранении значения alpha: for(i=0;i l=%d : gamma=%lf\n",l,gamma); gamma=1.0; printf("Базовая точка (p)\n"); for(i=0;i1 ) w=fabs(b[i])/w; else w=fabs(b[i]); dp+=w*w; } dp=sqrt(dp); // Внимание !!! // Здесь написано условие выхода по малости градиента или малости смещения if( dfn0.8 && dp EPS ) gamma/=2; // дробление шага Исаева-Сонина со спорным условием малости else return -29; // "плохая" остановка счёта (плохая функция) } // конец цикла выбора нового смещения; // начинается новая итерация } while(l<15); // это плохая остановка счёта: сделали 15 итераций и ответ найти не удалось return -l; }