Règle de trois "exponentielle"

Monky

XLDnaute Nouveau
Bonjour,

J'ai un petit problème dont je ne me rappelle plus comment m'en dépatouiller. Je souhaiterais appliquer à un produit en croix, tout ce qu'il y a de plus basique, une valeur maximale de départ et d'arrivée pour obtenir une distribution exponentielle et non linéaire.

Par exemple, selon la règle de trois, si je disperse les valeurs suivantes :
5555 > 350
2214 > 139
1121 > 71
980 > 62
358 > 23
60 > 4
2 > 0

Mon écart entre 350 et 0 est trop important. Je souhaiterais y intégrer un coefficient permettant de distribuer la série entre 350 (max) et 25 par exemple (min). Mais je ne retrouve plus du tout comment faire cela?

Merci par avance pour vos avis,
 

Dranreb

XLDnaute Barbatruc
Re : Règle de trois "exponentielle"

Bonjour.
Pas très clair, mais si une constante hors domaine est à ajouter, cette fonction perso peut peut être vous être utile:
VB:
Function IntpoExp(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
                                     ByVal X2 As Double, ByVal Y2 As Double, _
                                     Optional ByVal Limite As Double = 0) As Double
Y1 = Y1 - Limite: IntpoExp = ((Y2 - Limite) / Y1) ^ ((X - X1) / (X2 - X1)) * Y1 + Limite
End Function
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Règle de trois "exponentielle"

S'il vous est plus facile de spécifier le pourcentage de progression entre Y1 et Y2 qu'il faut atteindre à mi-chemin entre X1 et X2, utilisez plutôt la fonction IntpoMiE du poste suivant.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Règle de trois "exponentielle"

Cela dit tous vos points sont sensiblement sur une droite passant par 0, alors je ne comprends plus rien à votre problème. Voyez mon jeu de fonctions d'interpolations non linéaires mais monotones, au cas où l'une d'entre elles pourrait vous être utile.
VB:
Function IntpoHyp(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
                                     ByVal X2 As Double, ByVal Y2 As Double, _
                                     ByVal X3 As Double, ByVal Y3 As Double) As Double
Dim dX As Double, dY As Double: dX = X3 - X1: dY = Y3 - Y1: If dY = 0 Then IntpoHyp = Y1: Exit Function
IntpoHyp = Y1 + dY * F0à1xyInt((X - X1) / dX, (X2 - X1) / dX, (Y2 - Y1) / dY)
End Function
Function F0à1xyInt(ByVal X As Double, ByVal XInt As Double, ByVal YInt As Double) As Double
Dim Dét As Double, A As Double, B As Double
Dét = XInt - YInt
If Abs(Dét) > 2.3283064365387E-10 Then
   A = XInt * (YInt - 1) / Dét
   B = YInt * (XInt - 1) / Dét
   If X <> -A Then F0à1xyInt = B - (A * B) / (X + A)
Else
   F0à1xyInt = X: End If
End Function
'

Function IntpoExp(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
                                     ByVal X2 As Double, ByVal Y2 As Double, _
                                     Optional ByVal Limite As Double = 0) As Double
Y1 = Y1 - Limite: IntpoExp = ((Y2 - Limite) / Y1) ^ ((X - X1) / (X2 - X1)) * Y1 + Limite
End Function
'

Function IntpoMiE(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
                                     ByVal X2 As Double, ByVal Y2 As Double, _
                                     ByVal YPrcXMil As Double) As Double
IntpoMiE = Y1 + (Y2 - Y1) * F0à1yMiExp((X - X1) / (X2 - X1), YPrcXMil)
End Function
Function F0à1yMiExp(ByVal X As Double, ByVal YàMiChX As Double) As Double
Dim B As Double
If Abs(YàMiChX - 0.5) > 2.3283064365387E-10 Then
   B = (1 / YàMiChX - 2) / YàMiChX
   F0à1yMiExp = ((B + 1) ^ X - 1) / B
Else
   F0à1yMiExp = X: End If
End Function
'

Function IntpoMiL(ByVal Y As Double, ByVal Y1 As Double, ByVal X1 As Double, _
                                     ByVal Y2 As Double, ByVal X2 As Double, _
                                     ByVal YPrcXMil As Double) As Double
IntpoMiL = X1 + (X2 - X1) * F0à1xMiLog((Y - Y1) / (Y2 - Y1), YPrcXMil)
End Function
Function F0à1xMiLog(ByVal X As Double, ByVal XàMiChY As Double) As Double
Dim B As Double
If Abs(XàMiChY - 0.5) > 2.3283064365387E-10 Then
   B = (1 / XàMiChY - 2) / XàMiChY
   F0à1xMiLog = Log(B * X + 1) / Log(B + 1)
Else
   F0à1xMiLog = X: End If
End Function
Indépendamment de cela je peux vous dire que vos valeurs de gauche allant de 2 à 5555 sont typiquement 12 fois plus grandes ou plus petites qu'environ 345 (Exponentielle de l'écart type Pearson des logarithmes). Pour les valeurs correspondantes allant jusqu'à 350, elle contiennent une valeur 0 qui plombe toute possibilité de calcul de cette nature.
 
Dernière édition:

Statistiques des forums

Discussions
312 489
Messages
2 088 852
Membres
103 975
dernier inscrit
denry