Zéros de a.x.ln(x) + b.x + c 1 Étude succincte de la fonction x f(x) = a.x.ln(x) + b.x + c A priori, a, b, c, x sont des réels quelconques et f prend ses valeurs dans R. 1.1 Restriction préliminaire Si a = 0, la fonction se réduit à une fonction affine ; je n étudie pas ce cas trivial. On suppose désormais a 0. 1.2 Domaine de définition et dérivabilité La fonction x f(x) n est définie que pour x positif. x f(x) est continue et dérivable pour tout x > 0. Sa limite lorsque x tend vers 0 par valeurs positives est c. Elle est donc continue pour tout x 0. 1.3 Dérivées du premier et deuxième ordre Sa dérivée est x f (x) = a.(ln(x) + 1) + b pour tout x > 0. Elle est définie, continue et dérivable pour tout x strictement positif. Puisqu on suppose a 0, elle s annule pour x = exp( 1 b/a). Elle est du signe de a dans un voisinage de 0 et tend vers si a > 0 ou vers + si a < 0 lorsque x tend vers 0. Elle tend vers + si a > 0 ou vers si a < 0 lorsque x tend vers +. La dérivée seconde de x f(x) est x f (x) = a/x. Elle est définie, continue (et dérivable) pour tout x strictement positif. Son signe est celui de a pour tout x > 0. Elle tend vers + si a > 0 ou vers si a < 0 lorsque x tend vers 0. Elle tend vers 0 lorsque x tend vers +. 1.4 Variation On pose γ = exp( 1 b/a). 1. Si a < 0, on remplacera a, b, c par leurs opposés. Les zéros de f(x) n en seront pas affectés. Pour la suite, et sans perte de généralité s agissant de trouver les zéros de f(x), on suppose a > 0. 1 Sous cette hypothèse, la fonction est convexe, strictement décroissante sur l intervalle [0; γ], puis strictement croissante sur l intervalle [γ; + [. Pour x = 0, f(x) = c ; elle atteint son minimum a.γ + c pour x = γ. 1.5 Existence et caractérisation des zéros 1.5.1 Pas de solution : Si c > a.γ, la fonction ne s annule jamais. 1.5.2 Une solution double : Si c = a.γ, la fonction s annule pour x = γ. 1.5.3 Deux solutions distinctes : Si 0 c < a.γ, la fonction s annule en un point de l intervalle [0; γ[ et en un point de l intervalle ]γ; + [. 1.5.4 Une solution simple : Si c < 0, la fonction s annule en un point de l intervalle ]γ; + [. ROGER2327 16 Frimaire An ccxxiii 1
2 Construction des solutions L étude faite (section 1) fournit explicitement la réponse cherchée dans les cas 1.5.1 et 1.5.2. Reste à étudier les cas 1.5.3 et 1.5.4. Méthode La régularité de la fonction et la convexité permettent l utilisation d une méthode sans sophistication. Compte tenu que la dérivée première n est pas monotone, j écarte la méthode de la tangente (ou les méthodes voisines). Je retiens une méthode dichotomique sans raffinement excessif. 2.1 Deux solutions distinctes (1.5.3) 2.1.1 Plus petite solution : Si c = 0 la solution est 0. Sinon, posant α = 0 et β = γ, la solution est dans l intervalle ]α; β[. On a évidemment f(α) > 0 et f(β) < 0. On construit une suite (x i ) i= 1,0,1,... telle que x 1 = α, x 0 = β et x i = x i 1 +ε i.(β α)/2 i où ε i = +1 si f(x i 1 > 0, ε i = 1 dans le cas contraire. x i x i 1 = (β α)/2 i décroît rapidement et tend vers 0 lorsque i croît infiniment. On arrête le calcul de x i dès qu on trouve i tel que f(x i ) = 0 (auquel cas x i est exactement le zéro cherché) ou tel que (β α)/2 i est inférieur à une constante strictement positive choisie en fonction de la précision qu on souhaite obtenir. 2.1.2 Plus grande solution : Dans ce cas, on n a pas borné l intervalle contenant la solution. On commencera donc par construire une suite (u i ) telle que u 0 = γ. On a évidemment f(u 0 ) < 0. On calcule u i+1 = 2.u i tant que f(u i ) < 0. La fonction n n N 2 n croît rapidement et on obtient assez vite j tel que f(u j 1 ) < 0 et f(u j ) 0. Si f(u j ) = 0, c est fini : (u j ) est le zéro cherché. Sinon, on a au moins borné l intervalle de recherche : c est ]u j 1 ; u j [, de longueur 2 j 1.x 0. On est alors ramené au cas précédent à la nuance près que sur cet intervalle, f n est pas décroissante, mais strictement croissante. Posant α = u j 1 et β = u j, la solution est dans l intervalle ]α; β[. On a cette fois f(α) < 0 et f(β) > 0. On construit une suite (x i ) i= 1,0,1,... telle que x 1 = α et x 0 = β. x i = x i 1 ε i.(β α)/2 i où ε i = +1 si f(x i 1 > 0, ε i = 1 dans le cas contraire. x i x i 1 = (β α)/2 i décroît rapidement et tend vers 0 lorsque i croît infiniment. On arrête le calcul de x i dès qu on trouve i tel que f(x i ) = 0 (auquel cas x i est exactement le zéro cherché) ou tel que (β α)/2 i est inférieur à une constante strictement positive choisie en fonction de la précision qu on souhaite obtenir. 2.2 Solution simple (1.5.4) Voir 2.1.2. 3 Mise en œuvre Construisons une solution pour Excel R et VisualBasicForApplications R. Afin d alléger la charge de calcul, nous ne travaillerons pas avec la fonction x f(x) = a.x.ln(x) + b.x + c mais avec une forme plus canonique : x Fonction(x) = x.(ln(x) + b/a) + c/a. Nous pouvons l écrire : Function Fonction#(x#, p) I f x Then Fonction = ( Log( x ) + p ( 0 ) ) x + p (1) Else Fonction = p (1) End I f où p est un tableau contenant les paramètres b/a et c/a. L appel de Fonction pour l évaluer en x s écrit par conséquent : Fonction (x, Array (b / a, c / a ) ) Fonction ne vérifie pas la validité de ses arguments : nous devrons effectuer les vérifications nécessaires avant son appel. ROGER2327 16 Frimaire An ccxxiii 2
Comme nous avons su séparer les zéros, il nous faut maintenant une fonction AnnuleF onction capable de trouver un éventuel zéro de F onction dans un intervalle [inf; sup] où elle est monotone : Function AnnuleFonction ( i n f #, sup#, p) Dim x0#, x1#, f0 #, f1 #, h#, k# f0 = Fonction ( inf, p) f1 = Fonction ( sup, p) I f f0 = 0 Then AnnuleFonction = i n f E l s e I f f1 = 0 Then AnnuleFo nctio n = sup E l s e I f f1 f0 > 0 Then AnnuleFonction = Evaluate("=NA( ) " ) Else I f f1 > f0 Then k = 1 Else k = 1 x0 = i n f x1 = sup h = x1 x0 Do f1 = Fonction ( x1, p) h = h / 2 x0 = x1 I f f1 > 0 Then x1 = x1 k h Else x1 = x1 + k h f0 = f1 Loop While h > 1E 20 And f 0 <> 0 AnnuleFo nctio n = x0 End I f Nous commençons par regarder si F onction s annule sur l une des bornes de l intervalle [inf; sup]. Sinon, nous vérifions l existence d un zéro dans l intervalle [inf; sup] en vérifiant que F onction(inf) et F onction(sup) ne sont pas de même signe. Si Fonction(inf) et Fonction(sup) sont de même signe (pas de zéro), AnnuleFonction renvoie une valeur d erreur. Nous déterminons ensuite le sens de variation de Fonction sur l intervalle [inf; sup]. Si la fonction est croissante, le paramètre k prend la valeur 1, sinon k prend la valeur 1. Nous procédons enfin à la recherche dichotomique du zéro. Remarque : AnnuleF onction est indépendante de F onction car le paramètre p n y est jamais traité : AnnuleFonction se contente de le transmettre à Fonction. Cela signifie que AnnuleF onction peut être utilisé pour bien d autres fonctions pourvu qu elles soient monotones. Il ne reste plus qu à écrire l appel de AnnuleF onction. ROGER2327 16 Frimaire An ccxxiii 3
Pour trouver l éventuel zéro dans l intervalle [0; γ[ : Functio n PPZ( a#, b#, c#) PPZ = AnnuleFonction (0, Exp( 1 b / a ), Array (b / a, c / a ) ) Pour trouver l éventuel zéro dans l intervalle [γ; [ : Functio n PGZ( a#, b#, c#) Dim x# x = Exp( 1 b / a ) Do While Fonction (x, Array (b / a, c / a ) ) < 0 : x = x + x : Loop PGZ = AnnuleFonction (Exp( 1 b / a ), x, Array (b / a, c / a ) ) Le nombre d itérations effectuées par ces deux fonctions n excède pas quelques dizaines (typiquement, 40 à 50). S il nous plaît, nous pouvons englober le tout avec : Functio n pgzero( a#, b#, c#) Dim u, v S e l e c t Case c Case I s < 0 : u = Evaluate("=NA( ) " ) : v = PGZ( a#, b#, c#) Case 0 : u = 0 : v = PGZ( a#, b#, c#) Case a Exp( 1 b / a ) : u = Exp( 1 b / a ) : v = u Case I s > a Exp( 1 b / a ) : u = Evaluate("=NA( ) " ) : v = u Case Else : u = PPZ( a#, b#, c #): v = PGZ( a#, b#, c#) End S e l e c t pgzero = Array (u, v) qui renvoie les deux zéros de la fonction dans un vecteur-ligne. ROGER2327 16 Frimaire An ccxxiii 4
4 Essais... Si P P Z et P GZ fournissent des réponses correctes dans la majorité des cas, 2 il n en demeure pas moins que les résultats ne sont pas toujours corrects, notamment avec P P Z lorsque c est très voisin de γ. Dans ce cas, plusieurs facteurs se conjuguent pour rendre la solution difficile. 1. Intrinsèquement, la fonction x f(x) = a.x.ln(x) + b.x + c ne facilite pas la chose, car nous avons vu que ses deux premières dérivées tendent vers ± selon le signe de a lorsque x 0 +. 2. (a) Faible qualité calculatoire d Excel R. Par exemple, copier une cellule et coller sa valeur («Coller valeur seule») dans une autre ne garantit pas que les deux cellules contiennent la même chose, même si un test d égalité prétend le contraire. On peut parfois améliorer la situation en effectuant des contrôles dans la feuille de calcul plutôt que dans le code ; préférer, par exemple, la formule à = SI(c = a EXP ( 1 b/a); EXP ( 1 b/a); SI(c = 0; 0; = P P Z(a; b; c ). SI(ET (0 < c ; c < a EXP ( 1 b/a)); P P Z(a; b; c ); NA()))) Pour conclure, en cherchant bien, nous pourrons probablement toujours trouver un cas pathologique... Que les courageux masochistes? qui m ont suivi jusqu ici (merci!) n hésitent pas à me signaler les erreurs que ne manque pas de contenir ce document écrit rapidement. (b) L échange de données entre Excel R et VisualBasic R ne respecte pas nécessairement l intégrité des données. (c) La représentation interne des nombres avec une mantisse sur 53 bits 3 est un peu courte... Bref, Excel R est un tableur, pas un outil de calcul scientifique. ROGER2327 14-15 Frimaire An ccxxiii 2. Voir le document dichotomie5.xlsm. 3. Type Double sur 8 octets, voir IEEE 754. ROGER2327 16 Frimaire An ccxxiii Merci LATEX!