IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Loi normale sous Delphi


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Loi normale sous Delphi
    Bonjour,

    j'ai un petit probleme avec la loi normale centree reduite sous Delphi (fonction loi.normale.standard.inverse). Je crois que la fonction directe n'existe pas, du moins d'apres ce que j'ai pu trouver (si ca existe, merci de donner la fonction et/ou le composant, en free bien sur). J'utilise l'approximation de Abramowitz and Stegun, qui est je crois la plus courante. Je souhaiterais quelque chose de plus precis. Quelqu'un aurait des idées ?

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut


    tu veut un truc de ce genre ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    Unit LoiNormalInverse;
    interface
      Function LoiNormaleInverse(fProb : Single;dMean,dEcartType : Double) : Single ;
    implementation 
     
    Const 
      gcUMax : Double = 55.5 ;
      gcInvNCRMax : Single = 99;
     
     
    Function IIf(bVal : Boolean; val1,val2 : Single) : Single;
    begin
       if bVal Then
         result := val1
       else
         result := val2 ;
    end;
     
    Function CalculAireZ(z : Double) : Single;
    var
      f , u , s , t , s1 : Double;
      fini : Boolean;
    begin   
       u := z * z
       If (u > gcUMax) Then
          Result := IIf(z > 0, 1, 0)
       Else
       begin
         Notfini := true;
         t  := 1;
         f  := 3;
         While Notfini do
         begin
           s1 := s;
           s := s + t;
           t := t * u / f;
           f := f + 2;
           Notfini := s<>s1;
         end
         Result := z * s / ((8 * ArcTan(1) * Exp(u)) ^ 0.5) + 0.5
       End
    End;
     
    Function LoiStdNormaleInverse(aProb : Single) : Single;
     Const cdEPSILON : Double = 0.0000001;
           ciMaxIter : Integer = 50;
    Var
      dMax , dMin, dCalcZ : Double;
      i : Integer;
      bSign :Boolean;
     fProb : Single
    begin
      fProb := aProb
      if fProb <= 0 Then
         Result := -gcInvNCRMax
       Else
         If fProb >= 1 Then
           Result := gcInvNCRMax
         Else
         begin
            dMin := -Sqr(gcUMax)
            If fProb > 0.5 Then
            begin
              fProb := 1 - fProb
              bSign := True
            End
            While (Abs(dMax - dMin) >= cdEPSILON) And (i < ciMaxIter) do
            begin
              dCalcZ := (dMax + dMin) * 0.5
              If CalculAireZ(dCalcZ) < fProb Then
                dMin = dCalcZ
              Else
                dMax = dCalcZ ;
              i = i + 1;
            end
            Result = IIf(bSign, -dCalcZ, dCalcZ)
         End;
    End;
     
     
    Function LoiNormaleInverse(aProb : Single;dMean,dEcartType : Double) : Single
    begin
       Result := NormaleStdInverse(aProb)
       If (Result > -gcInvNCRMax) And (Result < gcInvNCRMax) Then
          Result := (Result * dEcartType) + dMean;
    End; 
     
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Finalement, le probleme ne venait pas de la loi normale.

    Mais merci beaucoup pour ta methode, je vais regarder de plus pres quand j'aurai le temps.

    Quel est l'erreur maximale d'approximation par rapport a la vraie valeur ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul sur la Loi Normale sous Access
    Par Trini dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/05/2010, 10h29
  2. Réponses: 6
    Dernier message: 03/08/2007, 16h26
  3. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  4. calcul sous delphi
    Par djedje-08 dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2003, 17h39
  5. Réponses: 4
    Dernier message: 27/03/2002, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo