アルゴリズムによりシーケンスの収束が高速化されます。初期化メソッドは、合計される項の数である 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) ; } }
}
}