add numerical recipes library
This commit is contained in:
55
lib/nr/k_and_r/recipes/frprmn.c
Normal file
55
lib/nr/k_and_r/recipes/frprmn.c
Normal file
@@ -0,0 +1,55 @@
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user