Équation de la fonction de Heaviside

Bonjour,

Mon problème est que je cherche l'équation de la fonction de Heaviside ou fonction échelon. C'est donc la fonction H (discontinue en 0) prenant la valeur 1 pour tous les réels positifs et la valeur 0 pour les réels strictement négatifs. ( Wikipedia)

Or, je ne la trouve que de la forme : 1 si x>0 & 0 si x<0.

Or, j'aimerais obtenir cette fonction sous la forme f(x)=? (une équation).

Une stratégie que j'employais est : f(x)=9999^racine(x) : Le résultat est satisfaisant, mais il m' est inutilisable dans un algorithme.

(Mon objectif est d'obtenir une fonction égale à 1 sur un intervalle donné, et 0 hors de cette intervalle)

Réponses

  • Il est difficile de répondre sans savoir à quelles fonctions tu as accès. Si tu as accès à des fonctions type "fonctions caractéristiques", c'est trivial. De même si tu as accès à une fonction qui te rend le signe d'un réel (sous la forme -1 ou 1 par exemple).
  • Alors, la fonction obtenue à partir de la "fonction de Heaviside" deviendra un tronçon d' une autre fonction. Cela ayant pour but de modéliser une suite de point. Or, cette fonction devra être relativement simple : les fonction mathématique que je possède sont les suivantes :

    https://www.tutorialspoint.com/c_standard_library/math_h.htm

    Bien que je puisse l' obtenir à partir de condition dans un algorithme, je tient absolument à obtenir une fonction de la forme f(x)=?.
  • Tu peux toujours simuler le signe en utilisant la fonction valeur absolue. Cela te donnerait : f(x) = 0.5 + 0.5*x/fabs(x) mais évidemment cela ne marche pas en zéro.
  • Whaou, merci beaucoup, cette fonction marche bien. Mais, comme vous l'avez mentionné, elle n' est pas définie en 0, ce qui provoque des trous sur ma courbe finale, ce qui pose problème : Cette courbe représente la position d' un objet en fonction du temps, or cet objet ne peux pas disparaître ....

    Ma fonction devrais donc être continue.
  • Tu veux une fonction continue sur $\R$ qui vaut $0$ pour les réels négatifs et $1$ pour les réels positifs ? Tu risques de chercher longtemps !

    PS. Je sens qu'on est parti pour une discussion sans issue si tu n'expliques pas quel est ton vrai problème. Ça arrive assez souvent, comme par exemple dans ce fil.
    Par ailleurs, si tu programmes en C, tu n'as pas la possibilité de définir une fonction "signe" et de l'utiliser ??
  • Si on parle d'une implémentation informatique il est toujours possible de définir une fonction et de l'utiliser par la suite. Ça résoudrait bien des problèmes je pense.
  • Je vous propose l' idée suivante :

    soit f(x)=(0.5+0.5(-x+3)/|-x+3|)*(x)+(0.5+0.5(x-3)/|x-3|)*(-x+6)

    ( f(x) = intervalle1*fonction1 + intervalle2*fonction2 )

    Or, dans ce cas à x=3, la fonction n' est pas définie. Or, je n'ai besoin que des entier de cette fonction (incrémentation), pourquoi ne pas décaler notre fonction de 0+sur x, soit que x prend la valeur x+0.000...001.

    tel que : f(x)=(0.5+0.5(-(x+0.000001)+3)/|-(x+0.000001)+3|)*(x+0.000001))+(0.5+0.5(x+0.000001-3)/|x+0.000001-3|)*(-(x+0.000001)+6)

    Puis j'arrondi le résultat à l'entier le plus proche.

    et à x=3 : f(x)=3

    Merci roumegaire et GaBuZoMeu de vos réponses,si vous trouvez une autre technique plus efficace ou plus propre, n'hésitez pas à m'en faire part.
  • Déjà, abs(x)/x vaut -1 si x<0, 1 si x>0 et n’est pas définie en 0.
    Ajoute 1, divise par 2 le tout et hop : $H(x)=\frac{\frac{|x|}{x}+1}{2}$.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Et pourquoi pas tout simplement :
    double heaviside(double x)
    {
    if (x<0)
    return 0;
    else
    return 1;
    }

    Et ensuite tu peux utiliser heaviside(t) dans toutes tes expressions...
  • En Python:
    def H(x):
      return int(x>=0)
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Nicolas.patrois, on retrouve le même problème :

    H(0)=(|0|/0+1)/2 = rien

    C' est la même chose que f(x) = 0.5 + 0.5*x/|x|.

    Et roumegaire, je désire une fonction f(x)=? (sans fonction mathématiques propre à moi à l'intérieur)
  • Et pourquoi tiens-tu absolument à ne pas faire trop simple ?
    Il y a là une contrainte incompréhensible. Je répète : quel est ton vrai problème ?
  • Je rejoins GBZM : puisque nous sommes dans le domaine de l'informatique, "sans fonction mathématique propre à moi" n'a pas de sens.
  • PIRX écrivait : http://www.les-mathematiques.net/phorum/read.php?3,1487638,1487706#msg-1487706
    [Inutile de recopier un message présent sur le forum. Un lien suffit. AD]
    Ce message résume mon problème : réaliser une fonction comme somme de différentes fonctions :
    par exemple :
    sur [-10;0[ : f(x)=x
    sur [0;10[ : f(x)=-x
    sur [10;20] f(x)=5
    sinon f(x)=0

    Ce que j'arrive à faire avec cette technique :
    f(x) = intervalle1*fonction1 + intervalle2*fonction2

    la fonction intervalle1 signifie qu'elle vaux 1 sur l' intervalle désiré et 0 hors de cet intervalle.

    Or, mon problème est dans la réalisation de cette fonction intervalle. (Ce n' est pas forcement le bon terme)

    ps : "sans fonction mathématique propre à moi" signifie que je ne veux utiliser que des opérations mathématiques trouvables sur une calculatrice (type collège / lycée)
  • La fonction de Heaviside n’est pas continue, tu auras du mal à lui trouver une expression algébrique sans pépin.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • @PIRX : Tu dis :
    Bien que je puisse l' obtenir à partir de condition dans un algorithme, je tient absolument à obtenir une fonction de la forme f(x)=?
    et aussi
    "sans fonction mathématique propre à moi" signifie que je ne veux utiliser que des opérations mathématiques trouvables sur une calculatrice (type collège / lycée)
    mais tu n'expliques pas dans quel but tu désires cette difficulté supplémentaire.
    On te le demande car ta question est immédiate à résoudre (informatiquement parlant) si on enlève cette contrainte qui parait absurde.

    Si cette contrainte a une raison d'être, il nous est important de la connaître.

    Par ailleurs, toutes les calculatrices Lycée que je connais ont une fonction qui donne le signe d'un nombre, ainsi que des fonctions que l'on peut définir par morceaux, avec des conditions... ce qui tendrait encore une fois à montrer que ta demande n'a pas lieu d'être, sauf motivation que tu ne nous as toujours pas donnée, malgré notre insistance (c'est la 3ème fois qu'on te le demande !)
  • Si, j'ai besoin d' une fonction de la forme f(x) = ?, c' est que je veux l' exploiter par la suite :
    Mon objectif est donc de réaliser un logiciel auquel je lui donne une série de points ( obtenue par pointage ou par tableau ) et il me ressortirais une fonction passant par ces points. C' est un modélisation, mais, la fonction qu'il me ressortirait n' est pas une fonction que nous retrouvons sur les logiciels lambda. Ma fonction finale ne serais donc pas une fonction mathématique usuelle ( comme un polynôme ). En effet, elle serait une somme d'interpolation mise sur leur intervalle (expliqué précédemment). Ce logiciel aurais alors différents différents usages personnel :

    - modélisation d' abaque
    - relation entre en événement ( ex : force / température ) et la tension d' un capteur analogique
    - modélisation d'une série de mesure expérimental
    - équation du déplacement de "sprites"
    - ....

    Pourquoi une fonction :
    - Pour sa simplicité à employer dans un algorithme
    - Pour obtenir quelque chose d'exploitable (ex: si je modélise la position d' un objet en fonction du temps, calculer la vitesse de cet objet sera un jeu d' enfant, une simple dérivé suffit)

    Bien sur, avec divers outils trouvable sur internet je pourrais obtenir la même fin, mais,je préfère utiliser des outils que je réalise moi même ( personnel & répondant à mon besoin ). De plus, je pourrais modéliser absolument toutes les fonction possible et inimaginable.

    J'espère avoir été asse clair sur mon objectif.
  • En C :
    h=(x>=0)?1:0;
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Je viens de me rendre compte d' une erreur de ma part. En effet, si ma fonction ( Heaviside ) est continue en 0, qu' elle valeur prendra t'elle ?

    Partons de l' idée que H(0)=0 : La fonction intervalle obtenue serais donc égale à 1 sur l' intervalle ]a;b[ (obtenue par produit). Or, la fonction finale rechercher serait constitue de somme de ces fonction, soit :
    H1 = { 1 sur ]a;b[ sinon 0 }
    et H2 = { 1 sur ]b;c[" sinon 0 }

    On pose f notre fonction finale et g1 et g2 deux fonction continue.

    Alors : f(x)=H1(x)*g1(x) + H2(x)*g2(x)

    or, f(b)=0*g1(b) + 0*g2(b) = 0 (Donc, il y a erreur)

    =========================================
    Partons donc de l' idée que H(0)=1

    alors
    H1 = { 1 sur [a;b] sinon 0 }
    et H2 = { 1 sur [b;c]" sinon 0 }

    Alors : f(x)=H1(x)*g1(x) + H2(x)*g2(x)

    or, f(b)=1*g1(b) + 1*g2(b) = g1(b)+g2(b) (Donc, il y a erreur) ( g1(b)=g2(b) car je désire une fonction f toujours continue )

    ==========================================

    Or, Si H(0)=1/2

    H1 = { 1 sur ]a;b[ ; 1/2 en a et b ; sinon 0 }
    H2 = { 1 sur ]b;c[ ; 1/2 en b et c ; sinon 0 }

    Alors : f(x)=H1(x)*g1(x) + H2(x)*g2(x)

    or, f(b)=0.5*g1(b) + 0.5*g2(b) = 0.5*g1(b)+0.5*g1(b) = g1(b) = g2(b) ( validé )

    ==========================================

    Autrement dit, je cherche l'équation algébrique ( h(x)=? ) de la fonction suivante :
    h(x)={ 0 en ]-inf;0[ ; 1/2 en 0 ; 1 en ]0;+inf[ ;}

    Vous m'avez tous conseillez de la crée avec une fonction externe en c, mais c' est une mauvaise option pour moi ( montré précédemment ). Mais, si l' obtention de cette fonction m' est impossible, je ferais avec ...
  • Pour commencer tu peux tout à fait définir la fonction sur un intervalle du type [a;b[ et cela résoudra ton problème.

    D'autre part je pense que les conditions que tu poses sont illusoires, par exemple celle de la dérivabilité. Cette dernière dépend (comme la continuité) de tes fonctions définies par morceaux (g1 et g2 dans ton exemple) et pas de la fonction caractéristique de l'intervalle (puisque c'est de ce dont il s'agit). Et quand bien même cette fonction caractéristique ne prend que des valeurs constantes sur un intervalle donné donc il n'y a pas de problème non plus...

    Pour résumer je ne pense pas que tu puisses t'intéresser à des fonctions définies par morceaux et supposer que la fonction globale obtenue va être nécessairement continue ou dérivable. Et si tu fais en sorte que ce soit le cas, alors il n'y aura pas de problème de toute façon.
  • Un intervalle du type [a;b[ est tous aussi complexe a réaliser, mais oui, il marche ( c'étais mon idée première, mais pour le réaliser, il me faudrai 2, et non 1 fonction : h1(0)=0 et h2(0)=1 : je remplace dans h1 x par -x+b et hop, je fait le produit de h1*h2 et j' obtient la fonction h positive sur [a;b[.

    Mais, après un peu de recherche, j'ai obtenue cela :

    h(x)=(|x|*x/(2(x²+(0+))))+0.5

    Or, comment obtenir 0+ ? (0+ = 0.00000....00001)

    J'ai donc continuer en posant 0+ = 0.0000001

    Et hop : y = (((|-x|*(-x)/(2((-x)*(-x)+0.0000001)))+0.5)*(-1.5*cos(x)))+(((|x-3|*(x-3)/(2((x-3)*(x-3)+0.0000001)))+0.5)*(-x+4.5))+((|x|*x/(2(x*x+0.0000001)))+0.5)*((|-x+3|*(-x+3)/(2((-x+3)*(-x+3)+0.0000001)))+0.5)*(x-1.5)

    Pour visionner

    (équation pas très belle, mais résultat plutôt satisfaisant)

    Pour tendre vers la fonction parfaite, il faudrait tendre 0.00000001 vers 0+. Possible ? ( sans devoir écrire une infinité de 0 )
  • En fait, je pense que tu te trompes sur la notion de ce qu'est une fonction.

    Il n'y a absolument aucune différence entre une fonction définie par un code du genre
    Define f(x)=Func
      If x>0 Then
        Return 1
      Else
        Return 0
      Endif
    EndFunc
    
    et une fonction définie par
    f(x):=3*x^2-7*x+2
    
    que ce soit en mathématiques ou en informatique.

    Une fonction est simplement un truc qui à un machin associe un bidule.
    Parfois, il arrive que l'on puisse trouver une relation calculatoire entre le machin et le bidule... et parfois on ne peut pas (en fait, mathématiquement, c'est même la quasi totalité des fonctions qui sont dans ce dernier cas !)

    Ton obstination à vouloir tout mettre sous la seconde forme ne sert absolument à rien !
    Tu peux faire EXACTEMENT la même chose avec les deux...
    Ou alors, j'aimerais que tu me montres un exemple où il est IMPOSSIBLE d'utiliser la 1ère forme qui semble te gêner.
  • Par exemple, si j' utilise la fonction valeur absolue, il n'y a aucune différence entre sa fonction mathématiques, et sa fonction définie par du code, or, cette fonction est "universelle" la fonction valeur absolue est connue de tous). Or, si je dois réaliser une fonction (maFonction) avec du code, alors ma fonction mathématiques f (f(x)=maFonction(x)*cos(x)) sera intraduisible pour toutes personne de connaissant pas la définition de maFonction.

    Après, on peut faire exactement la même chose avec les fonction "code" et "mathématique", mais, la fonction mathématique me parait plus simple à utiliser et à partager. De plus, comment traduire maFonction sans utiliser d'algorithme ?
  • Il suffit de donner la définition de maFonction(x). De toute façon tu es bien obligé de donner la définition de f(x). Ensuite, que dans la définition de f(x) tu fasses appel à une fonction élémentaire ou bien à une disjonction de cas, ça ne change rien au problème.
  • Merci de votre insistance et de vos réponses :

    Mon problème n' est en effet pas mathématique, mais simplement de méconnaissance d' outils mathématique. En effet, je n'ai que très très peu étudier les fonction définie par "disjonction de cas" (Je viens de finir ma terminale). D’où ma réticence a l'employer.

    Alors, partant de l' idée de l'usage de cette méthode, devais-je donc plutôt réaliser ma fonction finale sur le même principe? En effet, au lieu de faire intervalle * fonction + .. pourquoi ne pas faire f(x)=fonction n pour l' intervalle n & fonction o pour l' intervalle o .... ?
  • Bah justement, c'est mieux de faire ce que tu proposes en deuxième, informatiquement c'est (très légèrement) plus efficace. Car la fonction "intervalle" (qu'on appelle indicatrice en maths) est déjà implémenté avec une disjonction de cas en pratique.
Connectez-vous ou Inscrivez-vous pour répondre.