📄 lmutil.c
字号:
static void compute_diag (const gsl_matrix * J, gsl_vector * diag);static void update_diag (const gsl_matrix * J, gsl_vector * diag);static double compute_delta (gsl_vector * diag, gsl_vector * x);static double scaled_enorm (const gsl_vector * d, const gsl_vector * f);static double enorm (const gsl_vector * f);static doubleenorm (const gsl_vector * f){ return gsl_blas_dnrm2 (f);}static doublescaled_enorm (const gsl_vector * d, const gsl_vector * f){ double e2 = 0; size_t i, n = f->size; for (i = 0; i < n; i++) { double fi = gsl_vector_get (f, i); double di = gsl_vector_get (d, i); double u = di * fi; e2 += u * u; } return sqrt (e2);}static doublecompute_delta (gsl_vector * diag, gsl_vector * x){ double Dx = scaled_enorm (diag, x); double factor = 100; /* generally recommended value from MINPACK */ return (Dx > 0) ? factor * Dx : factor;}static doublecompute_actual_reduction (double fnorm, double fnorm1){ double actred; if (0.1 * fnorm1 < fnorm) { double u = fnorm1 / fnorm; actred = 1 - u * u; } else { actred = -1; } return actred;}static voidcompute_diag (const gsl_matrix * J, gsl_vector * diag){ size_t i, j, n = J->size1, p = J->size2; for (j = 0; j < p; j++) { double sum = 0; for (i = 0; i < n; i++) { double Jij = gsl_matrix_get (J, i, j); sum += Jij * Jij; } if (sum == 0) sum = 1.0; gsl_vector_set (diag, j, sqrt (sum)); }}static voidupdate_diag (const gsl_matrix * J, gsl_vector * diag){ size_t i, j, n = diag->size; for (j = 0; j < n; j++) { double cnorm, diagj, sum = 0; for (i = 0; i < n; i++) { double Jij = gsl_matrix_get (J, i, j); sum += Jij * Jij; } if (sum == 0) sum = 1.0; cnorm = sqrt (sum); diagj = gsl_vector_get (diag, j); if (cnorm > diagj) gsl_vector_set (diag, j, cnorm); }}static voidcompute_qtf (const gsl_matrix * q, const gsl_vector * f, gsl_vector * qtf){ size_t i, j, N = f->size; for (j = 0; j < N; j++) { double sum = 0; for (i = 0; i < N; i++) sum += gsl_matrix_get (q, i, j) * gsl_vector_get (f, i); gsl_vector_set (qtf, j, sum); }}static voidcompute_rptdx (const gsl_matrix * r, const gsl_permutation * p, const gsl_vector * dx, gsl_vector * rptdx){ size_t i, j, N = dx->size; for (i = 0; i < N; i++) { double sum = 0; for (j = i; j < N; j++) { size_t pj = gsl_permutation_get (p, j); sum += gsl_matrix_get (r, i, j) * gsl_vector_get (dx, pj); } gsl_vector_set (rptdx, i, sum); }}static voidcompute_trial_step (gsl_vector * x, gsl_vector * dx, gsl_vector * x_trial){ size_t i, N = x->size; for (i = 0; i < N; i++) { double pi = gsl_vector_get (dx, i); double xi = gsl_vector_get (x, i); gsl_vector_set (x_trial, i, xi + pi); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -