posso confiar nesta integral tripla numérica da Matlab?

15

Pessoas da Ciência da Computação:

Originalmente, eu postei essa pergunta no Math Stack Exchange e alguém comentou que eu poderia obter respostas "muito melhores" aqui:

Eu sou um novato em métodos numéricos e Matlab. Estou tentando avaliar a seguinte soma de duas integrais triplas (obviamente pode ser escrita de maneira mais simples, mas você ainda não pode avaliar simbolicamente (?)). Estou tendo problemas para obter o para trabalhar aqui, então eu relutantemente o dividi em pedaços aqui: quero encontrar a soma deLATEX

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

e

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

Onde

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

e

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

EDIT (2 de março de 2013): Alguém respondeu que o Mathematica fazia as integrais simbolicamente. Eu apenas tentei fazer isso (com versões simplificadas das integrais) e o Mathematica só conseguiu fazer as duas externas da primeira e parou na segunda. Gostaria muito de receber alguma ajuda. Aqui está o que eu fiz .:

Eu tentei avaliar

via

121r20r2r1r13t2exp(t2)r23dtdr1dr2

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

e Mathematica retorna (tive problemas com o aqui porque o resultado é longo. Eu quebrei em duas equações. se alguém souber uma boa maneira de exibir isso, por favor me diga):LATEX

