Main Content

quadgk

数値積分 — Gauss-Kronrod 求積法

説明

q = quadgk(fun,a,b) は、高次のグローバルな適応求積法と既定の許容誤差を使用して、a から b までの関数ハンドル fun を積分します。

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

[___] = quadgk(fun,a,b,Name,Value) は、前述の出力引数の組み合わせのいずれかを使用して、1 つ以上の名前と値のペアの引数による追加オプションを指定します。たとえば、'Waypoints' とそれに続く実数または複素数のベクトルを指定して、積分に使用する特定の点を指示します。

すべて折りたたむ

次の積分を評価します。

q=01exln(x)dx.

ln(0)- に発散するため、この積分は点 x=0 で特異性をもちます。

被積分の無名関数を作成します。関数 logln(x) を計算します。

f = @(x) exp(x).*log(x);

f を 0 から 1 まで積分します。

q = quadgk(f,0,1)
q = -1.3179

閉曲線を指定して、極を中心に複素関数を積分します。

次のような複素閉曲線積分を評価します。

q=dz2z-1.

この被積分関数は、z=1/2 に 1 位の極をもつため、その点を囲む四角形の閉曲線を使用します。閉曲線は、実数線上の x=1 で開始し終了します。名前と値のペア 'Waypoints' を使用して、閉曲線の区分的セグメントを指定します。

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

quadgk を使用して、評価の難しい振動被積分関数を評価します。

次の積分を評価します。

Q=0πsin(20000πx)dx.

この被積分関数は非常に高速で振動するため、評価が困難です。quadgk を使用して積分を評価し、2 つの出力を指定して、許容誤差がどの程度満たされているかを調べます。

fun = @(x) sin(2e4*pi*x);
[Q,errbnd] = quadgk(fun,0,pi)
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is  5.7e-01. The integral may not exist, or it may be difficult to approximate numerically. Increase MaxIntervalCount to 1272 to enable QUADGK to continue for another iteration.
Q = -0.0082
errbnd = 0.5723

警告メッセージは、解法プロセス内で別の反復を許可するための MaxIntervalCount の調整方法を示しています。

積分を再度解きますが、今度は MaxIntervalCount1e5 として指定します。区間を増やすことで、quadgk は問題の絶対許容誤差 (倍精度の場合は 1e-10) を満たせるようになります。

[Q,errbnd] = quadgk(fun,0,pi,'MaxIntervalCount',1e5)
Q = 1.6656e-06
errbnd = 2.6323e-12

入力引数

すべて折りたたむ

被積分関数。a から b まで積分される関数を定義する関数ハンドルとして指定します。

スカラー値問題の場合、関数 y = fun(x) はベクトル引数 x を受け入れてベクトル結果 y を返さなければなりません。ここで、y は、x の各要素で評価される被積分関数です。この要件は通常、fun が行列演算子 (^*、…) ではなく配列演算子 (.^.*、…) を使用しなければならないことを意味します。

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

例: q = quadgk(@(x) exp(1-x.^2),a,b) は無名関数ハンドルを積分します。

例: q = quadgk(@myFun,a,b) は、ファイルとして保存される関数 myFun を積分します。

データ型: function_handle

積分範囲。実数または複素数スカラーの個別の引数として指定します。範囲 a および b は、-Inf または Inf にできます。どちらも有限の場合、複素数になります。少なくとも 1 つが複素数の場合、積分は複素平面内で a から b までの直線経路上を近似します。

例: quadgk(fun,0,1) は、fun0 から 1 まで積分します。

データ型: single | double
複素数のサポート: あり

名前と値の引数

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

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

例: q = quadgk(fun,a,b,'Waypoints',[0.1 1.1 2.1]) は、'Waypoints' オプションを使用して、被積分関数を評価するいくつかの対象点を指定します。

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

quadgk は次の条件を満たそうとします。

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

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

例: quadgk(fun,a,b,'AbsTol',tol,'RelTol',0) は、errbnd <= tol であることを必要とし、純粋な絶対誤差の制御を使用します。

データ型: single | double

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

quadgk は次の条件を満たそうとします。

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

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

例: quadgk(fun,a,b,'AbsTol',0,'RelTol',tol) は、errbnd <= |I|*tol であることを必要とし、純粋な相対許容誤差を使用します。

データ型: single | double

'Waypoints' と、実数または複素数のベクトルとで構成され、コンマ区切りのペアとして指定される、積分途中点。途中点を使用して、積分器に初期メッシュで使用させる積分区間内の点を示します。

  • 局所的極値など、関数の興味深い機能の近くに評価点を追加します。

  • 不連続点の位置を指定して、被積分関数の不連続点に対して効率的に積分します。

  • 複素数を途中点として指定して複雑な閉曲線積分を実行します。xminxmax または途中点ベクトルの要素が複素数の場合、積分は、複素平面内の一連の直線パスに対して実行されます。この場合、積分の極限と途中点はすべて有限でなければなりません。

特異点を指定するために途中点を使用しないでください。その代わり、区間を分割し、終端点で特異点となる別の積分の結果を追加してください。

例: 'Waypoints',[1+1i,1-1i] は、積分区間に沿った 2 つの複素数途中点を指定します。

データ型: single | double
複素数のサポート: あり

許容できる区間の最大数。スカラーとして指定します。このオプションは、quadgk が最初の反復の後に一度に使用する区間の数を制限します。関数 quadgk がこの制限のために早く終了する場合、警告が発生します。この値を常に大きくすることは推奨されませんが、errbnd が十分に小さく、希望する精度がほぼ達成されたときは値を大きくすることが適切な場合があります。

例: quadgk(fun,a,b,'MaxIntervalCount',700)

出力引数

すべて折りたたむ

積分値。スカラーとして返されます。

絶対誤差の上限の近似値。スカラーとして返されます。積分の絶対誤差の上限の近似値は errbnd = |q – I| です。ここで、q は積分の計算値であり、I は (未知の) 正確な値です。quadgk は次の条件を満たそうとします。

errbnd <= max(AbsTol,RelTol*abs(q))
この出力引数を指定して、積分が AbsTolRelTol の許容誤差をどの程度満たすかを確認します。errbnd が望ましい値に近い場合、MaxIntervalCount の値を増やすことで望ましい値に到達できることがあります。

ヒント

  • quadgkintegral は基本的に同じ積分法を使用します。通常は、quadgk ではなく integral を使用してください。ただし、quadgk を使用すると、次のことができます。

    • errbnd 出力引数で解の精度の監視する。

    • integral が区間の最大数への到達を警告している場合に、MaxIntervalCount に大きな値を指定する。

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

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

参照

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

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2007b で導入