Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Fonction W de Lambert

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Y aurait-il, dans Excel, une fonction équivalente à la fonction W de Lambert, désignée aussi par ProductLog ?
Dans le cas contraire, existerait-il une procédure VBA qui résolve ce problème ?
Ce qui permettrait de ne pas devoir passer par des applications sur le net comme "WolframAlpha".
Cette fonction, assez méconnue, permet de résoudre des problèmes (en donnant les racines réelles et, le cas échéant, les complexes) à priori insolubles comme, par exemple :
x^x = z
x = e^W(lnz)
Où, dans cet exemple, il existe une racine réelle et une complexe.

Ou encore :
x^z = z^x
x = -zW(-lnz/z)/lnz
Où, dans cet exemple, il existe deux racines réelles.

Merci
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Magic_Doctor,
Ne connaissant pas cette fonction, j'ai fouillé.

Peut être ici :
Le site propose un fichier xlam, utilisable dans XL.
L'installation d'un fichier xlam est documenté ici :

Vous avez aussi une macro VBA sur ce sujet ici :
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Le problème d'un xlam est que vous ne pouvez partager un fichier sans partager avec le fichier xlam puisqu'il est local.
J'ai extrait la fonction en VBA :
VB:
Function LAMBERTW(x As Double) As Double
  ' computes the first branch for real values only
  ' uses Halley’s method via eqn (5.9) in Corless et al (1996)
  ' initial guess is based on 0 < ln(a) < 3
  Dim xHat As Double
  Dim iter As Integer
  If x < -Exp(-1) Then
    LAMBERTW = CVErr(xlErrValue)
  End If
  xHat = 3 * Log(x + 1) / 4
  For iter = 1 To 10
    xHat = xHat - (xHat * Exp(xHat) - x) / (Exp(xHat) * (xHat + 1) - (xHat + 2) * (xHat * Exp(xHat) - x) / (2 * xHat + 2))
  Next iter
  LAMBERTW = xHat
End Function
Si ça peut vous être utile.
 

Magic_Doctor

XLDnaute Barbatruc
Rebonjour Sylvanu

Encore merci pour votre aide.
Je n'ai pas pu tester (pas d'ordi où je suis ; je suis avec une tablette...).
En parcourant la macro-fonction, je ne pense pas qu'elle renvoie toutes les racines et encore moins les complexes.

Exemple :
x^x = 17,75
x = e^W(ln17.75)

WolframAlpha (utilitaire gratuit sur le net) me renvoie :
x(W0) = 2.7967724426...
x(W-1) = -0.0638776... + 0.617431... i

PS : pour vous éviter de vous prendre la tête en utilisant pour la première fois cette fonction dans WolframAlpha.
La fonction W de Lambert est désignée soit par "productlog", soit par "lambertw".
La syntaxe sera la suivante :
Pour W0 : productlog(0,log17.75) ou plus simplement productlog(log17.75) = 1,028466...
Pour W-1 : productlog(-1,log17.75) = -0.4768645... - 4.609299... i
Ces 2 valeurs sont les "sésames" que renverrait idéalement la fonction. Il suffirait juste de les copier et de les placer dans la formule. L'avantage de WolframAlpha, c'est que l'on écrit directement la formule dans son intégralité pour obtenir les résultats escomptés, à savoir :
x(W0) = e^productlog(log17.75)
x(W-1) = e^productlog(-1,log17.75)

Si on change productlog par lambertw, les résultats seront identiques. C'est au choix du client...
Par défaut log est le logarithme népérien. Il faut spécifier si l'on veut être en base 10, et ça s'écrira toujours "log".
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…