puis-je faire confiance à cette triple intégrale numérique de Matlab?

15

Gens des sciences informatiques:

J'ai initialement posté cette question sur Math Stack Exchange et quelqu'un a commenté que je pourrais obtenir des réponses "bien meilleures" ici:

Je suis novice en méthodes numériques et en Matlab. J'essaie d'évaluer la somme suivante de deux triples intégrales (elle peut évidemment être écrite plus simplement, mais vous ne pouvez toujours pas l'évaluer symboliquement (?)). J'ai du mal à faire fonctionner le ici, donc je l'ai divisé à contrecœur en morceaux ici: je veux trouver la somme deLATEX

2((1/0.3)1)2(11/0.31r10r1r0F1(r0,r1,t)exp((0.3)2t24)dtdr0dr1),

et

2((1/0.3)1)2(11/0.31r1r1r0r1+r0F2(r0,r1,t)exp((0.3)2t24)dtdr0dr1),

F1(r0,r1,t)=t2r03(0.3)32r13π

et

F2(r0,r1,t)=(0.3)3π3/2(r0+r1t)4(t2+2t(r0+r1)-3(r1-r0)2)2288(43πr03)(43πr13).

EDIT (2 mars 2013): Quelqu'un a répondu qu'il avait demandé à Mathematica de faire symboliquement les intégrales. J'ai juste essayé de le faire (avec des versions simplifiées des intégrales) et Mathematica ne pouvait que faire les deux externes du premier, et a calé sur le second. J'apprécierais de l'aide. Voici ce que j'ai fait.:

J'ai essayé d'évaluer

121r20r2-r1r13t2exp(-t2)r23tr1r2
via

Intégrer [r1 ^ 3 / r2 ^ 3 * t ^ 2 * Exp (-t ^ 2), {t, 0, r2 - r1}, {r1, 1, r2}, {r2, 1, 2}]

et Mathematica revient (j'ai eu des problèmes avec le ici parce que le résultat est long. Je l'ai divisé en deux équations. Si quelqu'un connaît un bon moyen d'afficher cela, dites-le moi):LUNETEX

12164r22e-1-r22(2e2r2(25+r2(19+2r2(1+r2)))-

e1+r22(32r2(2+r22))+π(11+4r22(9+r22))Erf[1-r2])r2.

Ensuite, j'ai essayé d'évaluer

121r2r2-r1r2+r1

exp(-t2)(r1+r2-t)4(t2+2t(r1+r2)-3(r2-r1)2)2r13r23trr2

en utilisant

Intégrer [(r1 + r2 - t) ^ 4 * (t ^ 2 + 2 * t * (r1 + r2) - 3 * (r2 - r1) ^ 2) ^ 2 * Exp [-t ^ 2] / r1 ^ 3 / r2 ^ 3, {r2, 1, 2}, {r1, 1, r2}, {t, r2-r1, r2 + r1}]

juste maintenant, et Mathematica n'a pas retourné de réponse après environ une demi-heure (mais j'ai des problèmes de réseau informatique en ce moment, et ils peuvent être à blâmer).

[FIN DE LA MODIFICATION DU 2 MARS]

J'ai utilisé la commande "triplequad" de Matlab, sans options supplémentaires. J'ai géré les limites variables de l'intégration au moyen de fonctions heaviside, car je ne connaissais pas d'autre moyen de le faire. Matlab m'a donné . 0,007164820144202

Je sais que Matlab est un bon logiciel, mais j'ai entendu dire que les intégrales triples numériques sont difficiles à faire avec précision et que les mathématiciens sont censés être sceptiques, donc je veux un moyen de vérifier l'exactitude de cette réponse. Les intégrales donnent la valeur attendue d'une certaine expérience (si quelqu'un le souhaite, je peux éditer cette question pour décrire l'expérience): J'ai implémenté l'expérience dans Matlab en utilisant des nombres générés de manière appropriée et aléatoire, un million de fois, et en moyenne les résultats. J'ai répété ce processus quatre fois. Voici les résultats (je m'excuse si j'ai mal utilisé le mot «procès»):

Essai 1:0,007133292603256

Essai 2:0,007120455071989

Essai 3:0,007062595022049

Essai 4:0,007154940168452

Essai 5:0,007215000289130

Bien que chaque essai ait utilisé un million d'échantillons, les valeurs de simulation ne concordent que dans le premier chiffre significatif. Ils ne sont pas assez proches les uns des autres pour que je puisse déterminer si la triple intégrale numérique est exacte.

Alors, quelqu'un peut-il me dire si je peux faire confiance au résultat de "triplequad" ici, et dans quelles circonstances peut-on lui faire confiance en général?

Une suggestion que j'ai eue à Math Stack Exchange était d'essayer d'autres logiciels comme Mathematica, Octave, Maple et SciPy. Est-ce un bon conseil? Est-ce que les gens font du travail numérique dans Mathematica et Maple? Octave est une sorte de clone Matlab, alors puis-je supposer qu'il utilise les mêmes algorithmes d'intégration? Je n'ai même jamais entendu parler de SciPy auparavant et j'aimerais avoir des opinions à ce sujet.


