#include <stdio.h>
#include "nrutil.h"

/*
最悪の点を、それ以外の点の重心について fac 倍に伸ばした点に仮に移し、その点の
方が良ければ最悪の点を捨てて置き換える。
*/
// この関数は,大小を判断して大きければ入れ替えるだけ.
double amotry(double **p, double y[], double psum[], int ndim,
	double (*funk)(double []), int ihi, double fac)
{
	int j;
	double fac1, fac2, ytry, *ptry;

	ptry = vector(ndim); // ndim次ベクトルptryのメモリ確保
	fac1 = (1.0 - fac) / ndim; // fac倍にする
	fac2 = fac1 - fac;
	for(j = 0; j < ndim; j++)	ptry[j] = psum[j] * fac1 - p[ihi][j] * fac2; // この計算は一体何???
										// ptry[j]:更新した変数ベクトル,要素は三つ
										// psum[j]:ndim次ベクトルメモリ確保したポインタ
	ytry = (*funk)(ptry);				// 新しく更新した変数ベクトルptry[j]で関数を計算
	if(ytry < y[ihi])					// 新しい点の方が良ければ元の最悪値を捨てて置き換える
	{				
		y[ihi] = ytry;                  // 置き換えてる
		for(j = 0; j < ndim; j++)
		{
			psum[j] += ptry[j] - p[ihi][j];
			p[ihi][j] = ptry[j];
			//printf("%d\n",ihi);
		}
	}
	free_vector(ptry);
	return ytry;
}