Erreur d'exécution '6' : dépassement de capacité

Erreur d'exécution '6' : dépassement de capacité - VB/VBA/VBS - Programmation

Marsh Posté le 06-01-2007 à 17:36:12    

Salut,  
 
Quand j'essaie de compiler ce code en VBA, ça me donne l'erreur suivante "Erreur d'exécution '6' : dépassement de capacité"
En fait, ce code me sert a évaluer l'intégrale double suivante grace a Monte Carlo :  
                1        
E(T)= ∫ (Γ(25.8+(1/m)) / ((1/m)! Γ(25.8))) * (0.11^r)((1-0.11)^(1/m)) * (1/m)*((1/m)-1)*(1/m²)
                0    1
                  *[∫ 0.04(350² / (t^3)) ((1-exp(-0.04((350 / t) - 350))))^((1/m)-2)*exp(-2*004((350 / t) - 350)) dt] dm
         0                        
Pour ça, j'utilise la fonction gamma, codée de la manière suivante:
 
Function FactGamma(ByVal X As Double)
 
If X > 0 Then
    FactGamma = Exp(Application.WorksheetFunction.GammaLn(X))
Else
    If X = Int(X) Then FactGamma = "#INFINI!": Exit Function
    X = -X + 1
    FactGamma = Exp(WorksheetFunction.GammaLn(X))
    FactGamma = 4 * Atn(1) / (FactGamma * Sin(4 * Atn(1) * X))
End If
 
End Function
 
 
Voilà mon code pour le calcul de l'intégrale double; je précise que j'ai auparavant simulé deux échantillons de 100 valeurs d'une variable aléatoire suivant une loi uniforme sur [O,1] avec le générateur de nombres aléatoires d'Excel, dans les colonnes 1 et 2 de ma feuille Excel :
 
Sub k2()
Dim n As Double
Dim k As Double
Dim x0 As Double
Dim r As Double
Dim p As Double
Dim alpha As Double
Dim I1new As Double
Dim I2new As Double
Dim Inew As Double
Dim Enew As Double
 
n = 25
k = 1
alpha = 0.04
x0 = 350
p = 0.11
r = 25.8
Inew = 0
 
For k = 1 To n
    Cells(k, 3) = (FactGamma(r + (1 / Cells(k, 2))) / ((WorksheetFunction.Fact(1 / Cells(k, 2))) * FactGamma(r))) * (p ^ r) * ((1 - p) ^ (1 / Cells(k, 2))) * (1 / Cells(k, 2)) * ((1 / Cells(k, 2)) - 1) * (1 / (Cells(k, 2) ^ 2)) * alpha * ((350 ^ 2) / (Cells(k, 1) ^ 3)) * ((1 - Exp(-alpha * ((350 / Cells(k, 1)) - 350))) ^ ((1 / Cells(k, 2)) - 2)) * Exp(-2 * alpha * ((350 / Cells(k, 1)) - 350))
    Inew = Inew + Cells(k, 3)
Next k
 
Inew = Inew / n
 
Cells(11, 11) = Inew
 
End Sub
 
 
Quelqu'un pourrait me dire pourquoi je n'ai pas l'erreur dont j'ai parlé plus haut si je met n=25 et je l'ai si je met n supérieur a 25 svp ?

Reply

Marsh Posté le 06-01-2007 à 17:36:12   

Reply

Marsh Posté le 06-01-2007 à 22:30:11    

pense à rajouter un end if dans ta fonction factgamma
une cellule excel peut accueilli une valeur maximale il me semble...

Reply

Marsh Posté le 06-01-2007 à 22:48:33    

Le End If y est, juste au-dessus du End Function
 
Alors, d'après toi, pourquoi est-ce que ça bloque ? Pourquoi est-ce que ça met une erreur si mon n est trop grand ?
 
Je comprend vraiment pas ...

Reply

Marsh Posté le 06-01-2007 à 23:01:30    

je te demandais justement si une cellule excel a une valeur limite maxi, vu que tu donnes a cells(k,3) une valeur.... d'ailleurs, tu as bien tous les .value dans ton code ?

Reply

Marsh Posté le 07-01-2007 à 01:29:25    

non non, les valeurs des cellules ne sont pas limitées.
Et oui, j'ai mis les .value

Reply

Marsh Posté le 07-01-2007 à 20:02:18    

Coucou, quelqu'un pourrait me venir en aide svp ?
 
C'est vraiment URGENT !!!

Reply

Marsh Posté le 07-01-2007 à 20:42:35    

Bonsoir,
inew est limité à 1,79769313486231E308  
Cordialement

Reply

Marsh Posté le 07-01-2007 à 21:43:16    

Salut,
 
je comprend que inew soit limité, mais 1,79769313486231E308 c'est énorme, donc normalement y'a aucun pb si je veux que n soit égal a 100 1000 ou 10000, c'est-à-dire que ma boucle fait 100 1000 ou 10000 itérations, je me trompe ?

Reply

Marsh Posté le 08-01-2007 à 07:02:07    

Bonjour,
si tu ne trouves pas, peux-tu mettre sur cjoint.com (ou autre) un xls avec tes échantillons et tes formules? en précisant si c'est bien à partir de n=26 que tu as le pb.  
Cordialement

Reply

Marsh Posté le 08-01-2007 à 11:41:48    

J'ai du mal à interpréter les symptômes que tu rencontres.
L'erreur est bien à la compilation et pas à l'exécution ?

 

Sinon ta fonction FactGamma() n'est pas typée. Cela peut poser problème vu qu'elle sert aux calculs.


Message édité par tegu le 08-01-2007 à 11:42:05
Reply

Marsh Posté le 08-01-2007 à 11:41:48   

Reply

Marsh Posté le 08-01-2007 à 16:01:10    

Comment ça ? Il faut rajouter quelquechose dans factgamma?

Reply

Marsh Posté le 09-01-2007 à 04:03:23    

A mon humble avis et à premiere vue un de ces pbs de dépassement de capacité vient entre autre de Fact(1 / Cells(k, 2) si la valeur de cells(k,2) tend vers 0


Message édité par kiki29 le 09-01-2007 à 06:55:33
Reply

Marsh Posté le 09-01-2007 à 09:49:15    

Tu peux déclarer ta fonction comme suit :

Function FactGamma(ByVal X As Double)  As Double

Cela permet de typer la fonction de la même manière que tes variables.
Reste que je doute que cela soit l'origine du problème.

Reply

Marsh Posté le 10-01-2007 à 07:29:50    

Bonjour,
prenons
0,195105372 0,005743192
 
dans factGamma  X=199,919 et des poussières
Gammaln(X) = 857,505 et d'autres poussières
 
e puissance 857.... donne dépassement de capacité
 
Exp, fonction
       
 
Renvoie une valeur de type Double indiquant la valeur de e (base des logarithmes népériens) élevé à une puissance.
 
Syntaxe
 
Exp(number)
 
L'argument number peut contenir une valeur de type Double ou toute expression numérique valide.
 
Remarques
 
Si la valeur de l'argument number est supérieure à 709,782712893, une erreur se produit. La constante e est environ égale à 2,718282.
 
Note   La fonction Exp, qui est la fonction réciproque de la fonction Log, est parfois désignée par l'expression "antilogarithme".
 
Cordialement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed