#include "nr.h" #define TOL 2.0e-4 int ncom; double *pcom,*xicom,(*nrfunc)(double []); void linmin(double p[], double xi[], int n, double *fret, double (*func)(double [])) { // 直線に沿った最小化プログラム int j; double xx,xmin,fx,fb,fa,bx,ax; ncom=n; pcom=vector(n); xicom=vector(n); nrfunc=func; // function へのポインタを代入 for (j=0;j<n;j++) { pcom[j]=p[j]; xicom[j]=xi[j]; } ax=0.0; xx=1.0; mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim); // 極小値を囲い込む3点をピックアップ *fret=brent(ax,xx,bx,f1dim,TOL,&xmin); // 関数の極小値を代入 for (j=0;j<n;j++) { xi[j] *= xmin; // 方向ベクトル×極小を与えるx座標, 理由-xi[]は単位ベクトルだから・・・ p[j] += xi[j]; // 極小値の座標をx,y,z...に代入 } free_vector(xicom); free_vector(pcom); }