Левенберг – Марквардт не сходится

Я пытаюсь подобрать модель, используя метод Левенберга-Марквардта по численным рецептам.
Проблема в том, что она не сходится или когда это происходит, она не точна … или, по крайней мере, ковариантная матрица странна.

        int i=0;
for (i = 0; i < 3e4; i++) {
mrqmin(x, y, sig, NPCalib, a, ia, 3, covar, alpha, &chisk, afunc,
&alamda);
if (chisk < 1e-8)
sumchisk++;
if (sumchisk > 5)
break;
if (alamda > 1e8)
alamda = 1e8;
}

(x, y) 3 точки (двойные), которые хорошо работают с формой y=a(x-x0)^2,
использование sumchisk как это — рекомендация числовых рецептов для использования этой функции.
Аламда сверху ограничена, так как в противном случае возможно переполнение.

Другие определения и данные:

double a[4] = {0.0, 0.0001, 100.0, -1};
int ia[4] = {0.0, 1, 1, 0};
double *x = {0.0, 799.157549545577, 799.92196995454, 800.683769692575};
double *y = {0.0, 524.26491, 525.26768, 526.26586};
double *sig = {0.0, 0.1*y[1], 0.1*y[2], 0.1*y[3]};
double **covar = new double*[4];
covar[1] = new double[4];
covar[2] = new double[4];
covar[3] = new double[4];
double **alpha = new double*[4];
alpha[1] = new double[4];
alpha[2] = new double[4];
alpha[3] = new double[4];
double chisk = 0;
double alamda = -1;

void afunc(int i, double x[], double a[], double *y, double dyda[], int ma)
{
*y = a[1] * pow(x[i] + a[2], 2) / pow(1 + a[3] * CT[i - 1], 2);

dyda[1] = pow(x[i] + a[2], 2) / pow(1 + a[3] * CT[i - 1], 2);
dyda[2] = (2 * a[1] * (x[i] + a[2])) / pow
(1 + a[3] * CalibTurn[i - 1], 2);
dyda[3] = (-2 * a[1] * CT[i - 1] * pow(x[i] + a[2], 2)) / pow
(1 + a[3] * CT[i - 1], 3);
}

Я изменил nr-исходный код, чтобы использовать double вместо float. Первый элемент массива не используется, потому что он написан на фортран-коде, и мне не хотелось менять такую ​​маленькую деталь.

Модель также содержит параметр 3., который не используется в этой подгонке и поэтому остается [3] = — 1, потому что ia [3] = 0. ia [] = 1 означает, что параметр собирается получить …

Однако теперь у меня проблема в том, что иногда это не сходится. Заканчивается alamda=1e8 а также i=3e4, Особенно, когда я установил порог для chisk ниже.
Наборы параметров, кажется, в порядке, хотя … риск, например, около 1e-6, и параметры кажутся хорошими, но, глядя на диагонали ковариантной матрицы (которая должна давать квадратное стандартное отклонение каждого параметра), есть некоторая разбросанность, например, ~ 800000 для параметра 0.0001.

Кто-нибудь знает, что я сделал не так при использовании этого алгоритма?
Что-нибудь конкретное, что мне нужно записать в covar / alpha при запуске? Можно ли установить сигнал так?

2

Решение

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

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


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