La fonction y(x)

Description

ATTENTION : http://pgl10.chez.com/download/solut.zip C'est l'adresse de la mise à jour actuelle du zip d'accompagnement de cet envoi en attendant que la mise à jour directe soit possible.

Voici une fonction algébrique qui est extrêmement peu connue et dont l'utilisation semble inconnue. Aujourd'hui, on va simplement la nommer provisoirement : la fonction y(x). Soit m un nombre réel choisi arbitrairement tel que m > (1/e)^(1/e) où e est la base des logarithmes népériens. Par définition y(x) = m est équivalent à m^m = x (l'opérateur ^ signifie : élevé à la puissance de). Ceci montre immédiatement que y(x) admet les valeurs évidentes suivantes : y(1) = 1, y(4) = 2, y(27) = 3, y(256) = 4, y(3125) = 5, etc. Pour les autres valeurs de x, y(x) est une fonction irrationnelle et ne peut pas être exprimée en utilisant les fonctions usuelles de l'algèbre. Dans le domaine des nombres réels y(x) commence à x = xmin = (1/e)^(1/e) où elle vaut y(xmin) = 1/e. C'est une fonction régulière qui est toujours croissante jusqu'à l'infini et qui est dérivable. On peut écrire que la fonction y'(x) = 1/(x(1+ln(y(x))) ou bien y'(m^m) = 1/((m^m)(1+ln(m))). Voir ci-joint les images y(x).jpg et y'(x).jpg. Selon le code source, une simple méthode de dichotomie est utilisable pour calculer facilement et efficacement la valeur de y(x) ou celle de y'(x).

Préciser et calculer la fonction y(x) et sa dérivée n'est qu'une première étape. En plus, on souhaite aussi indiquer plusieurs utilisations de cette fonction. L'équation numéro 1 : 3^x = 2x + 2 a deux solutions dont : x = -1 -(-ln(3)/6)/y(e^(-ln(3)/6))/ln(3) = -0.7901100111, voir equat-1.jpg. Et l'équation numéro 2 : 2^x = 5x a aussi deux solutions dont : x = (-ln(2)/5)/y(e^(-ln(2)/5))/(-ln(2)) = 0.2354557100, voir equat-2.jpg. On va maintenant calculer non pas la solution d'une autre équation mais les solutions d'une infinité d'équations particulières. Soit z un nombre réel choisi tel que 0 < z < e^(1/e). Pour chaque valeur de z l'équation z^x = x a pour solution x = 1/y(1/z). Le code source et les exemples joints en font la démonstration, voir essais.txt et essais.jpg obtenus avec essais.bat. Après avoir bien cherché sur Internet on n'a rien trouvé concernant cette utilisation. C'est pourquoi cette publication semble proposer une nouveauté algébrique.

Le code source en langage C++ est conforme à cette description. Il comporte les commentaires essentiels. Les images ci-jointes sont obtenues en utilisant le langage de programmation Maple V. Au sujet de cette fonction y(x) il existe des informations techniques complémentaires qui débordent les limites du programme ici présent.

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <cmath>

//  Calcul de y(x) = m  <==>  m^m = x
//  xmin = (1/e)^(1/e) = 0.69220062755534636
//  ymin = y(xmin) = 1/e = 0.36787944117144232 = amin
//  bmax = 143.0 <==> xmax = bmax^bmax voisin de : 1.633e+308
double y(double x) {
    if(x < 0.69220062755534636) return 0.0;
    double a = 0.36787944117144232;
    double b = 143.0;
    double m, mm, n=0.0;
    do {
        m = (a+b)/2.0;
        if(m == n) break;
        mm = pow(m,m);
        if(mm > x) b = m; 
        if(mm < x) a = m; 
        n = m;
    }while((abs(mm-x) > 0.0) && (b-a > 0.0));
    return m;
}

//  Calcul de y'(x) = 1/(x(1+ln(y(x)))  
//  ou : y'(m^m) = 1/((m^m)(1+ln(m)))
double yp(double x) {
    if(x < 0.69220062755534636) return 0.0;
    double a = 0.36787944117144232;
    double b = 143.0;
    double m, mm, n=0.0;
    do {
        m = (a+b)/2.0;
        if(m == n) break;
        mm = pow(m,m);
        if(mm > x) b = m; 
        if(mm < x) a = m; 
        n = m;
    }while((abs(mm-x) > 0.0) && (b-a > 0.0));
    return 1.0/(mm*(1.0+log(m)));
}

int main(int argc, char** argv) {
    std::cout << "Calcul de x tel que z^x = x";
    if(argc == 1 || argc > 2) {
        std::cout << std::endl << std::endl << "Faire : solut z" << std::endl 
                  << std::endl << "avec : 0 < z < e^(1/e) = 1.44466786" << std::endl;
        return 0;
    }
    std::istringstream iss;
    iss.str(argv[1]);
    double z;
    iss >> z;
    std::cout << " avec z = " << std::setprecision(15) << z << std::endl;
    double x = 1.0/y(1.0/z);
    std::cout << std::endl << "x = " << std::setprecision(15) << x << std::endl;
    std::cout << std::endl << "z^x = " << std::setprecision(15) << pow(z, x) << std::endl;
    return 0;
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.