/* Driver for routine amebsa */ #include #define NRANSI #include "nr.h" #include "nrutil.h" #define NP 4 #define MP 5 #define FTOL 1.0E-6 #define N 4 #define RAD 0.3 #define AUG 2.0 long idum=(-64); float tfunk(float p[]) { int j; float q,r,sumd=0.0,sumr=0.0; static float wid[N+1]={0.0,1.0,3.0,10.0,30.0}; for (j=1;j<=N;j++) { q=p[j]*wid[j]; r=(float)(q >= 0 ? (int)(q+0.5) : -(int)(0.5-q)); sumr += q*q; sumd += (q-r)*(q-r); } return 1+sumr*(1+(sumd > RAD*RAD ? AUG : AUG*sumd/(RAD*RAD))); } int main(void) { int i,iiter,iter,j,jiter,ndim=NP,nit; float temptr,yb,ybb; float **p,*x,*y,*pb; static float xoff[NP+1]={0.0,10.0,10.0,10.0,10.0}; p=matrix(1,MP,1,NP); x=vector(1,NP); y=vector(1,MP); pb=vector(1,NP); for (i=1;i<=MP;i++) for (j=1;j<=NP;j++) p[i][j]=0.0; for (;;) { for (j=2;j<=MP;j++) p[j][j-1]=1.0; for (i=1;i<=MP;i++) { for (j=1;j<=NP;j++) x[j]=(p[i][j] += xoff[j]); y[i]=tfunk(x); } yb=1.0e30; printf("Input t, iiter:\n"); if (scanf("%f %d",&temptr,&iiter) == EOF) break; ybb=1.0e30; nit=0; for (jiter=1;jiter<=100;jiter++) { iter=iiter; temptr *= 0.8; amebsa(p,y,ndim,pb,&yb,FTOL,tfunk,&iter,temptr); nit += iiter-iter; if (yb < ybb) { ybb=yb; printf("%6d %10.3e ",nit,temptr); for (j=1;j<=NP;j++) printf("%10.5f ",pb[j]); printf("%15.7e\n",yb); } if (iter > 0) break; } printf("Vertices of final 3-D simplex and\n"); printf("float values at the vertices:\n"); printf("%3s %10s %12s %12s %14s\n\n", "i","x[i]","y[i]","z[i]","function"); for (i=1;i<=MP;i++) { printf("%3d ",i); for (j=1;j<=NP;j++) printf("%12.6f ",p[i][j]); printf("%15.7e\n",y[i]); } printf("%3d ",99); for (j=1;j<=NP;j++) printf("%12.6f ",pb[j]); printf("%15.7e\n",yb); } free_vector(pb,1,NP); free_vector(y,1,MP); free_vector(x,1,NP); free_matrix(p,1,MP,1,NP); printf("Normal completion\n"); return 0; } #undef NRANSI