GSL Multifit Solver не обновляет параметры, а потом жалуется, что не сходится

Я пытаюсь использовать многофакторную процедуру GSL, чтобы соответствовать некоторым данным. Функция подбора — это сложная численно оцененная процедура. Более простая версия, использующая функцию Гаусса, работает нормально, но для моей реальной системы решатель проходит первую итерацию, выбирает разумный шаг, но затем не может обновить параметры. Затем на втором этапе он жалуется, что не продвигается к решению — потому что он не обновил параметры!

iter:   1 x =    162.76857898  10739059.23031948      1.10107134 |f(x)| = 20.4037
dx =     -0.25345191 -195704.17835643      0.11771325
status = iteration is not making progress towards solution
iter:   2 x =    162.76857898  10739059.23031948      1.10107134 |f(x)| = 20.4037
dx =     -0.00000051     -0.21429092      0.00000018
chisq/dof = 24.4889

Вот код, фактически выполняющий цикл:

do
{
iter++;
status = gsl_multifit_fdfsolver_iterate (solver);

if(verbose)
{
printf ("status = %s\n", gsl_strerror (status));
print_state (iter, solver);
}

// detect an error:
if (status)
{
ret = false;
break;
}

status = gsl_multifit_test_delta (solver->dx, solver->x, 1e-4, 1e-4);
}
while (status == GSL_CONTINUE && iter < 1000);

Я проверил производную функцию, и она, кажется, дает разумный числовой ответ:

deriv = 0.14451 , 1.36748e-05 , -0.922072

В общем, я сбит с толку, почему solver->x не меняется между итерациями 1 и 2, учитывая, что solver->dx выглядит разумным после итерации 1. Есть мысли?

Редактировать:
Проверка значения функции после первой итерации:

iter:   1 x =    162.76857898  10739059.23031948      1.10107134 |f(x)| = 20.4037
dx =     -0.25345191 -195704.17835643      0.11771325
|f(x)| = 20.4037
|f(x+dx)| = 21.512

изменить 2 изменилось, чтобы фактически вычислить Чи — так что это проблема. К сожалению …

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]