ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

quadgk

数値積分、適応 Gauss-Kronrod 求積法

構文

q = quadgk(fun,a,b)
[q,errbnd] = quadgk(fun,a,b)
[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...)

説明

q = quadgk(fun,a,b) は、高次のグローバルな適応求積法と既定の許容誤差を使用して、a から b までのスカラー値の関数 fun の積分を近似します。関数 y = fun(x) はベクトル引数 x を受け入れ、結果のベクトル y を返します。ここで、y は、x の各要素で評価される被積分関数です。fun は関数ハンドルでなくてはなりません。範囲 a および b は、-Inf または Inf になります。どちらも有限の場合、複素数になります。少なくとも 1 つが複素数の場合、積分は複素平面内で a から b までの直線経路上を近似します。

「関数のパラメーター化」では、必要に応じて関数 fun にパラメーターを追加する方法について説明しています。

[q,errbnd] = quadgk(fun,a,b) は、絶対誤差 |Q - I| の上限を近似します。ここで、I は正確な積分値を示します。

[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...) は、オプション パラメーターの指定された値を使用して積分を実行します。使用可能なパラメーターは次のとおりです。

パラメーター説明 

'AbsTol'

絶対許容誤差。

'AbsTol' の既定値は 1.e-10 (double)、1.e-5 (single) です。

quadgk は、errbnd <= max(AbsTol,RelTol*|Q|) の条件を満たそうとします。これは、|Q| が十分に小さいときに絶対誤差を制御し、|Q| が大きいときは相対誤差を制御します。純粋な絶対誤差の制御には、'AbsTol' > 0 および 'RelTol'= 0 を使用します。純粋な相対誤差の制御には、'AbsTol' = 0 を使用します。純粋な絶対誤差の制御を使用する場合を除き、最小相対許容誤差は 'RelTol' >= 100*eps(class(Q)) になります。

'RelTol'

相対許容誤差。

'RelTol' の既定値は 1.e-6 (double)、1.e-4 (single) です。

'Waypoints'

積分の中間点のベクトル。

関数 fun(x) が積分区間において不連続性をもつ場合、その場所を Waypoints ベクトルとして与える必要があります。ab と中間点がすべて実数である場合、ab 間の中間点のみが、並べ替えられた順に使用されます。中間点は関数 fun(x) 内の特異性を扱うようになっていません。特異点を扱うには、別々の積分の端点を作成し、結果を追加する必要があります。

ab、または中間点ベクトルの任意の要素が複素数の場合、a から最初の中間点まで、最初の中間点から 2 番目の中間点までというように、最終的に、最後の中間点から b まで複素平面内の直線経路の列で積分が行われます。

'MaxIntervalCount'

許容できる区間の最大数。

既定値は 650 です。

'MaxIntervalCount' パラメーターは、関数 quadgk が最初の反復の後に一度に使用する区間の数を制限します。関数 quadgk がこの制限のために早く終了する場合、警告が発生します。この値を常に大きくすることは推奨されませんが、errbnd が十分に小さく、希望する精度がほぼ達成されたときは値を大きくすることが適切な場合があります。

積分の端点で特異性がある被積分関数

被積分を計算する関数 myfun を記述します。

function y = myfun(x) 
y = exp(x).*log(x);

次に、myfun への関数ハンドル @myfunquadgk に渡し、積分範囲を 0 から 1 に設定します。

q = quadgk(@myfun,0,1)

q =

   -1.3179

または、積分を無名関数のハンドル F として、関数 quadgk に渡すことができます。

f = (@(x)exp(x).*log(x));
q = quadgk(f,0,1); 

準無限区間での振動被積分関数

指定された許容誤差を使用して準無限区間に対して積分を行い、誤差を近似します。

f = @(x)x.^5.*exp(-x).*sin(x);
[q,errbnd] = quadgk(f,0,inf,'RelTol',1e-8,'AbsTol',1e-12)

q =

  -15.0000

errbnd =

  9.4386e-009

極を中心とした閉曲線積分

Waypoints を使用し、区分的線形等高線を使用して極を中心とした積分を行います。

f = @(z)1./(2*z - 1);
q = quadgk(f,-1-i,-1-i,'Waypoints',[1-i,1+i,-1+i])

q =

   0.0000 + 3.1416i

診断

関数 quadgk は、次のいずれかの警告を出力する可能性があります。

「最小ステップ サイズに達しました」は、区間の部分分割が、元の区間長の丸め誤差の次数になるような部分区間長になることを示します。被積分の特異点がある可能性があります。

「使用中に最大反復回数の制限に達しました。」は、許容誤差を満たす前に積分が終了し、積分の続行には、MaxIntervalCount 部分区間以上が必要であることを示します。積分は存在しないか、または数値的に近似するのが困難である可能性があります。積分が以前に終了したときに許容誤差の要件がほぼ満たされた場合に限り、MaxIntervalCount を大きくすると、役立ちます。

'Infinite or Not-a-Number function value encountered' は、ある区間内で積分計算中に浮動小数点のオーバーフローまたはゼロ除算が発生したことを示します。

詳細

すべて折りたたむ

ヒント

  • 区間が無限 ([a,)) の場合、fun(x) の積分が存在するには、x が無限に近づくにつれて fun(x) が減衰しなければならず、関数 quadgk ではそれを速く減衰させる必要があります。無限の区間の振動関数には特別な方法が必要ですが、fun(x) が速く減衰する場合は、関数 quadgk を使用できます。

  • 関数 quadgk は、特異性がさほど強くない場合に、有限の端点に特異点をもつ関数を積分できます。たとえば、端点 clog|x-c|p >= -1/2 の場合の |x-c|p のように振る舞う関数を積分できます。関数が (a,b) 内の点で特異である場合、特異点を端点として使用して部分区間に対する積分の和として積分を記述し、関数 quadgk を使用して計算して、結果を加算します。

アルゴリズム

quadgk は、Gauss-Kronrod の組 (15 次および 7 次の式) に基づく適応求積を実装します。

参照

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

この情報は役に立ちましたか?