Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Calcul scientifique
Calcul scientifique Forum d'entraide sur la programmation scientifique et bibliothèques associées (PIL, NumPy, SciPy, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/10/2012, 15h46   #1
mailaka
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 57
Points : 39
Points : 39
Par défaut Mélanger OO et calcul scientifique avec numpy ?

Bonjour,

Comment faire pour bien mélanger OO et calcul scientifique avec Python et numpy ? Et déjà est-ce une bonne idée en général ?

Le use case est le suivant : supposons qu'un modèle physique est développé sous forme objet, à tout hasard la trajectoire d'un projectile. Donc, ce qui m'intéresse en général est de dessiner cette trajectoire étant donné un angle alpha de lancement et la donnée d'une vitesse initiale, exemple

Code :
1
2
3
4
 
alpha = math.pi/6
v0 = 1
path = Stone(alpha, v0).trajectory() # vecteur de coordonnées x,y
Maintenant, pour mieux comprendre le comportement de ce projectile, supposons que nous voulions faire une étude de la distance maximale parcourue en fonction de alpha, et v0.

Code :
1
2
3
4
 
alpha = linspace(0, pi/2, 7)
v0 = lin(0, 10, 0.1)
dmax= Stone(alpha, v0).maxRange() # ou quelle est la meilleure approche ??
Quelle est la meilleure manière de procéder ici ou doit-on se résoudre à abandonner l'orienté objet si on veut pouvoir faire des analyses sur tous les paramètres d'un modèle et toujours bénéficier de la performance de numpy ?
mailaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 16h46   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,
Citation:
doit-on se résoudre à abandonner l'orienté objet si on veut pouvoir faire des analyses sur tous les paramètres d'un modèle et toujours bénéficier de la performance de numpy ?
L'intérêt d'un objet (ou d'une closure en général) est d'avoir un comportement variable en fonction d'un état interne.

Comme, le calcul de trajectoire parabolique se fait via des fonctions simples: pas besoin d'état, juste de valeurs d'entrées pour produire des valeurs en sortie.

L'intérêt de la programmation objet, se limitera, dans ce cas, à l'organisation du code (regrouper/factoriser des fonctions), mais on devrait pouvoir s'en passer.

Pourquoi pensiez-vous l'OOP indispensable pour ce genre de programme?

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 18h13   #3
mailaka
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 57
Points : 39
Points : 39
Bonjour et merci de prendre le temps de te pencher sur ce problème existentiel.

L'exemple est simple pour ne pas nous noyer dans les détails particuliers d'un modèle.

En fait, je comprends bien que l'idée d'un objet est d'encapsuler un état interne en un tout cohérent. Justement, ici, mon idée est d'encapsuler tous les paramètres d'un modèle dans un seul objet puisqu' a priori les objets servent à cela.

Mon problème est que parfois, on peut vouloir une étude de sensibilité à la variation de certains paramètres et une possibilité par exemple est de voir une surface indexée par les paramètres pris 2 à 2.

Donc est-ce qu'à chaque fois, je dois re-écrire une fonction toute bête pour chaque paire de paramètres dont je veux étudier l'influence (typiquement, je veux passer deux numpy arrays à la fonction et plotter la surface par exemple) ? Ou y-a-t-il manière de réutiliser efficacement l'objet que je me suis échiné à construire ?
mailaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 19h30   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,

Il y a certainement possibilité de réutiliser mais sans plus d'infos sur votre code, difficile d'aller dans le quoi, comment.

Python est un langage intéressant pour débroussailler des sujets inconnus.

Au départ, on ne connaît pas encore suffisamment le domaine pour qu'objets et classes soient assez "stables": quelques abstractions s'imposent mais dès qu'on entre dans les détails, pas mal de questions restent.

Python est assez souple pour qu'on puisse avancer et balayer le sujet sans avoir à tout remettre d'équerre. L'important, c'est d'avoir à la fin un truc qui réalise les différents cas d'utilisation significatifs. Ca marchotte mais n'est pas montrable car çà tient avec des bouts de ficelle.

A partir de là, on peut essayer de sortir objets/modules/classes et réorganiser le code. Avant, cela risque d'être une perte de temps.

- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 23h18   #5
Matthieu Brucher
Rédacteur/Modérateur
 
Avatar de Matthieu Brucher
 
Matthieu Brucher
Développeur HPC
Inscription : juillet 2005
Messages : 9 697
Détails du profil
Informations personnelles :
Nom : Matthieu Brucher
Âge : 31
Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

Informations forums :
Inscription : juillet 2005
Messages : 9 697
Points : 18 133
Points : 18 133
Tu peux faire des objets, mais tu t'y prends sans doute de la mauvaise manière. D'ailleurs que ce soit Python ou autre, le problème est le même. Faire de l'OO sur du code scientifique sans réfléchir est une catastrophe au niveau perf.
Dans ce cas, on commence par analyser les endroits où la vectorisation ou la parallélisation peuvent intervenir et on crée des objets qui seront capables d'encapsuler ces endroits. Les objets seront différents, mais bien plus efficaces et tout aussi clairs que des objets "classiques".
Matthieu Brucher est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/10/2012, 10h23   #6
mailaka
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 57
Points : 39
Points : 39
Disons que les paramètres d'un modèle se prêtent bien conceptuellement à une encapsulation au niveau objet.

Ainsi par exemple, voir le code de ce tuto qui utilise poly1d pour plotter diverses polynômes de degré 2 avec les coefficients c0 c1 c2.

Supposons que je veuille voir le lieu où toutes les tangentes soient nulles en fonction de c1, c2, comment faire en gardant l'utilisation des objets poly1d ?

Bien sûr, je pourrais toujours écrire en procédural une fonction qui prendrait deux vecteurs cc1 et cc2 et qui donnerait le résultat et qu'il suffirait de plotter la surface résultante après mais ce serait pratiquement réinventer la roue à chaque fois.
mailaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2012, 13h14   #7
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 697
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 697
Points : 4 526
Points : 4 526
Salut,

Citation:
Envoyé par mailaka Voir le message
Supposons que je veuille voir le lieu où toutes les tangentes soient nulles en fonction de c1, c2, comment faire en gardant l'utilisation des objets poly1d ?
Dans ce cas, le framework ETS réduit les options de construction: il faut d'abord apprendre à l'utiliser pour arriver à vos fins! [LIST][*]trouver comment ajouter cette information au graphique existant, i.e. voir la documentation et les exemples de chaco.[*]récupérer les informations dans PlotterApplication pour le calcul et éventuellement le modifier côté affichage[/LIST
En gros, vous allez avoir à trouver la dizaine de ligne de codes qui va bien pour ajouter cette fonctionnalité à un existant qui est un singleton de 30 lignes.
Peu importe comment vous aller les coder, le plus long sera de trouver le contenu de ces lignes. Réorganiser ces 40 lignes de code plus tard ne devrait pas poser de problèmes.
- W
__________________
Architectures Post-Modernes
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2012, 23h33   #8
mailaka
Nouveau Membre du Club
 
Inscription : octobre 2005
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 57
Points : 39
Points : 39
Je crois que tu es en train de parler de comment rendre interactive l'exploration de ces lieux.

Ma question est plutôt comment
  1. soit dessiner directement la surface correspondant à la sensibilité à deux paramètres ;
  2. soit faire en sorte que l'exploration interactive de la sensibilité aux divers paramètres reste performante (ie toute la surface correspondant à deux paramètres du modèle bougerait en fonction d'autres bougés à la main).

Par exemple pour le point 2, du style pouvoir initialiser direct avec les vecteurs voulus les paramètres de coefficients sur une classe héritée de poly1d. Enfin, est-ce possible et souhaitable ?
mailaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h13.


 
 
 
 
Partenaires

Hébergement Web