utilizando el sistema;
espacio de nombres Legalsoft.Truffer
{ public class Frprmn : Dlinemethod { private int iter { get; colocar; } doble traste privado { obtener; colocar; } privado doble ftol { obtener; colocar; }
public Frprmn(RealValueFunWithDiff funcd, double ftoll = 3.0e-8) : base(funcd)
{ this.ftol = ftoll; }
public double[] minimizar(doble[] pp)
{ const int ITMAX = 200; const doble EPS = 1.0e-18; const doble GTOL = 1.0e-8;
int n = pp. Longitud;
//p = pp;
p = Globals.CopyFrom(pp);
doble[] g = nuevo doble[n];
doble[] h = nuevo doble[n];
//xi.redimensionar(n);
xi = nuevo doble[n];
doble 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; traste = linmin();
if (2.0 * Math.Abs(traste - fp) <= ftol * (Math.Abs(traste) + Math.Abs(fp) + EPS))
{ return p; } fp = traste; func.df(p, xi); prueba doble = 0,0; doble den = Math.Max(Math.Abs(fp), 1.0); for (int j = 0; j < n; j++) { doble temperatura = Math.Abs(xi[j]) * Math.Max(Math.Abs(p[j]), 1.0) / den; if (temp > prueba) { prueba = temperatura; } }
si (prueba < GTOL)
{ devuelve p; } doble dgg = 0.0; doble 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; } doble juego = 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("Demasiadas iteraciones en frprmn"); } } }