L'intégration multidimensionnelle intégrale dans scipy
Motivation: j'ai un multidimensionnelle intégrale, qui pour être complet, j'ai reproduit ci-dessous. Il s'agit du calcul du second coefficient de viriel quand il y a une importante anisotropie:
Ici W est une fonction de toutes les variables. C'est une fonction connue, qui, je peux définir une fonction python.
Programmation Question: Comment puis-je obtenir scipy
à intégrer cette expression? Je pensais d'enchaînement de deux triples quadruples ( scipy.s'intégrer.tplquad
), mais je suis inquiet au sujet de la performance et de la précision. Est-il la plus grande dimension de l'intégration sur scipy
, que l'on peut gérer un nombre arbitraire de imbriqués les intégrales? Si non, quelle est la meilleure façon de le faire?
Sympy
.OriginalL'auteur Hooked | 2012-12-28
Vous devez vous connecter pour publier un commentaire.
Avec une plus-dimensionnelle partie intégrante de ce genre, les méthodes de monte carlo sont souvent une technique utile - ils convergent sur la réponse à l'inverse de la racine carrée du nombre de fonction des évaluations, ce qui est mieux pour dimension supérieure, alors vous aurez généralement obtenir de même assez sophistiqué méthodes adaptatives (sauf si vous savez quelque chose de très spécifique au sujet de votre intégrande - symétries qui peuvent être exploités, etc.)
La mcint package effectue de monte-carlo, de l'intégration: en cours d'exécution avec un non-trivial
W
qui est néanmoins intégrable si nous connaissons la réponse, nous obtenons (notez que j'ai tronqué r à partir de [0,1); vous aurez à faire une sorte de journal de transformation ou de quelque chose pour obtenir la demi-illimitée de domaine en quelque chose de souple, pour la plupart des intégrateurs numériques):De course donne
Vous pourriez grandement de la vitesse par la vectorisation de la génération de nombres aléatoires, etc.
Bien sûr, vous pouvez la chaîne de la triple intégrales comme vous le suggérez:
qui est lent, mais donne de très bons résultats pour ce cas simple. Ce qui est mieux est d'aller pour en venir à la complexité de votre
W
est et ce que vos exigences de précision sont. Simple (rapide à évaluer) W avec une grande précision va vous pousser à ce genre de méthode; compliqué (de lent à évaluer) W modérées avec des exigences de précision va vous pousser vers MC techniques.mcint
et voir si cela fonctionne mieux que mon ad-hoc MC méthode que j'ai maintenant.+1 Bon d'apprendre de nouvelles choses 🙂
OriginalL'auteur Jonathan Dursi
Je vais juste faire quelques commentaires d'ordre général sur comment bien faire ce genre d'intégrale, mais ce conseil n'est pas spécifique à scipy (trop long pour un commentaire, même s'il n'est pas une réponse).
Je ne sais pas votre cas d'utilisation, c'est à dire si vous êtes satisfait avec une "bonne" réponse avec quelques chiffres de précision qui pourrait être obtenu de manière simple à l'aide de Monte-Carlo comme indiqué dans Jonathan Dursi de réponse, ou si vous voulez vraiment pousser la précision numérique autant que possible.
Que j'ai effectué d'analyse de Monte-Carlo et en quadrature calculs de coefficients du viriel moi-même. Si vous voulez faire les intégrales avec précision, alors il ya quelques choses que vous devriez faire:
Tenter de faire le plus grand nombre des intégrales exactement que possible; il se peut bien que l'intégration de certains de vos coordonnées est assez simple.
Envisager de transformer vos variables de l'intégration, de sorte que la fonction à intégrer est aussi lisse que possible. (Cela aide pour les deux Monte-Carlo et en quadrature).
De Monte-Carlo, l'utilisation de l'importance de l'échantillonnage pour une meilleure convergence.
Pour la quadrature, avec 7 intégrales c'est peut-être possible d'obtenir vraiment une convergence rapide à l'aide de tanh-sinh quadrature. Si vous pouvez l'obtenir jusqu'à 5 intégrales, alors vous devriez être en mesure d'obtenir jusqu'à 10 chiffres de précision pour votre intégrale. Je recommande fortement mathtool /ARPREC à cet effet, disponible a partir de David Bailey page d'accueil: http://www.davidhbailey.com/
OriginalL'auteur Nathan
D'abord à vous dire que je ne suis pas bon en math, donc s'il vous plaît être gentil. De toute façon, voici mon essai:
Notez que dans votre question, il y a 6 variables, mais 7 intégrales!?
Dans
Python
à l'aide deSympy
:et voici le résultat: [LateX]
Vous pouvez jouer un peu plus pour votre question 😉
OriginalL'auteur Developer
Jonathan Dursi a fait une très bonne réponse. Je vais juste ajouter à sa réponse.
Maintenant
scipy.integrate
a une fonction nomméenquad
que l'on peut effectuer un multi-dimensionnelle partie intégrante sans tracas. Voir ce lien pour plus d'informations. Ci-dessous, nous calculons l'intégrale à l'aide denquad
avec Jonathan exemple:Le résultat est plus précis que le enchaînés
tplquad
:OriginalL'auteur Dongchen Zou