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 :

[scipy] Séries mathématiques - fonction comme argument d'une autre


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [scipy] Séries mathématiques - fonction comme argument d'une autre
    Bonjour,

    Je suis amené à calculer des séries mathématiques pour des applications
    scientifiques. (ce sont des sommes de termes qui dépendent d'un paramètre)

    l'algo serait le suivant :

    ------------------------------------------------

    somme = 0

    alpha =150
    beta=12
    ...


    pour n de 0 à 100
    somme = somme + f(n, alpha, beta, ...)
    fin pour

    Resultat = somme

    ------------------------------------------------


    avec f une fonction qui dépend d'un entier n (entier sur lequel on
    effectue la sommation) mais aussi d'autres paramètes qui eux sont fixés
    avant la somme (alpha, beta, ...) .


    je cherche à créer une fonction qui permet de réaliser directement la somme

    ex :

    Resultat = MaSuperSomme(f (n,alpha, beta, .... ), ParametreDeSomme = n, n=0, n=100)

    Je suis en galère :

    - pour passer la fonction f en paramètre de MaSuperSomme
    - pour déterminer sur lequel des arguments de f on effecue la somme.


    Merci pour vos idées !

    Seb

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    Salut,

    Voici une solution.
    c'est certainement pas la meilleure, mais ca te permettra peut être de te débloquer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    def toto(n,alpha,beta) :
        return n+alpha+beta
     
    def MaSuperSomme(f,args,parametre,debut,fin):
        somme = 0
        for i in range(debut,fin) :
            args[parametre]=i
            fct = f.__name__+"("
            for cle,valeur in args.items(): fct+=cle+"="+str(valeur)+","
            fct=fct[:-1] # pour virer la virgule
            fct += ")"
            exec "somme+="+fct
        return somme
     
     
    print MaSuperSomme(toto,{'n':0,'alpha':3,'beta':4},parametre='n',debut=0,fin=100)
    Si tu as des questions sur le code, je suis là

    See++

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour see++

    La solution que tu proposes est vraiment intéressante. Elle ouvre
    un certain nombre d'applicatons sur les manipulations génériques
    de fonctions.

    Merci pour l'effort d'avoir construit un exemple fonctionnel

    Le script est très clair

    Merci et à bientôt sur le forum !

    ++

    Seb

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    De rien, ca fait toujours plaisir de pouvoir aider quelqu'un

    A+ sur le forum

    See++

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On devrait pouvoir s'arranger sans passer par le exec.
    Si tu passes ta fonction en argument, tu peux directement l'appeler, sans pb. Le réel problème reste les arguments.
    Pour cela, tu peux faire qqch du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def MaSuperFonction(f, debut, fin, **parameters):
      somme = 0 #
      for i in range(debut, fin):
        somme += f(parameters)
      return somme
    l'intérêt du **parameters est que c'est un dictionnaire contenant toutes les paramètres passés à la fonction qui ne font pas partie des attributs définis explicitements. Ensuite, il te reste à faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print MaSuperFonction(f = maFonction, debut = 0, fin = 10, alpha = 30, beta = 45, gamma = 56, ...)

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    On peut aussi se servir des fonctions sum et map:
    (y'a peut-être moyen d'être plus générique)

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    alpha =150
    beta=12
     
    def somme(f, debut, fin, a, b):
        return sum(map(f, range(debut, fin+1), (fin-debut+1) * [a], (fin-debut+1) * [b]))
     
    def f(n, a, b): return n*a+b
     
    print somme(f, 0, 10, a = alpha, b = beta)
    Edit: finalement avec les listes compréhensions, ce sera plus générique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    alpha =150
    beta=12
     
    def somme(f, debut, fin, **param):
        return sum([f(i, **param) for i in range(debut, fin+1)])
     
    def f(n, a, b): return n*a+b
     
    print somme(f, 0, 10, a = alpha, b = beta)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour, (j'ai changé de paramètres de connexion... anciennement sebsainte)
    Je me suis finalement rapproché de fonctions présentes dans la librairie scipy,
    qui procède globalement comme les deux dernières réponses (notamment pour les fonctions d'intégration)

    le code est très proche de ces deux dernières

    Ca marche très bien !

    Merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passer une Fonction comme argument d'une fonction
    Par ch16089 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/02/2011, 17h58
  2. Résultat d'une fonction en argument d'une autre fonction.
    Par xess91 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/04/2009, 15h15
  3. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  4. Fonction en argument d'une autre fonction
    Par bonjour69 dans le forum Fortran
    Réponses: 2
    Dernier message: 12/03/2008, 16h17
  5. entrer une fonction en argument d'une autre fonction
    Par arno78 dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 07/09/2006, 14h29

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