IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Modifier une fonction sympy avec if/else


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut Modifier une fonction sympy avec if/else
    Boujour.
    J'ai une fonction g = x^3
    J'aimerais créer une autre fonction h qui se comporte comme la premiere quand celle ci est supérieure à 0. Quand la fonction g n'est pas superieure à zéro j'aimerais que h se comporte comme -(1/g)-1

    Je ne sais pas trop comment m'y prendre.

    Merci à vous.

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Sur l'aspect purement mathématique, ça n'a pas vraiment de sens car ont sait que g(x)>0 pour tout x>0 ; il suffirait donc de faire une condition sur x, et non sur g(x)...

    Sur l'aspect code, ça donnerait quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def g(x) : return x**3
    def h(x) : return g(x) if g(x)>0 else -(1/g(x))-1
    Notez également qu'il y aura une erreur pour x=0...

  3. #3
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Ok.
    Comment je peux plot la fonction apres? J'ai pas l'habitude d'utiliser def
    .

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    La notation "def" permet de créer une fonction que vous pouvez appeler (par le nom que vous lui donnez). Dans mon exemple, ça donnerait quelque chose comme ça :
    Pour "plotter" la fonction vous pouvez utiliser la librairie matplotlib. Exemple (sans Numpy) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import matplotlib.pyplot as plt
     
    x = [i/10 for i in range(-100,100)] # Create x array (from -10 to 10)
    y = [h(xi) if xi else 0 for xi in x] # Create y array, avoid ZeroDivisionError on function h
     
    plt.plot(x,y)
    plt.show()
    Notez que j'ai du rajouter une sécurité dans la règle de création du vecteur y ; il aurait été préférable de l'inclure dans la fonction h

  5. #5
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Le probleme c'est que je ne peux utiliser que sympy.

    Si j'éssaye de plot une fonction faite avec def sur sympy comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from sympy import *
    from sympy.abc import x
     
    def g():
        x**3
     
    plot(g())
    ça me donne cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: 'NoneType' object is not iterable

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Singezare Voir le message
    Le probleme c'est que je ne peux utiliser que sympy.
    ok, mais si vous ne connaissez pas trop sympy il faut déjà ouvrir un tuto., faire des recherches sur Internet pour voir comment on définit une fonction continue par morceaux avec Piecewise (par exemple).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé. Merci à toi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from sympy import *
     
    x = Symbol('x')
     
    g = x**3
     
    h = Piecewise((g, x>0), (1/g, True)) 
     
    plot(h, ylim=(-10, 10))

  8. #8
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Ah non, je suis allé un peu vite. J'ai cru que ça marchait mais en fait ça marche pas. C'est en fontion de x et pas de l'image.

  9. #9
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    ok, mais si vous ne connaissez pas trop sympy il faut déjà ouvrir un tuto., faire des recherches sur Internet pour voir comment on définit une fonction continue par morceaux avec Piecewise (par exemple).

    - W
    Je veut bien regarder des tuto mais je sais pas quoi taper. piecewise ça correspond pas a ce que je recherche.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Singezare Voir le message
    Je veut bien regarder des tuto mais je sais pas quoi taper.
    La seule chose que je peux dire est que "g = x**3" n'étant pas une fonction Sympy, ceci explique peut être cela... mais, c'est vous qui programmez! Vous devez savoir ce que vous voulez obtenir et avoir une idée sur comment le réaliser avec Sympy.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    La seule chose que je peux dire est que "g = x**3" n'étant pas une fonction Sympy, ceci explique peut être cela... mais, c'est vous qui programmez! Vous devez savoir ce que vous voulez obtenir et avoir une idée sur comment le réaliser avec Sympy.

    - W
    Je suis pas programeur. Si je savais comment obtenir ce que je veux avec sympy je serais pas la à poser des questions sur ce forum.
    Merci captain obvious.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Singezare Voir le message
    Je suis pas programeur.
    A partir du moment où vous écrivez du code, vous "programmez".

    Après débutant, amateur, professionnel,... ne change pas grand chose:
    on apprend à se servir des outils qu'on veut utiliser, et quand çà ne marche pas on cherche ce qu'on n'a pas compris, voire on reconsidère la solution qu'on essaie de mettre en place.

    Par exemple, si on dit "Quand la fonction g n'est pas superieure à zéro j'aimerais que h se comporte comme -(1/g)-1"

    D'un point de vue mathématique, une fonction (continue par morceaux) commence par un domaine de définition (les x auxquels on peut appliquer la fonction).

    Si g est quelconque, il va falloir trouver les intervalles du domaine de définition tels que g(x) < 0. Sans çà, la fonction n'est pas définie (puisque je ne sais pas quoi appliquer aux différents x de l'ensemble de départ).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Je sais pas ce que c'est qu'une fonction continue par morceau.

    Je vois pas l'interet de définir son domaine de définion ou de chercher quand elle est superieure à zéro manuellement. Le but c'est d'utiliser la programation pour que le logiciel detecte automatiquement quand l'image de la fonction est superieure à zéro et d'automatiser le processus que je cherche appliquer. Sinon je reste sur papier et j'ai pas besoin d'un ordinateur.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Singezare Voir le message
    Le but c'est d'utiliser la programation pour que le logiciel detecte automatiquement quand l'image de la fonction est superieure à zéro et d'automatiser le processus que je cherche appliquer.
    En programmation, rien n'est automatique! Et le préalable à l'automatisation est la mise en forme du problème pour qu'on puisse lui appliquer un algorithme qu'on pourra traduire dans un langage de programmation.

    Rien n'empêche de calculer en 2 étapes g(x) pour x variant de -B à B avec un pas donné puis recalculer h(x) pour les x tels que g(x) < 0.

    Ça se programme assez facilement: des boucles, des listes, des conditions,...

    Citation Envoyé par Singezare Voir le message
    Je vois pas l'interet de définir son domaine de définion ou de chercher quand elle est superieure à zéro manuellement.
    Avec sympy, on devrait pouvoir trouver (avec le solver) les intervalles du domaine de départ ou x est négatif puis appliquer ce qu'on veut aux différents intervalles.

    Dans tous les cas, on commence par décomposer le problème en bouts qu'on saura faire faire par la machine ou la bibliothèque.

    En tout cas, ce code là fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from sympy import symbols, Piecewise
    from sympy.plotting import plot
     
    x = symbols('x')
    g = x**3
    p = Piecewise((x**2, g < 0), (g, True))
     
    plot(p)
    et je n'ai remplacé 1/g par x**2 histoire de ne pas avoir l'asymptote en 0.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Quand je met 1/g avec ton code j'obtiens ça:

    Nom : hfhyhy.JPG
