Newsgroup: it.comp.lang.visual-basic
Titolo: erfc

Scusate, qualcuno di voi sa come si può implementare in VB la funzione
integrale ERFC(x) (funzione errore complementare)?
GRAZIE

Simo:
  nel mio sito di "DownLoads" a: 
http://members.xoom.it/flanguasco/
ho messo il progetto Funzioni che, tra le altre routines, ne ha anche
una per il calcolo di Erf(x).  Da quello che ricordo, dovrebbe essere
     Erfc(x) = 1 - Erf(x)
Ciao e fammi sapere se ti va' bene.
Franco


     Erfc(x) = 1 - Erf(x)
Questa formula e' corretta.
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

 wrote in message
3A6B24D6...@MCLINK.IT...


TOSTISSIMOOOOOOOOO..............
Non e' che ci voglia la scala. Tra tutti gli algoritmi che mi vengono
in mente, le 2 strade piu' semplici per calcolarla sono
- l'integrazione per trapezi
- Newton-Raphson
Poi vedi tu quello che ti conviene fare.


La risposta a Simo e' andata, per sbaglio, sul nuovo
messaggio Re: R: erfc anziche' in questo thread.
Avendo fatto la traduzione e l' invio nell' intervallo
di pranzo e quindi con i minuti contati, devo aver
pasticciato con i titoli.
Lo rimando per convenienza (e scusate la lunghezza).
Ciao a tutti e buon lavoro.
Franco
Simo:
  come gia' ti ho scritto l' Erf(x) del progetto Funzioni usa una procedura
