Main Content

integral2

数値 2 重積分の評価

説明

q = integral2(fun,xmin,xmax,ymin,ymax) は、平面領域 xminxxmax および ymin(x)yymax(x) 上で関数 z = fun(x,y) の積分を近似します。

q = integral2(fun,xmin,xmax,ymin,ymax,Name,Value) は、1 つ以上の Name,Value のペアの引数を使用して追加オプションを指定します。

すべて折りたたむ

以下の関数を想定します。

f(x,y)=1(x+y)(1+x+y)2.

この関数は、x および y がゼロのときには定義されません。integral2 は、特異点が積分境界上にあるときに最もよく機能します。

無名関数を作成します。

fun = @(x,y) 1./( sqrt(x + y) .* (1 + x + y).^2 )
fun = function_handle with value:
    @(x,y)1./(sqrt(x+y).*(1+x+y).^2)

0x10y1-x で囲まれる三角形領域で積分します。

ymax = @(x) 1 - x;
q = integral2(fun,0,1,0,ymax)
q = 0.2854

次の関数を定義します。

f(θ,r)=rrcosθ+rsinθ(1+rcosθ+rsinθ)2

fun = @(x,y) 1./( sqrt(x + y) .* (1 + x + y).^2 );
polarfun = @(theta,r) fun(r.*cos(theta),r.*sin(theta)).*r;

r の上限を表す関数を定義します。

rmax = @(theta) 1./(sin(theta) + cos(theta));

0θπ/20rrmax で囲まれる領域で積分します。

q = integral2(polarfun,0,pi/2,0,rmax)
q = 0.2854

パラメーター a=3 および b=5 をもつパラメーター化された無名関数 f(x,y)=ax2+by2 を作成します。

a = 3; 
b = 5;
fun = @(x,y) a*x.^2 + b*y.^2;

0x5 および -5y0 の領域で積分を評価します。'iterated' メソッドと有効桁数約 10 桁の精度を指定します。

format long
q = integral2(fun,0,5,-5,0,'Method','iterated',...
'AbsTol',0,'RelTol',1e-10)
q = 
     1.666666666666667e+03

入力引数

すべて折りたたむ

関数ハンドルとして指定される被積分関数であり、平面領域 xminxxmax および ymin(x) ≤ yymax(x) 上で積分される関数を定義します。関数 fun は、同じサイズの 2 つの配列を受け入れ、対応する値の配列を返さなければなりません。要素単位の演算を実行しなければなりません。

データ型: function_handle

x の下限。有限または無限の実数スカラー値として指定します。

データ型: double | single

x の上限。有限または無限の実数スカラー値として指定します。

データ型: double | single

y の下限。有限または無限の実数スカラー値として指定します。四角形でない領域を積分するときに、ymin を関数ハンドル (x の関数) になるように指定できます。

データ型: double | function_handle | single

y の上限。有限または無限の実数スカラー値として指定します。四角形でない領域を積分するときに、ymax を関数ハンドル (x の関数) になるように指定することもできます。

データ型: double | function_handle | single

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: 'AbsTol',1e-12 は絶対許容誤差を小数点以下 12 桁に近い精度に設定します。

'AbsTol' と非負の実数で構成され、コンマ区切りのペアとして指定される、絶対許容誤差。integral2 は、絶対許容誤差を使用して絶対誤差 |q – Q| の推定を制限します。ここで、q は積分の計算値であり、Q は (未知の) 正確な値です。絶対許容誤差を減らすと、integral2 で精度の小数点以下の桁数をより多く指定できることもあります。既定値は 1e-10 です。

メモ

AbsTolRelTol は一緒に動作します。integral2 は絶対許容誤差または相対許容誤差を満たす可能性がありますが、両方とも満たす必要はありません。これらの許容誤差の使用の詳細は、ヒントの節を参照してください。

例: 'AbsTol',1e-12 は絶対許容誤差を小数点以下 12 桁に近い精度に設定します。

データ型: double | single

'RelTol' と非負の実数で構成され、コンマ区切りのペアとして指定される、相対許容誤差。integral2 は、相対許容誤差を使用して相対誤差 |q – Q|/|Q| の推定を制限します。ここで、q は積分の計算値であり、Q は (未知の) 正確な値です。相対許容誤差を減らすと、integral2 で精度の有効桁数をより多く指定できることもあります。既定値は 1e-6 です。

メモ

RelTolAbsTol は一緒に動作します。integral2 は相対許容誤差または絶対許容誤差を満たす可能性がありますが、両方とも満たす必要はありません。これらの許容誤差の使用の詳細は、ヒントの節を参照してください。

例: 'RelTol',1e-9 は約 9 桁の有効桁数に相対許容誤差を設定します。

データ型: double | single

'Method' と以下のいずれかの方法で構成され、コンマ区切りのペアとして指定される、積分法。

積分法説明
'auto'ほとんどの場合、integral2'tiled' 法を使用します。これは、積分の極限が無限であるときに 'iterated' 法を使用します。これは既定のメソッドです。
'tiled'integral2 は積分の領域を長方形に変換し、必要に応じてそれをいくつかの小さな長方形領域に分割します。積分の極限は有限でなければなりません。
'iterated'integral2integral を呼び出して、累次積分を実行します。外側の積分は、xminxxmax 上で評価されます。内側の積分は、ymin(x)yymax(x) 上で評価されます。積分の極限を無限にできます。

例: 'Method','tiled' はタイル状の積分法を指定します。

データ型: char | string

ヒント

  • integral2 関数は次を満たそうとします。

    abs(q - Q) <= max(AbsTol,RelTol*abs(q))
    ここで、q は積分の計算値であり、Q は (未知の) 正確な値です。絶対許容誤差と相対許容誤差は、精度と計算時間のトレードオフ方法を提供します。通常、相対許容誤差が積分の精度を決定します。ただし、abs(q) が十分に小さい場合、絶対許容誤差が積分の精度を決定します。通常は、絶対許容誤差と相対許容誤差を両方とも指定してください。

  • 'iterated' 法は、関数が積分領域内に不連続点をもつときに、より効果的になります。ただし、最高のパフォーマンスと精度は、不連続点で被積分関数を分割して、複数の積分結果を合計する場合に得られます。

  • 四角形でない領域に対して積分を行うときは、yminymax、(または両方) が関数のハンドルであるときに最良のパフォーマンスと精度が得られます。四角形でない領域を積分する場合は、被積分関数値を 0 に設定することは避けてください。そうしなければならない場合は、'iterated' 法を指定してください。

  • yminymax、(または両方) が境界のない関数である場合は 'iterated' メソッドを使用してください。

  • 無名関数をパラメタライズするときには、パラメーター値が関数ハンドルの寿命にわたり保持されることに注意してください。たとえば、関数 fun = @(x,y) x + y + afun が作成されたときの a の値を使用します。後で a の値を変更することにした場合、新しい値で無名関数を再定義しなければなりません。

  • 積分の単精度極限を指定している場合、または fun が単精度の結果を返す場合、より大きな絶対許容誤差または相対許容誤差を指定する必要があります。

参照

[1] L.F. Shampine “Vectorized Adaptive Quadrature in MATLAB®,” Journal of Computational and Applied Mathematics, 211, 2008, pp.131–140.

[2] L.F. Shampine, "MATLAB Program for Quadrature in 2D." Applied Mathematics and Computation. Vol. 202, Issue 1, 2008, pp. 266–274.

拡張機能

バージョン履歴

R2012a で導入