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