C#、コード Haishibei (37) - 「Tobelize 方程式」を解くための「レビンソン法」の C# ソース コード

システムを使用する;

namespace Zhou.CSharp.Algorithm
{     /// <summary>     /// 線形方程式を解くためのクラス LEquations     /// オリジナルの Zhou Changfa     /// 深い混乱に適応     /// </summary>     public static Partial class LEquations     {






        /// <summary>
        /// トーベリッツ方程式を解くためのレビンソン法
        /// </summary>
        /// <param name="mtxLECoef">指定された係数行列</param>
        /// < param name="mtxLEConst" >指定された定数行列</param>
        /// <param name="mtxResult">行列参照オブジェクト、方程式系の解行列を返す</param>
        /// <return>bool型、方程式系 解が成功したかどうか</param> return>
        public static bool GetRootsetTlvs(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult)
        {             int i, j, k;             double a, beta, q, c, h;

            // 未知数の数
            int n = mtxLECoef.GetNumColumns();

            // 解ベクトルを初期化します
            mtxResult.Init(n, 1);
            double[] x = mtxResult.GetData();

            // 定数配列
            double[] pDataConst = mtxLEConst.GetData();

            // T 配列を作成します
            double[] t = new double[n];

            // 构造T数组
            for (i = 0; i < n; ++i)
            {
                t[i] = mtxLECoef.GetElement(0, i);
            }

            // 一時配列
            double[] s = new double[n];
            double[] y = new double[n];

            // 非トーベルリッツ方程式、このメソッドは a = t[0] を解くのに使用できません
            ;
            if (Math.Abs​​(a) < float.Epsilon)
            {                 return false;             }


            // y[0] = 1.0;
            x[0] = pDataConst[0] / a;
            for (k = 1; k <= n - 1; k++)
            {                 beta = 0.0;                 q = 0.0;                 for            を解くレビンソン法(j = 0; j <= k - 1; j++)                 {                     beta = beta + y[j] * t[j + 1];                     q = q + x[j] * t[k - j];                 }






                if (Math.Abs​​(a) < float.Epsilon)
                {                     return false;                 }

                c = -ベータ / a;
                s[0] = c * y[k - 1];
                y[k] = y[k - 1];
                if (k != 1)
                {                     for (i = 1; i <= k - 1; i++)                     {                         s[i] = y[i - 1] + c * y[k - i - 1];                     }                 }




                a = a + c * ベータ;
                if (Math.Abs​​(a) < float.Epsilon)
                {                     return false;                 }

                h = (pDataConst[k] - q) / a;
                for (i = 0; i <= k - 1; i++)
                {                     x[i] = x[i] + h * s[i];                     y[i] = s[i];                 }


                x[k] = h * y[k];
            }

            true を返します。
        }
}

}

 

おすすめ

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