Affichages : 175
Taille : 33,0 Ko

    En fait c'est important que puisse remetre g dans cette fonction.
    Apres mon objectif c'est que je puisse reproduire le meme processus avec d'autres fonctions compliquées à la place de g.

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Singezare Voir le message
    En fait c'est important que puisse remetre g dans cette fonction.
    On peut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                  p = Piecewise((-g, g < 0), (g, True))
    et "remis g" dans la fonction tout en ayant un plot pas trop moche.

    Avec 1/g, çà fonctionne mais côté "plot" les valeurs par défaut gèrent mal l'asymptote en 0 (g tend vers -oo)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Candidat au Club
    Homme Profil pro
    Branleur
    Inscrit en
    Août 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Branleur

    Informations forums :
    Inscription : Août 2021
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    J'ai éssayé avec ça et ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from sympy import *
    x = Symbol('x')
     
    g = x**3
     
    h = Piecewise((g, g>0), (1/g, True))
     
    plot(h, ylim=(-10, 10))
    Merci à vous.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/05/2006, 09h48
  2. [PHP-JS] une fonction php avec parametres javascript
    Par kagura dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2006, 18h10
  3. Apelle d une fonction js avec la valeur d'une listbox
    Par echecetmat dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/02/2005, 16h53
  4. Creation d'une fonction temporaire avec droit datareader
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/10/2004, 14h26
  5. Modifier une partion ntfs avec Disk druid
    Par Sébastien dans le forum Administration système
    Réponses: 5
    Dernier message: 24/09/2003, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo