C#、数値計算 - 評価関数 Levin クラスの計算方法とソースプログラム

 

レビン変換による数列の収束加速。引数 nmax (合計される項の数の上限) と epss (必要な精度) を指定してコンストラクターを呼び出すことによって初期化します。その後、関数 next を連続して呼び出して、シーケンスの制限の現在の推定値を返します。収束が検出された場合、フラグ cnvgd が設定されます。

sum、シーケンスの n 番目の部分和。omega、n 番目の剰余推定値 wn 、通常は from(5.3.19); パラメーター beta は通常 1 に設定する必要がありますが、場合によっては 0.5 の方が効果的です。シーケンスの限界の現在の推定値が返されます。

システムを使用する;

namespace Legalsoft.Truffer
{     /// <summary>     /// レビン変換によるシーケンスの収束加速。     /// 引数 nmax (     合計される項の数の上限) と /// epss (必要な精度) を指定してコンストラクターを呼び出して初期化し     ます。次に、 /// next 関数を連続して呼び出して、現在の値を返します。     /// シーケンスの極限の推定値。収束     が検出されると /// フラグ cnvgd が設定されます。     /// </summary>     public class Levin     {         private double[] numer { get; セット; プライベート         ダブル[]デノム{取得; セット; プライベート         int n {取得; セット; }













        private int ncv {取得; セット; public
        bool cnvgd {取得; セット; プライベート
        ダブルスモール{取得; セット; public
        double big { get; セット; プライベート
        ダブルeps {取得; セット; プライベート
        ダブルlastval {取得; セット; private
        double lasteps { get; } セット; }

        public Levin(int nmax, double epss)
        {             this.numer = new double[nmax];             this.denom = 新しい 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;
        }

        /// <summary>
        /// sum、シーケンスの n 番目の部分和。omega、n 番目の剰余推定値
        /// wn 、通常は from(5.3.19); /// パラメーター beta は、 /// 通常は 1 に設定する必要がありますが、0.5 の方がうまく機能する場合もあります         。シーケンスの
        制限 /// の現在の推定値が返されます。         /// </summary>         /// <param name="sum"></param>         /// <param name="omega"></param>         /// <param name="beta"></ param>         /// <returns></returns>         public double next(double sum, double omega, double beta = 1.0)         {             double term = 1. 0 / (ベータ + n);             denom[n] = 項 / オメガ;










            numer[n] = 合計 * denom[n];
            if (n > 0)
            {                 倍比 = (ベータ + n - 1) * 項;                 for (int j = 1; j <= n; j++)                 {                     double fat = (n - j + beta) * term;                     数値[n - j] = 数値[n - j + 1] - 事実 * 数値[n - j];                     denom[n - j] = denom[n - j + 1] - 事実 * denom[n - j];                     期間 = 期間 * 比率;                 }             }             n++;             double val = Math.Abs​​(denom[0]) < 小さい? lastval: 数値[0] / denom[0];             lasteps = Math.Abs​​(val - lastval);












            if ( laststeps <= eps )
            {                 ncv ++ ;             if             (ncv >= 2)             {                 cnvgd = true ;             戻り値             (lastval = val) ;         } }     }










 

おすすめ

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