LNORMALE.TXT

(4 KB) Pobierz
    
    
    =========================  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


Zgłoś jeśli naruszono regulamin