MISE À JOUR: Quelqu'un de Math Stack Exchange l'a fait dans Maple et a obtenu . Cela correspond à trois chiffres importants. C'est un bon signe.0,007163085468

En outre, j'apprécierais des suggestions sur la façon d'entrer une expression longue et multiligne dans dans Stack Exchange. Pouvez-vous utiliser l'environnement "aligné" ici? J'ai essayé et je n'ai pas réussi à le faire fonctionner.LUNETEX

Stefan Smith
la source
2
Vos résultats de simulation sont parfaitement cohérents avec la valeur numérique renvoyée par Matlab: leur moyenne de n'est que de erreur standard inférieure à ce que Matlab a renvoyé. FWIW, Mathematica renvoie . Il peut également évaluer symboliquement ces intégrales en termes de polynômes et de fonctions d'erreur. 0,00713726-1.110,00716308537
whuber
@whuber Merci. Je pourrais jurer que je l'ai essayé symboliquement dans Maple et que Maple n'a pas pu le faire. Je vais réessayer dans Maple, et si ça ne marche pas, je vais essayer dans Mathematica. BTW, j'ai fait une intégrale similaire dans Maple, et j'ai obtenu une énorme réponse symbolique. Cela semblait être une somme et une différence de très grands nombres dont le grand total était assez petit. Je soupçonne qu'une erreur d'arrondi était probable dans la réponse finale. Dans un problème comme celui-ci, devez-vous utiliser la réponse symbolique, ou simplement faire l'intégrale numériquement?
Stefan Smith
Les réponses symboliques ont l'avantage d'être des combinaisons de fonctions qui (souvent) peuvent être calculées efficacement avec une précision arbitraire. Habituellement aussi, la solution symbolique se prête également à un recalcul rapide lorsque les paramètres varient. Pour ces raisons, il vaut souvent la peine de rechercher une solution symbolique.
whuber
@whuber: J'ai essayé de faire des intégrales essentiellement équivalentes (en modifiant certaines des constantes et en supprimant certaines constantes multiplicatives) dans Mathematica, et Mathematica ne pouvait faire que les deux intégrations externes de la première intégrale, et semble avoir calé sur la seconde. J'ai posté mon code et mes résultats ci-dessus.
Stefan Smith
1
Concernant l'édition du 2 mars: En réduisant symboliquement l'intégrale triple à une seule intégrale (dans la première moitié de vos intégrales), vous avez accompli beaucoup de choses. L'intégrande se comporte très bien et peut être intégrée numériquement avec une précision extrêmement élevée en une fraction de seconde.
whuber

Réponses:

9

Tout d'abord, ce n'est pas le logiciel (ou du moins il ne devrait pas l'être) qui détermine la qualité de la solution à un problème, c'est la qualité et la pertinence de l'algorithme qui est appliqué. Vous devriez vérifier quel algorithme est utilisé par triplequad dans Matlab (je suppose qu'il utilise une quadrature gaussienne adaptative imbriquée). Et vous devez vérifier quelles sont les tolérances demandées (tolérance absolue et relative requise). Il y a de fortes chances que, par défaut, il ne demande qu'une précision relative de . dix-8

La réponse provenant de Maple est probablement faite par Computer Algebra et peut-être pourrait-elle trouver une solution fermée qui a ensuite été évaluée à l'aide de virgule flottante double précision. Cela présente l'avantage de ne pas approximer l'intégrale par une sommation finie (et donc d'introduire des erreurs d'approximation), mais le système d'algèbre informatique trouvera une expression pour l'intégrale qui peut ensuite être évaluée. Bien sûr, il faut être prudent lors de l'évaluation de cette expression (pour l'arrondi).

Si vous souhaitez le faire avec SciPy, vous devrez également recourir à la quadrature gaussienne adaptative imbriquée à l'aide des routines Quadpack sous-jacentes (Piessens et al.). Dans Octave, vous aurez la même approche. Et je ne serais pas trop surpris si Matlab utilise également Quadpack comme moteur en quadrature (car c'est la référence).

GertVdE
la source
@GretVdE: Merci pour l'info. J'ai d'abord essayé d'évaluer symboliquement l'intégrale, et Maple n'a pas pu le faire (donc c'était probablement impossible, en utilisant des fonctions standard), j'ai donc demandé à Maple de le faire numériquement. Je ne sais pas quel algorithme il a utilisé.
Stefan Smith
@StefanSmith: vous pouvez découvrir en réglant le infolevel à Maple: infolevel[`evalf/int`] := 4. Êtes-vous sûr que Mape ne trouve pas de solution fermée? L'intégrale ne semble pas trop compliquée. Pourriez-vous rendre votre feuille d'érable publique quelque part?
GertVdE
@StefanSmith: Je posterais le code Maple dans la question ci-dessus.
GertVdE
Je ne peux pas faire travailler Maple sur mon système pour le moment, mais j'ai essayé d'intégrales équivalentes dans Mathematica, et Mathematica n'a fait que les deux internes de la première triple intégrale, et a calé sur la deuxième triple intégrale. Veuillez consulter la question modifiée.
Stefan Smith