C#、数値計算 - アルゴリズムを使用して数列の収束を高速化する計算方法とソース プログラム

 

アルゴリズムによりシーケンスの収束が高速化されます。初期化メソッドは、合計される項の数である nmax と必要な精度である eps をパラメーターとして指定してコンストラクターを呼び出します。次に、次の関数を連続して呼び出します。パラメータは次の部分とシーケンスです。シーケンス制限の現在の推定値が next によって返されます。収束検出フラグcnvgdを設定します。

システムを使用する;

namespace Legalsoft.Truffer
{     /// <summary>     /// アルゴリズムによるシーケンスの収束加速。 /// 引数 nmax     (合計される項の数の     上限) を指定してコンストラクターを呼び出すことによって初期化します。 ///シーケンスの     次の部分和を引数として、 /// 関数 next を連続して呼び出します     。シーケンスの限界の現在の推定値は、      /// next によって返されます。収束が検出されると、フラグ cnvgd が設定されます。     /// </summary>     public class Epsalg     {         private double[] e { get; セット; プライベート         int n {取得; セット; }












        private int ncv {取得; セット; public
        bool cnvgd {取得; セット; }
        /// <summary>
        /// マシンのアンダーフローおよびオーバーフローの制限に近い数値。
        /// </summary>
        プライベート ダブル eps { get; セット; プライベート
        ダブルスモール{取得; セット; プライベート
        ダブルビッグ{取得; セット; プライベート
        ダブルlastval {取得; セット; private
        double lasteps { get; } セット; }

        public Epsalg(int nmax, double epss)
        {             this.e = new double[nmax];             this.n = 0;             this.ncv = 0;             this.cnvgd = false;             this.eps = epss;             this.lastval = 0.0;             small = float.MinValue * 10.0;             big = double.MaxValue;         }








        public double next(double sum)
        {             e[n] = sum;             ダブル temp2 = 0.0;             for (int j = n; j > 0; j--)             {                 double temp1 = temp2;                 temp2 = e[j - 1];                 二重差分 = e[j] - temp2;                 if (Math.Abs​​(diff) <= small)                 {                     e[j - 1] = big;                 }                 else                 {                     e[j - 1] = temp1 + 1.0 / diff;                 }             }             n++;             double val = (n & 1) != 0 ? e[0] : e[1];


















            if (Math . Abs (val) > 0.01 * great)
            {                 val = lastval ;             laststeps             = Math.Abs​​(val - lastvalue);             if (最後のステップ > eps)             {                 ncv = 0 ;             }             else             {                 ncv++;             if             (ncv >= 3)             {                 cnvgd = true ;             戻り値             (lastval = val) ;         } }
















    }
}
 

おすすめ

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