NIntegrateは評価しません



Nintegrate Doesnt Evaluate



解決:

NIntegrateに計算を強制するにはどうすればよいですか?

以下に「強制」の回答を示します。それらは、被積分関数の理解を最小限に抑えながら、幅広い状況に適用する必要があります。



診断

まず、によって与えられたメッセージを見てみましょうNIntegrate:

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}](* In [18]:= NIntegrate :: zeroregionの評価中:積分領域{{0.5,1}、{1.、0.999999999999999999999999999999975153439150570957241015732418974750}}は、指定された作業精度でさらに細分化することはできません。NIntegrateは、そこでおよびそれ以上の分割できない領域でゼロ積分を想定します。*)(* In [18]の評価中:= NIntegrate :: inumri:被積分関数(t ^ 4 x ^ 3)/ Sqrt [-t + x]は、境界が{{0.5,1}、 {0.999999999999999999999999999999975153439150570957241015732418974750,0.999999999999999999990527764909997233148869688962838439242343509680}}。*)(* NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}] *)

メッセージNIntegrate :: zeroregionおよびNIntegrate :: inumriは、デフォルトの特異点ハンドラー「IMT」が適用されているために発行されます。



アプローチ

1.1。 使用する除外は1つの選択肢です。

2.2。 別の代替策は、特異点ハンドラーアプリケーションを防ぐことです(そして増加しますMaxRecursion。)

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、メソッド-> {'GlobalAdaptive'、 'SingularityHandler'->なし、 MaxRecursion-> 120}](* 0.0956116 *)

3.3。 3番目の方法は、「IMT」が有益であると思われる場合は、「IMT」の調整パラメーターを使用することです。 (で説明されていますNIntegrateの高度なドキュメント。)



NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、メソッド-> {'GlobalAdaptive'、 'SingularityHandler'-> {' IMT '、' TuningParameters '-> 2}}](* In [16]:= NIntegrate :: zeroregion:Integration region {{0.75,1}、{1.、0.999999999999999999999999999925933445985376189112492843112221898520}}の評価中は、指定された作業精度。NIntegrateは、そこでおよびそれ以降の分割できない領域でゼロ積分を想定します。*)(* 0.0956116 *)

四。 統合領域ごとにより多くのサンプリングポイントを使用します。

5.5。 4に関連して、より高い使用MinRecursion:

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、MinRecursion-> 4](* 0.0956116 *)

6.6。 より高い精度を使用してください。

7。 統合の順序を切り替えます。


問題は、特異点での誤差推定が再帰的細分化を過度に推進していることだと思います。提示された他の方法に加えて、ここにいくつかあります。

別のルールを使用します(別のエラー推定量を使用):

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、メソッド-> 'GaussKronrodRule'](* 0.0956116 *)

統合の順序を切り替えます。

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{t、0、1}、{x、t、1}](* 0.0956116 *)

より高い作業精度を使用します。

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、WorkingPrecision-> 16](* 0.09561157754126271 *)

補遺

感じますNIntegrateは、ユーザーの介入なしにOPの積分を処理する必要があります。特異点は、自動的に識別しやすく、計算で処理しやすいものでなければなりません。問題は、何らかの理由で特異点が誤って処理され、バグである可能性があることだと思います。これが私が想像できる数学的または計算上の根拠がまったくない3つの「修正」です:

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、除外-> x == 100](* x == 100 is相互作用領域の外側*)(* 0.0956116 *)NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、除外-> t == 100](*同上*)(* 0.0956116 *)(*通常の点を `x`間隔の特異点として指定*)NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x] 、{x、0、1 / 2、1}、{t、0、x}](* 0.0956116 *)

NIntegrateが適用されるようです'UnitCubeRescaling'は、前にコメントで残した次の置換に似ています。

NIntegrate [((t ^ 4 x ^ 3)/ Sqrt [-t + x] /。t-> tx)* [メール保護] [メール保護] D [{x、tx}、{{x、t}} ]、{x、0、1}、{t、0、1}](* 0.0956116 *)

の働きを部分的に見ることができますNIntegrateを使用してIntegrationMonitor:

ireg = NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、IntegrationMonitor:>(Return [#、NIntegrate]&)]

Mathematicaグラフィックス

私の置換とによって行われた変換からの被積分関数を比較するとNIntegrate、象徴的には異なる表現ですが、同等であることがわかります。

First [ireg] ['NumericalFunction'] ['FunctionExpression']((t ^ 4 x ^ 3)/ Sqrt [-t + x] /。t-> tx)[メール保護] @D [{x、tx} 、{{x、t}}](*(t ^ 4 x ^ 8)/ Sqrt [x-tx](t ^ 4 x ^ 7 Abs [x])/ Sqrt [x-tx] *)

唯一の違いは、ヤコビ行列式をでラップしたことです。Abs []。以来0<= x <= 1, there's no significant difference between xとAbs [x]。またはありますか?:

NIntegrate [(t ^ 4 x ^ 8)/ Sqrt [x --t x]、{x、0、1}、{t、0、1}] 

NIntegrate :: zeroregion:統合領域...さらに細分化することはできません...。

NIntegrate :: inumri:被積分関数(t ^ 4 x ^ 8)/ Sqrt [x-tx]がオーバーフローと評価されました...。

(* NIntegrate [(t ^ 4 x ^ 8)/ Sqrt [x --t x]、{x、0、1}、{t、0、1}] *)
NIntegrate [(t ^ 4 x ^ 7 Abs [x])/ Sqrt [x --t x]、{x、0、1}、{t、0、1}] 
(* 0.0956116 *)

の中にNIntegrate rescaling、OPと同じエラーが発生します。マニュアルのものでは、Abs [x]、問題なく動作します。それはAbs [x]は、特異点の異なる処理をトリガーします。

繰り返しになりますが、OPのコードが単に機能するだけではいけない理由を正当化することはできません。


検討中の不適切な積分を数値的に計算するには、(ドキュメントに記載されているように)単数線を示す必要があります。

NIntegrate [(t ^ 4 x ^ 3)/ Sqrt [-t + x]、{x、0、1}、{t、0、x}、除外-> {t == x}] 

0.0956116