Matlabのこの数値三重積分を信頼できますか?


15

計算科学の人々:

私はもともと数学スタック所でこの質問を投稿し、誰かが、私はここに、「より良い」答えを得るかもしれないとコメント:

私は数値計算法とMatlabの初心者です。次の2つのトリプル積分の合計を評価しようとしています(明らかにもっと簡単に書くことができますが、それでもシンボリックに評価することはできません(?))。Lの取得に問題がありますはここで動作するので、ここで渋々それをバラバラに分割しました。LATEX

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

そして

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π

そして

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

編集(2013年3月2日):Mathematicaに積分をシンボリックに実行させたと誰かが答えました。私はこれを(積分の単純化されたバージョンで)実行しようとしましたが、Mathematicaは最初の2つだけを実行でき、2つ目は停止しました。助けていただければ幸いです。これが私がしたことです。

私は評価しようとしました

via

121r20r2r1r13t2exp(t2)r23dtdr1dr2

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

Mathematicaが戻ります(Lに問題がありましたは結果が長いためです。私はそれを2つの方程式に分けました。誰かがこれを表示する良い方法を知っているなら教えてください):LATEX

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

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

それから私は評価しようとしました

121r2r2r1r2+r1

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

を使用して

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

ちょうど今、そしてMathematicaは約30分後に答えを返さなかった(しかし、私は今コンピュータネットワークの問題を抱えており、彼らは責任があるかもしれない)。

[3月2日編集の終了]

Matlabの「triplequad」コマンドを使用しましたが、追加オプションはありません。私はそれを行う他の方法を知らなかったので、ヘビサイド関数を使用して統合の可変制限を処理しました。Matlabはをくれました0.007164820144202

Matlabは優れたソフトウェアですが、数値三重積分は正確に行うのが難しく、数学者は懐疑的であると聞いているので、この答えの正確性を検証する方法が必要です。積分は、特定の実験の期待値を提供します(必要に応じて、この質問を編集して実験を説明できます):適切にランダムに生成された数百万回を使用してMatlabで実験を実装し、結果を平均しました。このプロセスを4回繰り返しました。結果は次のとおりです(「試用」という言葉を不適切に使用した場合は謝罪します)。

0.007133292603256

0.007120455071989

0.007062595022049

0.007154940168452

0.007215000289130

各試行では100万サンプルを使用しましたが、シミュレーション値は最初の有効数字でのみ一致しています。それらは、数値三重積分が正確であるかどうかを判断するのに、互いに十分に近いものではありません。

ここで、「トリプルクワッド」の結果を信頼できるかどうか、そしてどのような状況で一般的に信頼できるのか、誰にでも教えてもらえますか?

Math Stack Exchangeで得た提案の1つは、Mathematica、Octave、Maple、SciPyなどの他のソフトウェアを試すことでした。これはいいアドバイスですか?人々は実際にMathematicaとMapleで数値処理を行いますか?Octaveは一種のMatlabクローンなので、同じ統合アルゴリズムを使用すると仮定できますか?私はこれまでSciPyについても聞いたことがなく、それについての意見を歓迎します。


0.007163085468

また、に長い複数行の式を入力する方法についての提案をいただければ幸いです。LATEX in Stack Exchange. Can you use the "aligned" environment here? I tried, and I couldn't get it to work.


2
Your simulation results are perfectly consistent with the numerical value returned by Matlab: their mean of 0.00713726 is just 1.11 standard errors less than what Matlab returned. FWIW, Mathematica returns 0.00716308537. It can also evaluate these integrals symbolically in terms of polynomials and error functions.
whuber

@whuber Thanks. I could swear I tried it symbolically in Maple and Maple couldn't do it. I'll try again in Maple, and if it doesn't work, I'll try it in Mathematica. BTW, I did a similar integral in Maple, and I got a huge symbolic answer. It appeared to be a sum and difference of very large numbers whose grand total was quite small. I suspect roundoff error was likely in the final answer. In a problem like this, should you use the symbolic answer, or just do the integral numerically?
Stefan Smith

Symbolic answers have the advantage of being combinations of functions that (often) can efficiently be computed to arbitrary precision. Usually, too, the symbolic solution also lends itself to rapid recomputation when parameters are varied. For these reasons it's often worthwhile to seek a symbolic solution.
whuber

@whuber :I tried doing some essentially equivalent integrals (changing some of the constants and removing some multiplicative constants) in Mathematica, and Mathematica could only do the outer two integrations of the first integral, and seems to have stalled on the second one. I posted my code and results above.
Stefan Smith

1
Re The March 2 edit: By reducing the triple integral symbolically to a single integral (in the first half of your integrals) you have accomplished a lot. The integrand is very nicely behaved and can be numerically integrated to extremely high precision within a fraction of a second.
whuber

回答:


9

First of all, it is not the software (or at least it shouldn't be) that determines the quality of the solution to a problem, it's the quality and appropriateness of the algorithm that is applied. You should check what algorithm is being used by triplequad in Matlab (I would guess it uses a nested adaptive Gaussian quadrature). And you should check what the requested tolerances are (required absolute and relative tolerance). Chances are that, by default, it only asks for 108 relative precision.

Mapleからの回答は、おそらくコンピューター代数によって行われ、おそらく閉じた解決策を見つけることができ、その後、倍精度浮動小数点を使用して評価されました。これには、積分を有限の総和で近似しない​​という利点があります(したがって近似誤差が発生します)が、コンピューター代数システムは積分の式を見つけて評価できます。もちろん、この式を評価するときは(丸めのために)注意が必要です。

SciPyでこれを行う場合は、基になるQuadpack(Piessens et al。)ルーチンを使用して、ネストされた適応ガウス求積法に頼る必要があります。Octaveでも同じアプローチを使用できます。また、Matlabが直交エンジンとしてQuadpackを使用していても、それが参照であるため、あまり驚かないでしょう。


@GretVdE:情報をありがとう。最初に積分をシンボリックに評価しようとしましたが、Mapleはそれを行うことができませんでした(したがって、標準関数を使用することはおそらく不可能だったので)。使用したアルゴリズムがわかりません。
ステファンスミス

@StefanSmith:Mapleでinfolevelを設定することで確認できます: infolevel[`evalf/int`] := 4。Mapeが閉じた解決策を見つけることができないのは確かですか?積分はそれほど複雑ではないようです。Mapleシートをどこかに公開してもらえますか?
GertVdE

@StefanSmith:上記の質問にMapleコードを投稿します。
GertVdE

現在、Mapleを自分のシステムで動作させることはできませんが、Mathematicaで同等の積分を試みましたが、Mathematicaは最初のトリプル積分の内側の2つだけを実行し、2番目のトリプル積分で停止しました。編集した質問をご覧ください。
ステファンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.