Я пытаюсь использовать многофакторную процедуру 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 изменилось, чтобы фактически вычислить Чи — так что это проблема. К сожалению …
Задача ещё не решена.
Других решений пока нет …