========================= LOI NORMALE ===================== 'LNormale.bas 'Traduit par www.FreeNRG.info d'un programme FORTRAN de chez: 'http://lib.stat.cmu.edu/apstat/66 DECLARE SUB normp (z AS DOUBLE, p AS DOUBLE, q AS DOUBLE, pdf AS DOUBLE) DIM z AS DOUBLE, p AS DOUBLE DIM q AS DOUBLE, pdf AS DOUBLE DIM EcartReduit(10) AS DOUBLE DIM i AS INTEGER CONST vrai = -1, faux = 0 CONST ecran = 5, imprimante = 6 CLS OPEN "scrn:" FOR RANDOM AS #ecran OPEN "lpt1:" FOR OUTPUT AS #imprimante sortie = ecran '''sortie = imprimante EcartReduit(1) = 1.96 EcartReduit(2) = 2.054 EcartReduit(3) = 2.17 EcartReduit(4) = 2.326 EcartReduit(5) = 2.576 EcartReduit(6) = 3.29053 EcartReduit(7) = 4.41717 EcartReduit(8) = 5.32672 EcartReduit(9) = 5.73073 EcartReduit(10) = 6.10941 PRINT #sortie, " PROGRAMME LNORMAL.BAS" PRINT #sortie, "" PRINT #sortie, " Test de la proc?dure 'normp'" PRINT #sortie, "" PRINT #sortie, " Ecart r?duit Proba." FOR i = 1 TO 10 z = EcartReduit(i) normp z, p, q, pdf IF (i < 6) THEN PRINT #sortie, USING " #.### ##.####"; z; q * 2 ELSEIF (i = 6) THEN PRINT #sortie, USING " #.##### ##.####"; z; q * 2 ELSE PRINT #sortie, USING " #.##### ##.#########"; z; q * 2 END IF NEXT i END DEFDBL A-H, O-Z ' ' ' ' ' ' SUB normp (z, p, q, pdf) 'Normal distribution probabilities accurate to 1.e-15. 'Z = no. of standard deviations from the mean. 'P, Q = probabilities to the left & right of Z. P + Q = 1. 'PDF = the probability density. 'Based upon algorithm 5666 for the error function, from: 'Hart, J.F. et al, 'Computer Approximations', Wiley 1968 CONST p0 = 220.206867912376# CONST p1 = 221.213596169931# CONST p2 = 112.079291497871# CONST p3 = 33.912866078383# CONST p4 = 6.37396220353165# CONST p5 = .700383064443688# CONST p6 = 3.52624965998911D-02 CONST q0 = 440.413735824752# CONST q1 = 793.826512519948# CONST q2 = 637.333633378831# CONST q3 = 296.564248779674# CONST q4 = 86.7807322029461# CONST q5 = 16.064177579207# CONST q6 = 1.75566716318264# CONST q7 = 8.83883476483185D-02 CONST cutoff = 7.071# CONST root2pi = 2.506628274631# GOSUB normpcalculs EXIT SUB normpcalculs: zabs = ABS(z) '***** |Z| > 37. IF (zabs > 37#) THEN pdf = 0# IF (z > 0#) THEN p = 1# q = 0# ELSE p = 0# q = 1# END IF RETURN END IF '***** |Z| <= 37. expntl = EXP(-.5# * zabs ^ 2) pdf = expntl / root2pi '***** |Z| < CUTOFF = 10/sqrt(2). IF (zabs < cutoff) THEN p = expntl * ((((((p6 * zabs + p5) * zabs + p4) * zabs + p3) * zabs + p2) * zabs + p1) * zabs + p0) / (((((((q7 * zabs + q6) * zabs + q5) * zabs + q4) * zabs + q3) * zabs + q2) * zabs + q1) * zabs + q0) ELSE '|Z| >= CUTOFF. p = pdf / (zabs + 1# / (zabs + 2# / (zabs + 3# / (zabs + 4# / (zabs + .65#))))) END IF IF (z < 0#) THEN q = 1# - p ELSE q = p p = 1# - q END IF RETURN END SUB ========================= SORTIES DU PROGRAMME ===================== PROGRAMME LNORMAL.BAS Test de la proc?dure 'normp' Ecart r?duit Proba. 1.960 0.0500 2.054 0.0400 2.170 0.0300 2.326 0.0200 2.576 0.0100 3.29053 0.0010 4.41717 0.000010000 5.32672 0.000000100 5.73073 0.000000010 6.10941 0.000000001
septix