2016-08-11 2 views
1

最近、関数fun = @(v,x)(10^4)*0.648*(1+v*0.001).*( exp(-2.83./(10^-8+(sqrt(1+2*v*0.001)).*(x.^2))) -1).*(exp(-(v.^2)*0.33))のdouble積分をvの範囲(-1000,1000)とxの(0、a)で計算しようとしています。非常に大きい数または無限大。私が見いだしたのは、a = infの場合、値がきわめて正確である(数値的に評価するのが面倒ではない単一の積分になります)が、0から10^9に、10^9から無限大までの積分は正しい値に合わない。後者はゼロである。私が本当に関心を持っているのは、0から10^9までの積分値ですが、これらの結果は、私がそれを全く信頼できるかどうか疑問に思います。 私がしたことで、関数の前に大きなプリ係数(10^200)を使用して、小さな数を「補正」する必要もありました。そうでなければ結果はすべてナンセンスでした。私はvpaを使用しようとしましたが、成功しませんでした。私は間違って何をしていますか?あなたの問題は、MATLABが異なる場合、あなたが扱っている大きな数字のために使用する別の方法に関係しているよう指数が大きく抑制されたMatlab

ロブ

+0

コードを入力してください。 – obchardon

+0

これはプログラミングの質問であるかどうかはわかりません。数値/数学の問題によく似ています。 – MSalters

+0

@obchardon上記のように関数を宣言し、a、bを適切な極値で 'integral2(-1000,1000、a、b)'と入力しました。 –

答えて

0

が見えます。

ezsurfの機能は、どのように動作するかを知るために表示されます。

だから、1をヒント、値が負の値になるだろうということですそれがどのくらいの近似値を確認するために、小さな範囲にわたって統合することができます。

integral2(fun,-100,100,0,100) 

%ans = 
% -5.9050e+04 

関数がゼロになると仮定すると、最終値は近傍にあるはずです。

は今2ヒント:

integral2(fun,-1000,1000,0,100) 

%ans = 
% -2.5613e-29 

これは、積分は基本的にゼロになった限度の範囲を増やすことで、あまり意味がありません。確認後、documentation of integral2

「方法」 - 統合方法 「自動」(デフォルト)| | '反復'

統合メソッドは、 'メソッド'と下記のメソッドの1つからなるコンマ区切りのペアとして指定されます。ほとんどの場合

統合方法説明

「オート」、integral2は「タイル張り」メソッドを使用しています。積分限界のいずれかが無限である場合、「反復」法を使用します。これがデフォルトの方法です。

「タイル」インテグラル2は、積分領域を矩形に変換し、必要に応じてより小さな矩形領域に細分します。積分限界は有限でなければならない。

'iterated' integral2は積分を呼び出して反復積分を実行します。外側の積分は、xmin≦x≦xmaxで評価されます。内部積分は、ymin(x)≦y≦ymax(x)で評価されます。積分限界は無限になります。

だから、メソッドを定義しないと、限界が有限であれば "タイル"を、有限であれば "補間"を使用します。

範囲が大きすぎると、「タイル」メソッドで作成されたタイルが大きすぎて積分を正確に計算できないことがありますか?それは、その問題を持つべきではない、のは

integral2(fun,-1000,1000,0,100,'Method','iterated') 

%ans = 
% -5.9050e+04 

興味深いをチェックしてみましょう「反復」の場合であれば、我々は何かにあるように、見えます。元の問題を試してみましょう

integral2(fun,-1000,1000,0,inf) 

%ans = 
% -5.9616e+04 

integral2(fun,-1000,1000,0,10^9,'Method','tiled') 

%ans = 
% -2.1502e-33 

integral2(fun,-1000,1000,0,10^9,'Method','iterated') 

%ans = 
% -5.9616e+04 

integral2(fun,-1000,1000,10^9,inf) 

%ans = 
%  0 

これは良く見えます。だから、そのタイル張りのメソッドは、その特性と限界の範囲のサイズのため、あなたの関数の問題であるように見えます。だから、あなたが 'iterated'を使う限り、あなたは大丈夫でしょう。

+0

今、それは動作します、ありがとう! 0からinfと0から10^9までの積分の差はわずかですが、10^9から無限大まで計算しようとすると0になりますが、それほど近いので、ちょうど正確さ。 –

+0

はい、結局のところ、Matlabはこの場合はシンボリックではなく数値積分を行っているので、精度には限界があります。特に、使用している範囲 –

関連する問題