342 int i, its,
j,
k, restrt, sing, skip;
343 double den, f, fold, stpmax, sum, temp, test;
344 static double *
c, *d, *fvcold, *g, *p, **qt, **r, *
s, *t, *w, *xold, *fguess;
349 print1 (
"! Broyden : Number of equations exceed the maximum limit\n");
367 (*vecfunc)(
n, x, fguess);
370 sum += fguess[
i] * fguess[
i];
378 if (fabs(fguess[i]) > test) test = fabs(fguess[i]);
379 if (test < 0.01*
TOLF) {
386 for (i=0;i<
n;i++) sum += x[i] * x[i];
387 stpmax =
STPMX*
MAX(sqrt(sum), (
double)n);
391 for(its = 1; its <=
MAXITS; its++){
397 print (
"! Broyden: singular Jacobian... Hard Luck !\n");
403 for(j=0;j<
n;j++) qt[i][j] = 0.0;
408 for(k=0; k < n-1; k++) {
410 for (j=0; j<
n; j++) {
413 sum += r[
i][
k]*qt[
i][
j];
417 qt[
i][
j] -= sum*r[
i][
k];
426 for (j=0;j<
i;j++) r[i][j] = 0.0;
431 for(i=0; i<
n; i++) s[i] = x[i] - xold[i];
434 for(j=i; j<
n; j++) sum += r[i][j] * s[j];
440 for(j=0; j<
n; j++) sum += qt[j][i] * t[j];
441 w[
i] = fguess[
i] - fvcold[
i] - sum;
442 if (fabs(w[i]) >=
EPS_FD_JAC*(fabs(fguess[i]) + fabs(fvcold[i]))) skip = 0;
450 for(j=0;j<
n;j++) sum += qt[i][j]*w[j];
455 for(i=0; i<
n;i++) den += s[i] * s[i];
456 for(i=0; i<
n;i++) s[i] /= den;
462 print (
"! Broyden: R is singular .. Hard Luck ! \n");
473 for(j=0; j<
n; j++) sum += qt[i][j] * fguess[j];
479 for(j=0; j<=
i; j++) sum += r[j][i] * g[j];
486 fvcold[
i] = fguess[
i];
492 for(j=0; j<
n; j++) sum += qt[i][j] * fguess[j];
501 LineSearch (n, xold, fold, g, p, x, fguess, &f, stpmax,
check, vecfunc);
506 if (fabs(fguess[i]) > test) test = fabs(fguess[i]);
515 print(
"! Broyden: Already tried reinitializing \n");
521 temp = fabs(g[i]) *
MAX(fabs(x[i]), 1.0)/den;
522 if (temp > test) test = temp;
524 if (test <
TOLMIN)
return;
531 temp = (fabs(x[i] - xold[i])) /
MAX(fabs(x[i]), 1.0);
532 if (temp > test) test = temp;
535 print(
"! Brodyen: All is Well !! \n");
540 print(
"! Brodyen: MAXITS exceeded in Broyden\n");
void QRDecompose(double **a, int n, double *c, double *d, int *sing)
void FDJacobian(int n, double x[], double fv[], double **df, void(*vecfunc)(int, double[], double[]))
void LineSearch(int n, double xold[], double fold, double g[], double p[], double x[], double mf[], double *f, double stpmax, int *check, void(*vecfunc)(int, double[], double[]))
void print1(const char *fmt,...)
void QRUpdate(double **r, double **qt, int n, double *u, double *v)
void RSolve(double **a, int n, double *d, double *b)
void print(const char *fmt,...)
#define ARRAY_1D(nx, type)
#define ARRAY_2D(nx, ny, type)
#define QUIT_PLUTO(e_code)