Files
2025-02-Numerical/lib/nr/k_and_r/recipes/frprmn.c
2025-09-12 18:55:25 +09:00

56 lines
976 B
C

#include <math.h>
#include "nrutil.h"
#define ITMAX 200
#define EPS 1.0e-10
#define FREEALL free_vector(xi,1,n);free_vector(h,1,n);free_vector(g,1,n);
void frprmn(p,n,ftol,iter,fret,func,dfunc)
float (*func)(),*fret,ftol,p[];
int *iter,n;
void (*dfunc)();
{
void linmin();
int j,its;
float gg,gam,fp,dgg;
float *g,*h,*xi;
g=vector(1,n);
h=vector(1,n);
xi=vector(1,n);
fp=(*func)(p);
(*dfunc)(p,xi);
for (j=1;j<=n;j++) {
g[j] = -xi[j];
xi[j]=h[j]=g[j];
}
for (its=1;its<=ITMAX;its++) {
*iter=its;
linmin(p,xi,n,fret,func);
if (2.0*fabs(*fret-fp) <= ftol*(fabs(*fret)+fabs(fp)+EPS)) {
FREEALL
return;
}
fp= *fret;
(*dfunc)(p,xi);
dgg=gg=0.0;
for (j=1;j<=n;j++) {
gg += g[j]*g[j];
dgg += (xi[j]+g[j])*xi[j];
}
if (gg == 0.0) {
FREEALL
return;
}
gam=dgg/gg;
for (j=1;j<=n;j++) {
g[j] = -xi[j];
xi[j]=h[j]=g[j]+gam*h[j];
}
}
nrerror("Too many iterations in frprmn");
}
#undef ITMAX
#undef EPS
#undef FREEALL