システムを使用する;
namespace Legalsoft.Truffer
{ public class Frprmn : Dlinemethod { private int iter { get; セット; プライベート ダブルフレット{取得; セット; プライベート ダブルftol {取得; セット; }
public Frprmn(RealValueFunWithDiff funcd, double ftoll = 3.0e-8) :base(funcd)
{ this.ftol = ftoll; }
public double[] minimum(double[] pp)
{ const int ITMAX = 200; const double EPS = 1.0e-18; const double GTOL = 1.0e-8;
int n = pp.長さ;
//p = pp;
p = Globals.CopyFrom(pp);
double[] g = 新しい double[n];
double[] h = 新しい double[n];
//xi.resize(n);
xi = 新しい double[n];
double fp = func.funk(p);
func.df(p, xi);
for (int j = 0; j < n; j++)
{ g[j] = -xi[j]; xi[j] = h[j] = g[j]; } for (int its = 0; its < ITMAX; its++) { iter = its; フレット = linmin();
if (2.0 * Math.Abs(フレット - fp) <= ftol * (Math.Abs(フレット) + Math.Abs(fp) + EPS))
{ return p; fp = フレット; func.df(p, xi); 二重テスト = 0.0; double den = Math.Max(Math.Abs(fp), 1.0); for (int j = 0; j < n; j++) { double temp = Math.Abs(xi[j]) * Math.Max(Math.Abs(p[j]), 1.0) / den; if (温度 > テスト) { テスト = 温度; } }
if (テスト < GTOL)
{ return p; ダブル dgg = 0.0; ダブル gg = 0.0; for (int j = 0; j < n; j++) { gg += g[j] * g[j]; // dgg += xi[j]*xi[j]; dgg += (xi[j] + g[j]) * xi[j]; } //if (gg == 0.0) if (Math.Abs(gg) <= float.Epsilon) { return p; ダブルガム = dgg / gg;
for (int j = 0; j < n; j++)
{ g[j] = -xi[j]; xi[j] = h[j] = g[j] + gam * h[j]; throw new Exception("frprmn の反復 が 多すぎます"); } } }