C#, cálculo numérico: método de cálculo y programa fuente de Frprmn

 

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








 

Supongo que te gusta

Origin blog.csdn.net/beijinghorn/article/details/132219001
Recomendado
Clasificación