12164r22e1r22(2e2r2(25+r2(19+2r2(1+r2)))

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

Então eu tentei avaliar

121r2r2r1r2+r1

exp(t2)(r1+r2t)4(t2+2t(r1+r2)3(r2r1)2)2r13r23dtdrdr2

usando

Integre [(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}]

agora mesmo, e o Mathematica não retornou uma resposta após cerca de meia hora (mas estou tendo problemas de rede de computadores no momento e eles podem ser os culpados).

[FIM DE EDIÇÃO DE 2 DE MARÇO]

0.007164820144202

Sei que o Matlab é um bom software, mas ouvi dizer que as integrais triplas numéricas são difíceis de executar com precisão, e os matemáticos devem ser céticos, portanto, quero uma maneira de verificar a precisão dessa resposta. As integrais fornecem o valor esperado de um determinado experimento (se alguém quiser, posso editar esta pergunta para descrever o experimento): implementei o experimento no Matlab usando números gerados aleatoriamente, um milhão de vezes e calculei a média dos resultados. Repeti esse processo quatro vezes. Aqui estão os resultados (peço desculpas se usei a palavra "julgamento" incorretamente):

Teste 1: 0.007133292603256

Teste 2: 0.007120455071989

Teste 3: 0.007062595022049

Teste 4: 0.007154940168452

Teste 5: 0.007215000289130

Embora cada teste tenha usado um milhão de amostras, os valores da simulação concordam apenas no primeiro dígito significativo. Eles não estão próximos o suficiente um do outro para eu determinar se a integral tripla numérica é precisa.

Então, alguém pode me dizer se posso confiar no resultado do "triplequad" aqui e sob que circunstâncias alguém pode confiar nele em geral?

Uma sugestão que recebi no Math Stack Exchange foi tentar outro software como Mathematica, Octave, Maple e SciPy. Esse é um bom conselho? As pessoas realmente fazem trabalho numérico no Mathematica e Maple? O Octave é uma espécie de clone do Matlab, então posso assumir que ele usa os mesmos algoritmos de integração? Eu nunca ouvi falar do SciPy antes e gostaria de ter alguma opinião sobre isso.


UPDATE: Alguém do Math Stack Exchange fez isso no Maple e conseguiu0,007163085468. Isso é concordância com três números significativos. Esse é um bom sinal.

Além disso, eu gostaria de receber sugestões sobre como inserir expressões longas e com várias linhas no euUMATEXno Stack Exchange. Você pode usar o ambiente "alinhado" aqui? Eu tentei e não consegui fazê-lo funcionar.

Stefan Smith
fonte
2
Seus resultados de simulação são perfeitamente consistentes com o valor numérico retornado pelo Matlab: sua média de 0,00713726 é apenas -1.11erros padrão menores do que o Matlab retornou. FWIW, o Mathematica retorna0,00716308537.... Também pode avaliar essas integrais simbolicamente em termos de polinômios e funções de erro.
whuber
@whuber Obrigado. Eu poderia jurar que tentei simbolicamente no Maple e o Maple não conseguiu. Tentarei novamente no Maple e, se não funcionar, tentarei no Mathematica. Aliás, fiz uma integral semelhante no Maple e recebi uma enorme resposta simbólica. Parecia ser uma soma e diferença de números muito grandes cujo total geral era bastante pequeno. Eu suspeito que o erro de arredondamento foi provavelmente na resposta final. Em um problema como esse, você deve usar a resposta simbólica ou apenas a integral numericamente?
Stefan Smith
Respostas simbólicas têm a vantagem de serem combinações de funções que (geralmente) podem ser computadas com eficiência com precisão arbitrária. Geralmente, também, a solução simbólica também se presta à recomputação rápida quando os parâmetros são variados. Por esses motivos, geralmente vale a pena procurar uma solução simbólica.
whuber
@whuber: Tentei fazer integrais essencialmente equivalentes (alterar algumas constantes e remover algumas constantes multiplicativas) no Mathematica, e o Mathematica só podia fazer as duas integrações externas da primeira integral e parece ter parado na segunda. Publiquei meu código e resultados acima.
Stefan Smith
11
Re A edição de 2 de março: Ao reduzir a integral tripla simbolicamente para uma única integral (na primeira metade de suas integrais), você conseguiu muito. O integrando é muito bem comportado e pode ser integrado numericamente com extrema precisão em uma fração de segundo.
#

Respostas:

9

Antes de tudo, não é o software (ou pelo menos não deveria) que determina a qualidade da solução de um problema, é a qualidade e a adequação do algoritmo aplicado. Você deve verificar qual algoritmo está sendo usado pelo triplequad no Matlab (eu acho que ele usa uma quadratura gaussiana adaptável aninhada). E você deve verificar quais são as tolerâncias solicitadas (tolerância absoluta e relativa necessária). As chances são de que, por padrão, ele solicite apenas10-8 precisão relativa.

A resposta que vem do Maple é provavelmente feita pela Computer Algebra e talvez encontre uma solução fechada que foi avaliada usando um ponto flutuante de precisão dupla. Isso tem a vantagem de que você não está aproximando a integral por um somatório finito (e, portanto, introduzindo erros de aproximação), mas o Computer Algebra System encontrará uma expressão para a integral que poderá ser avaliada. Obviamente, deve-se tomar cuidado ao avaliar esta expressão (para arredondamento).

Se você quiser fazer isso com o SciPy, também precisará recorrer à quadratura gaussiana adaptável aninhada usando as rotinas subjacentes do Quadpack (Piessens et al.). No Octave, você terá a mesma abordagem. E não ficaria muito surpreso se o Matlab também usar o Quadpack como mecanismo de quadratura (já que é a referência).

GertVdE
fonte
@GretVdE: Obrigado pela informação. Tentei avaliar a integral simbolicamente primeiro e o Maple não conseguiu (por isso era provavelmente impossível, usando funções padrão), então pedi ao Maple que o fizesse numericamente. Não sei qual algoritmo foi usado.
Stefan Smith
@StefanSmith: você pode descobrir, definindo o infolevel em Maple: infolevel[`evalf/int`] := 4. Tem certeza de que a Mape não consegue encontrar uma solução fechada? A integral não parece ser muito complicada. Você poderia tornar sua folha de bordo pública em algum lugar?
precisa saber é o seguinte
@ StefanSmith: Eu publicaria o código Maple na pergunta acima.
precisa saber é o seguinte
Não posso fazer com que o Maple trabalhe no meu sistema no momento, mas tentei integrais equivalentes no Mathematica, e o Mathematica fez apenas as duas internas da primeira integral tripla e parou na segunda integral tripla. Por favor, veja a pergunta editada.
Stefan Smith