Bonsoir,
Je dois calculer la matrice jacobienne d'une fonction avec le C++, mais je ne sais pas comment peut on calculer les dérivés partielles premières de la fonction, qui sont les membres de la matrice jacobienne,
J'attends votre aide...
Bonsoir,
Je dois calculer la matrice jacobienne d'une fonction avec le C++, mais je ne sais pas comment peut on calculer les dérivés partielles premières de la fonction, qui sont les membres de la matrice jacobienne,
J'attends votre aide...
Ce n'est pas une question liée au langage.
Il te faut une bibliothèque qui implémente les algorithmes d'algèbre linéaire.
La plus populaire est LAPACK.
<Note de modération> C'est moi (Flob90) qui est déplacé le message (il était dans une discussion sans rapport), je l'ai mis dans langage dans le sens "comment faire ceci en C++ (quel syntaxe) ?" sans m'occuper de l'existence ou non de bibliothèque d'algèbre linéaire, l'OP est libre de m'indiquer de redéplacer le sujet mais il ne l'a pas encore fait (si tu le sens le besoin de répondre sur ce point fait le en mp si possible )</Note de modération>
Boost ftw
En général on (dans mon cas en fait) cherche à calculer une telle matrice pour l'utiliser dans un solveur. On cherche donc cette matrice en un point particulier.
Il y a alors plusieurs solutions :
1- programmer les dérivées formellement, ce qui peut être long en temps de calcul, et en temps de développement.
2- on peut faire un framework en surchargeant les opérateurs et fonctions mathématiques pour calculer les valeurs des dérivées en même temps que les valeurs des dérivées, c'est long et fastidieux et pose des problème de temps de calcul à cause des opérateurs binaires.
3- faire des dérivées numériques f'(x) = (f(x+dx)-f(x-dx))/(2*dx) ce qui peu poser des soucis aux bornes du domaine de définition de la fonction...
Je sais que beaucoup pensent que le 3 est très long en termes de calcul (deux évaluations de f(x) par dérivées....) mais (uv)' = uv'+u'v ce qui veut dire que l'évaluation de la dérivée formelle de uv prendra sans doute autant de temps que deux évaluations de uv.... voir plus si u et v sont compliquées...
Salut à tous !
Cette approche a deux avantages : elle est facile à mettre en œuvre et elle est efficace. La difficulté est de choisir une bonne valeur pour dx : trop importante et l´approximation est grossière, trop faible elle se perd dans le bruit numérique. En première approche tu peux prendre dx = x / 1000 (ce n´est qu´un point de départ).
Sinon, il est possible de mettre en place un système de différentiation automatique en gros en associant à chaque variable sa dérivée, mais cela demande une bonne compétence de base de C++ et les temps d´exécution peuvent parfois être assez importants. Cet ouvrage en parle :
Computational differentiation
A. GRIEWANK
Springer
Pour savoir ce qui est le plus approprié pour toi, dans quel contexte dois-tu réaliser le calcul de ta matrice Jacobienne ? Quel est ton niveau en C++ ?
À bientôt.
Le Farfadet Spatial
Salut à tous !
Tout à fait. Je ne l’ai pas bien fait apparaître, mais je voulais juste la préciser un peu, car c’est une méthode assez générique, souvent très appropriée.
C’est surtout un problème pour l’implémentation (un bon moyen de devenir dingue avec les surcharges) et dans la définition des fonctions. Également, si l’on désire des dérivés à l’ordre n, pour une variable, il n’y a non plus une valeur, mais n + 1, l’occupation mémoire peut devenir importante.
Bref, à toi Gandalf je n’apprends rien, mais j’espère que cela donne des éléments utiles à Solarium.
À bientôt.
Le Farfadet Spatial
Ceci pourrait intéresser les gens qui veulent en savoir plus sur la différentiation automatique : http://homepage.mac.com/sigfpe/paper.pdf
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager