C#、数値計算 - Frprmnの計算方法とソースプログラム

 

システムを使用する;

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 の反復             が             多すぎます");         } }     }








 

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/132219001