2017-07-31 3 views

答えて

0

これは私が最高の精度や性能を得るためにしようとしていない、迅速なソリューションです。 、一つの可能​​な近似(それは単純な数式を持っていないAZ積分関数のように)あなたのREQによっては、CDFが近似しなければならないなど

create or replace function calc_sn_pdf(x in number) return number 
is 
pi  CONSTANT NUMBER := 3.14159265358979; 
begin 
    return 1/sqrt(2*pi) * exp(-x*x/2); 
end; 
/

番号の形式、精度、計算ロジックを、微調整する必要がある場合があります以下のように実施される。 Wikipediaには他にも多くの近似があります。あなたは、これらの機能に多くの時間を実行する必要がある場合

create or replace function calc_sn_cdf(x in number) return number 
is 
b0 CONSTANT NUMBER := 0.2316419; 
b1 CONSTANT NUMBER := 0.319381530; 
b2 CONSTANT NUMBER := -0.356563782; 
b3 CONSTANT NUMBER := 1.781477937; 
b4 CONSTANT NUMBER := -1.821255978; 
b5 CONSTANT number := 1.330274429; 
v_t number; 
begin 
    --see 26.2.17 at http://people.math.sfu.ca/~cbm/aands/page_932.htm 
    --see https://en.wikipedia.org/wiki/Normal_distribution#Numerical_approximations_for_the_normal_CDF 
    --Zelen & Severo (1964) approximation 
    if x < 0 then 
    --this approximation works for x>0, but cdf is symmetric for x=0: 
    return 1 - calc_sn_cdf(-x); 
    else 
    v_t := 1/(1 + b0*x); 
    return 1 - calc_sn_pdf(x)*(b1*v_t + b2*v_t*v_t + b3*v_t*v_t*v_t + b4*v_t*v_t*v_t*v_t + b5*v_t*v_t*v_t*v_t*v_t); 
    end if;  
end; 
/

ところで、ネイティブのPL/SQLのコンパイルをオンにすることは有用であろう。

関連する問題