10

逆エラー関数の JavaScript 実装はありますか? これにより、ガウスの逆誤差関数が実装されます。近似は問題ありません。

4

3 に答える 3

10

なぜいいの。がある。

次のコードは組み込みの JavaScript 関数を使用し、ここで説明されているように Abramowitz と Stegun のアルゴリズムを実装しています。

    function erfinv(x){
        var z;
        var a  = 0.147;                                                   
        var the_sign_of_x;
        if(0==x) {
            the_sign_of_x = 0;
        } else if(x>0){
            the_sign_of_x = 1;
        } else {
            the_sign_of_x = -1;
        }

        if(0 != x) {
            var ln_1minus_x_sqrd = Math.log(1-x*x);
            var ln_1minusxx_by_a = ln_1minus_x_sqrd / a;
            var ln_1minusxx_by_2 = ln_1minus_x_sqrd / 2;
            var ln_etc_by2_plus2 = ln_1minusxx_by_2 + (2/(Math.PI * a));
            var first_sqrt = Math.sqrt((ln_etc_by2_plus2*ln_etc_by2_plus2)-ln_1minusxx_by_a);
            var second_sqrt = Math.sqrt(first_sqrt - ln_etc_by2_plus2);
            z = second_sqrt * the_sign_of_x;
        } else { // x is zero
            z = 0;
        }
  return z;
}
于 2012-09-23T22:13:15.320 に答える
2

この投稿で以前に提供された関数は私にとってはうまくいきませんでした... 33 メートルの円での NaN の結果は 65.0 として表され、信頼度 65% でした ... ここにリストされている方程式に基づいて次のように書きましたhttps://en.wikipedia.org/ wiki/Error_function#Inverse_functionsとうまくいきました:

var _a = ((8*(Math.PI - 3)) / ((3*Math.PI)*(4 - Math.PI)));

function erfINV( inputX )
{
    var _x = parseFloat(inputX);
    var signX = ((_x < 0) ? -1.0 : 1.0 );

    var oneMinusXsquared = 1.0 - (_x * _x);
    var LNof1minusXsqrd  = Math.log( oneMinusXsquared );
    var PI_times_a       = Math.PI * _a ;

    var firstTerm  = Math.pow(((2.0 / PI_times_a) + (LNof1minusXsqrd / 2.0)), 2);
    var secondTerm = (LNof1minusXsqrd / _a);
    var thirdTerm  = ((2 / PI_times_a) + (LNof1minusXsqrd / 2.0));

    var primaryComp = Math.sqrt( Math.sqrt( firstTerm - secondTerm ) - thirdTerm );

    var scaled_R = signX * primaryComp ;
    return scaled_R ;
}
于 2015-09-17T16:25:16.120 に答える