#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);
}