C#、数値計算 - 1次元最小化ルーチンの基底クラスの計算方法とソースプログラム (1次元最小化ルーチンの基底クラス)

1 基本クラス関数の概要

関数またはファンクター func と、個別の初期点 ax および
bx を指定すると、このルーチンは下り坂方向 (
初期点で評価されるように関数によって定義される) を検索し、
最小値を囲む新しい点 ax、bx、cxを返します。 function。fa
、fb、fc の 3 つの点の関数値も返されます。
 

関数またはファンクター func が与えられ、異なる初期点 ax および bx が与えられると、このルーチンは (初期点で評価される関数によって) 下り坂方向に検索し、新しい点 ax、bx、bz、cx を返します。関数。また、関数 fa、fb、fc の 3 点の値も返されます。

2 基本クラスの C# コード

システムを使用する;

namespace Legalsoft.Truffer
{     /// <summary>     /// 一     次元最小化ルーチンの基底クラス。     ///最小限の関数といくつかのユーティリティ関数を /// まとめる     ルーチンを提供します。     /// </summary>     public class Bracketmethod     {         public double ax;         パブリックダブルBX。         パブリックダブルCX;         公的ダブルファ。         パブリックダブルFB;         パブリックダブルFC;













        /// <summary>
        /// 関数またはファンクター func と、個別の初期点 ax および
        /// bx を指定すると、このルーチンは下り方向に検索します (
        /// 初期点で評価される関数によって定義されます)。
        /// 関数の最小値を囲む新しい点 ax、bx、/// cx を返します。また、 ///
        3 つの点、fa、fb、fc における関数の値も返されます。
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        public void括弧(double a, double b, UniVarRealValueFun func)
        {             const double GOLD = 1. 618034;             const double GLIMIT = 100.0;


            const double TINY = 1.0e-20;
            斧 = a;
            bx = b;
            ダブルフー。
            fa = func.funk(ax);
            fb = func.funk(bx);
            if (fb > fa)
            {                 Globals.SWAP(ref ax, ref bx);                 Globals.SWAP(ref fb, ref fa);             cx             = bx + GOLD * (bx - ax);             fc = func.funk(cx);             while (fb > fc)             {                 double r = (bx - ax) * (fb - fc);                 ダブルq = (bx - cx) * (fb - fa);









                double u = bx - ((bx - cx) * q - (bx - ax) * r) / (2.0 * Globals.SIGN(Math.Max(Math.Abs​​(q - r), TINY), q - r) );
                double ulim = bx + GLIMIT * (cx - bx);
                if ((bx - u) * (u - cx) > 0.0)
                {                     fu = func.funk(u);                     if (fu < fc)                     {                         ax = bx;                         bx = u;                         fa = fb;                         fb = ふ;                         戻る;                     }                     else if (fu > fb)                     {                         cx = u;












                        fc = ふ;
                        戻る;
                    u
                    = cx + GOLD * (cx - bx);
                    fu = func.funk(u);
                else
                if ((cx - u) * (u - ulim) > 0.0)
                {                     fu = func.funk(u);                     if (fu < fc)                     {                         shft3(ref bx, ref cx, ref u, u + GOLD * (u - cx));                         shft3(ref fb, ref fc, ref fu, func.funk(u));                     else                 if ((u - ulim) * (ulim - cx) >= 0.0                 )                 {









                    u = ウリム;
                    fu = func.funk(u);
                }
                else
                {                     u = cx + GOLD * (cx - bx);                     fu = func.funk(u);                 shft3                 (ref ax, ref bx, ref cx, u);                 shft3(ref fa, ref fb, ref fc, fu);             }         }






        public void shft2(ref double a, ref double b, double c)
        {             a = b;             b = c;         }


        public void shft3(ref double a, ref double b, ref double c, double d)
        {             a = b;             b = c;             c = d;         }



        public void mov3(ref double a, ref double b, ref double c, double d, double e, double f)
        {             a = d;             b = e;             c = f;         } }     }






 

おすすめ

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