generale d' integrazione (quadratura di Romberg) per trovarne il valore.
La precisione del risultato, come in tutti questi tipi di algoritmo, dipende
da quanto vuoi spingere la ricerca. Nella mia routine questa precisione e'
funzione della variabile Eps che io ho impostato, arbitrariamente, a 0.0001
Gia' cosi' e' Erf(x) <= 1 per valori fino a x < 90.  Se tieni presente che gia'
Erf(2.8) = 0.9999 puoi tranquillamente usarla per tutti i valori di x di uso
comune:  nessuno ti proibisce pero' di usare Eps molto piu' piccoli aumentando
cosi' sia la precisione che il tempo di calcolo.
Se poi proprio non ti accontenti, ti allego una routine che gia' usavo negli
anni '70 in FORTRAN sul PDP 11/10.  Te l' ho rapidamente convertita in VB,
nell' intervallo di pranzo, per cui scuserai i GoTo tanto invisi ai puristi.
Ti potrai quindi divertire a studiarne le strategie di calcolo ed a giocare
con i valori NBC e NBM che ne determinano la precisione.
Ciao e fammi sapere.
Franco
Public Sub ERRINT(ByVal x#, ByRef ERF#, ByRef ERFC#)
'
'   AUTOMATIC COMPUTING METHODS FOR SPECIAL FUNCTIONS
'   PART 1. ERROR, PROBABILITY, AND RELATED FUNCTIONS
'   BY IRENE A. STEGUN AND RUTH ZUCKER
'   J. RES. NBS, VOL 74B, NO. 3, 211-224, (1970)
'
'   USAGE.     CALL ERRINT (X,ERF,ERFC)
'              ENTERING WITH X(A REAL VARIABLE), ONE OBTAINS BOTH ERF X
'              AND ERFC X TO THE MAXIMUM MACHINE ACCURACY POSSIBLE.
'
'   ERF(X)  = (2/SQRT(PI))*INTEGRAL FROM 0 TO X OF EXP(-T^2) DT
'   ERFC(X) = (2/SQRT(PI))*INTEGRAL FROM X TO INFINITY OF EXP(-T^2) DT
'           = 1 - Erf(x)
'
'   Erf(-x) = -Erf(x)
'   Erfc(-x) = 2 - Erfc(x)
'
'   NBC=    NO. OF BINARY DIGITS IN THE CHARACTERISTIC OF A FLOATING POINT NUMBER.
'   NBM=    ACCURACY DESIRED OR MAX. NO. OF BINARY DIGITS IN THE MANTISSA OF
'           A FLOATING POINT NUMBER.
'
'   METHOD. POWER SERIES FOR ABS(X) < 1, ULPS, UPPER LIMIT FOR SERIES
'           CONTINUED FRACTION FOR ABS(X) > 1 AND <= ULCF (UPPER
'           LIMIT OF CONTINUED FRACTION)
'
'   RANGE.  ABS(X) <= ULCF     ULCF=.83*(2.^((NBC-1)/2))
'           ABS(ULCF) APPROX.  9.3, NBC = 8
'                             26.5, NBC = 11
'           BEYOND THIS RANGE THE LIMITING VALUES OF THE FUNCTIONS ARE
'           SUPPLIED - Erf(INF) = 1#, Erfc(INF) = 0#
'
'   ACCURACY.  ROUTINE WILL RETURN (NBM-I-3) SIGNIFICANT BINARY DIGITS
'              WHERE I IS THE NUMBER OF BINARY DIGITS REPRESENTING THE
'              INTEGER PART OF X ^ 2. (THIS IS ESSENTIALLY THE ACCURACY OF
'              THE EXPONENTIAL ROUTINE.)
'
'   PRECISION. VARIABLE - BY SETTING DESIRED NBM.
'
    Dim AN#, BN#, C1#, DN#, F#, FN#, FNM1#, FNM2#
    Dim GN#, GNM1#, GNM2#, PREV#, PWR#, RNBC#, SCF#, SUM#
    Dim TN#, TOLER#, ULCF#, WN#, y#, YSQ#, IF_AR#
'
    Const NBC& = 11, NBM& = 60
    Const ONE# = 1#, TWO# = 2#, FOUR# = 4#, ULPS# = 1#, CONS# = 0.83
    Const TRRTPI = 1.12837916709551
'
    RNBC = NBC
    TOLER = TWO ^ (-NBM)
'
'   TEST ON ZERO
'
    'IF (X) 2,1,2
    On IF_ARI(x) GoTo 2, 1, 2
'
1   ERF = 0#
    ERFC = ONE
'
    Exit Sub
'
2   y = Abs(x)
    YSQ = y ^ 2
'
    'IF (Y-ULPS) 3,3,4
    On IF_ARI(y - ULPS) GoTo 3, 3, 4
'
'   MAXIMUM ARGUMENT
'
4   C1 = TWO ^ ((RNBC - ONE) / TWO)
    ULCF = CONS * C1
'
'   SCALE FACTOR
'
    SCF = TWO ^ (C1 ^ 2 - RNBC)
'
'   LIMITING VALUE
'
    'IF (Y-ULCF) 10,10,11
    On IF_ARI(y - ULCF) GoTo 10, 10, 11
'
11  ERF = ONE
    ERFC = 0#
    GoTo 7
'
'   METHOD --- POWER SERIES
'
3   SUM = 0#
    DN = ONE
    TN = ONE
    PWR = TWO * YSQ
6   DN = DN + TWO
    TN = PWR * TN / DN
    SUM = TN + SUM
'
'   TOLERANCE CHECK
'
    'IF (TN-TOLER) 5,6,6
    On IF_ARI(TN - TOLER) GoTo 5, 6, 6
'
5   ERF = (SUM + ONE) * TRRTPI * y * Exp(-YSQ)
    ERFC = ONE - ERF
'
'   NEGATIVE ARGUMENT
'
    '7   IF (X) 8,9,9
7  On IF_ARI(x) GoTo 8, 9, 9
'
8   ERF = -ERF
    ERFC = TWO - ERFC
'
9   Exit Sub
'
'   METHOD --- CONTINUED FRACTION
'
10  FNM2 = 0#
    GNM2 = ONE
    FNM1 = TWO * y
    GNM1 = TWO * YSQ + ONE
'
    PREV = FNM1 / GNM1
'
    WN = ONE
    BN = GNM1 + FOUR
'
14  AN = -WN * (WN + ONE)
'
    FN = BN * FNM1 + AN * FNM2
    GN = BN * GNM1 + AN * GNM2
'
    F = FN / GN
'
'   TOLERANCE CHECK
'
    'IF (ABS( ONE - (F/PREV) ) - TOLER) 12,12,13
    On IF_ARI(Abs(ONE - (F / PREV)) - TOLER) GoTo 12, 12, 13
    '13  IF (PREV - F) 17,17,18
13  On IF_ARI(PREV - F) GoTo 17, 17, 18
'
'   BOTH FN AND GN MUST BE TESTED IF ABS (X) .LT. .61
17  If (GN < SCF) Then GoTo 16
'
'   SCALING
'
    FN = FN / SCF
    GN = GN / SCF
    FNM1 = FNM1 / SCF
    GNM1 = GNM1 / SCF
'
16  FNM2 = FNM1
    GNM2 = GNM1
    FNM1 = FN
    GNM1 = GN
'
    WN = WN + TWO
    BN = BN + FOUR
    PREV = F
    GoTo 14
'
18  F = PREV
12  ERFC = F * Exp(-YSQ) * TRRTPI / TWO
    ERF = ONE - ERFC
'
    GoTo 7
'
'
'
End Sub
Private Function IF_ARI(ByVal x#) As Long
'
'   Da usare come:      On IF_ARI(x) GoTo Ln1, Ln2, Ln3
'   Per simulareare:    IF (x) Ln1, Ln2, Ln3
'   che e' l' IF aritmetico del FORTRAN.
'
    If x < 0# Then
        IF_ARI = 1
    ElseIf x = 0# Then
        IF_ARI = 2
    Else
        IF_ARI = 3
    End If
'
'
'
End Function