レビン変換による数列の収束加速。引数 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) ; } } }