23.1 1変数関数
Octaveは、 aからbまでの区間における関数fの積分を計算するための5つの異なる適応積分アルゴリズムをサポートしています。これらは、
quad
ガウス積分法に基づく数値積分。
quadv
適応型ベクトル化シンプソン則を使用した数値積分。
quadl
適応型 Lobatto 規則を使用した数値積分。
quadgk
適応型ガウス・コンロッド則を使用した数値積分。
quadcc
適応型 Clenshaw-Curtis 規則を使用した数値積分。
さらに、以下の機能も提供されます。
integral
選択された積分関数とオプションに応じて、 quadvとを 選択する互換性ラッパー関数。quadgk
trapz, cumtrapz
台形法を使用したデータの数値積分。
使用する最適な求積アルゴリズムは、積分関数によって異なります。関数ではなく経験的データがある場合、選択はtrapzまたは ですcumtrapz。積分関数の特性が不明な場合は、quadccが最も堅牢です。これは、不連続性、特異点、振動関数、および無限区間を処理できるためです。積分関数が滑らかな場合は、 が最もquadgk高速なアルゴリズムになる可能性があります。
| 関数 | 特徴 |
| quad | 滑らかな積分関数による中程度の精度 |
| quadv | 滑らかな積分関数を使用した中程度の精度。quadgk よりも低速 |
| quadl | 滑らかな積分関数を使用した中程度の精度 (1e-6 – 1e-9)振動関数と無限境界を扱う |
| quadgk | 非平滑/平滑積分関数による低精度から高精度,振動関数、特異点、無限境界を扱う |
| quadcc | 非平滑/平滑積分関数による低精度から高精度,振動関数、特異点、無限境界を扱う |
quad関数を統合する 例を以下に示します。
f(x) = x * sin (1/x) * sqrt (abs (1 - x)) from x = 0 to x = 3.
これはかなり難しい積分です (理由を確認するには、積分範囲にわたって関数をプロットしてください)。
最初のステップは関数を定義することです。
function y = f (x) y = x .* sin (1./x) .* sqrt (abs (1 - x)); endfunction
演算子の「ドット」形式の使用に注意してください。これはquad積分器には必要ありませんが、他の積分器では必要です。いずれにしても、ベクトル引数を使用して関数を呼び出してベクトル結果を生成できるため、プロット用のポイントのセットを生成するのがはるかに簡単になります。
2 番目のステップは、積分の限界を指定して quad を呼び出すことです。
[q, ier, nfun, err] = quad ("f", 0, 3)
⇒ 1.9819
⇒ 1
⇒ 5061
⇒ 1.1522e-07
ierquadに対してゼロ以外の値を返しますが、結果はかなり正確です (理由を確認するには、下限を 0.1、0.01、0.001 などに移動した場合に結果がどうなるかを調べてください)。
関数は、"f"関数の文字列名または関数ハンドルにすることができます。これらのオプションを使用すると、m ファイルで関数を完全に定義しなくても、簡単に統合を行うことができます。例:
# Verify gamma function = (n-1)! for n = 4
f = @(x) x.^3 .* exp (-x);
quadcc (f, 0, Inf)
⇒ 6.0000
: q = quad (f, a, b)
: q = quad (f, a, b, tol)
: q = quad (f, a, b, tol, sing)
: [q, ier, nfev, err] = quad (…)
QUADPACKの Fortran ルーチンを使用して、aからbまでのfの積分を数値的に評価します。
fは関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。関数はyとxy = f (x)がスカラーである形式である必要があります。
aとbは積分の下限と上限です。どちらか一方または両方が無限大になる場合があります。
オプションの引数tolは、結果の必要な精度を指定するベクトルです。ベクトルの最初の要素は必要な絶対許容値で、2 番目の要素は必要な相対許容値です。相対テストのみを選択するには、絶対許容値を 0 に設定します。絶対テストのみを選択するには、相対許容値を 0 に設定します。両方の許容値は、デフォルトでsqrt (eps)約 1.5e-8 になります。
オプションの引数sing は、積分関数が特異であることがわかっている値のベクトルです。
積分の結果はqに返されます。
ierには整数のエラー コードが含まれます (0 は統合が成功したことを示します)。
nfev は実行された関数評価の数を示します。
err には、ソリューションのエラーの推定値が含まれます。
この関数は、quad_optionsの他のオプション パラメータを設定できます quad。
注意: は Fortran で記述されているため、再帰的に呼び出すことはできません。これにより、ルーチンやquadによる複数の変数の積分での使用が防止されます。 dblquadtriplequad
Note: because quad is written in Fortran it cannot be called recursively. This prevents its use in integrating over more than one variable by routines dblquad and triplequad.
See also: quad_options, quadv, quadl, quadgk, quadcc, trapz, dblquad, triplequad.
: quad_options ()
: val = quad_options (opt)
: quad_options (opt, val)
quad関数のオプションを照会または設定します。
引数なしで呼び出されると、使用可能なすべてのオプションの名前とその現在の値が表示されます。
引数を 1 つ指定すると、オプションoptの値を返します。
2 つの引数で呼び出されると、quad_optionsオプション opt が値valに設定されます。
オプションには以下が含まれます
"absolute tolerance" 絶対許容値。純粋な相対誤差テストの場合はゼロになる場合があります。
"relative tolerance" 負でない相対許容差。絶対許容差がゼロの場合、相対許容差は 以上にする必要があります max (50*eps, 0.5e-28)。
"single precision absolute tolerance" 単精度の絶対許容値。純粋な相対誤差テストの場合はゼロになる場合があります。
"single precision relative tolerance" 単精度の負でない相対許容差。絶対許容差がゼロの場合、相対許容差は 以上にする必要があります max (50*eps, 0.5e-28)。
: q = quadv (f, a, b)
: q = quadv (f, a, b, tol)
: q = quadv (f, a, b, tol, trace)
: q = quadv (f, a, b, tol, trace, p1, p2, …)
: [q, nfev] = quadv (…)
適応型シンプソンの規則を使用して、 aからbまでのfの積分を数値的に評価します。
fは、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。 quadvは のベクトル化されたバージョンであり 、 fquadによって定義された関数は、入力としてスカラーまたはベクトルを受け入れ、出力としてスカラー、ベクトル、または配列を返す必要があります。
aとbは積分の下限と上限です。両方の限界は有限でなければなりません。
オプション引数tol は、適応手順を停止するために使用される絶対許容値を定義します。デフォルト値は 1e-6 です。
で使用されるアルゴリズムではquadv、積分区間を再帰的に細分化し、各サブ区間にシンプソンの規則を適用します。トレースが true の場合、これらの各部分積分を計算した後、(1) 関数評価の合計数、(2) サブ区間の左端、(3) サブ区間の長さ、(4) サブ区間の積分の近似値を表示します。
追加の引数p1などは関数 fに直接渡されます。 tolとtraceにデフォルト値を使用するには、空の行列 ([]) を渡します。
積分の結果はqに返されます。
オプションの出力nfev は、実行された関数評価の合計数を示します。
注:quadvは Octave のスクリプト言語で記述されており、 関数とは異なり、 dblquadおよび で再帰的に使用できます。 triplequadquad
See also: quad, quadl, quadgk, quadcc, trapz, dblquad, triplequad, integral, integral2, integral3.
: q = quadl (f, a, b)
: q = quadl (f, a, b, tol)
: q = quadl (f, a, b, tol, trace)
: q = quadl (f, a, b, tol, trace, p1, p2, …)
: [q, nfev] = quadl (…)
適応型 Lobatto 規則を使用して、 aからbまでのfの積分を数値的に評価します。
fは、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。関数fはベクトル化される必要があり、入力値のベクトルが与えられたときに出力値のベクトルを返す必要があります。
aとbは積分の下限と上限です。両方の限界は有限でなければなりません。
オプション引数tol は、積分を実行するための絶対許容値を定義します。デフォルト値は 1e-6 です。
で使用されるアルゴリズムはquadl、積分区間を再帰的に細分化します。トレースが定義されている場合、各サブ区間について、(1) 関数評価の総数、(2) サブ区間の左端、(3) サブ区間の長さ、(4) サブ区間の積分の近似値が表示されます。
追加の引数p1などは関数 fに直接渡されます。 tolとtraceにデフォルト値を使用するには、空の行列 ([]) を渡します。
積分の結果はqに返されます。
オプションの出力nfev は、実行された関数評価の合計数を示します。
参考文献: W. Gander および W. Gautschi、「Adaptive Quadrature - Revisited」、BIT Vol. 40、No. 1、2000 年 3 月、pp. 84–101。https ://www.inf.ethz.ch/personal/gander/
See also: quad, quadv, quadgk, quadcc, trapz, dblquad, triplequad, integral, integral2, integral3.
: q = quadgk (f, a, b)
: q = quadgk (f, a, b, abstol)
: q = quadgk (f, a, b, abstol, trace)
: q = quadgk (f, a, b, "prop", val, …)
: [q, err] = quadgk (…)
適応型ガウス・クロンロッド積分法を使用して、 aからbまでのfの積分を数値的に評価します。
fは、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。関数fはベクトル化される必要があり、入力値のベクトルが与えられた場合に出力値のベクトルを返す必要があります ("ArrayValued"このルールの例外については、プロパティを参照してください)。
aとbは積分の下限と上限です。どちらかまたは両方の限界が無限大になるか、弱い端の特異点が含まれる場合があります。変数変換は、無限区間を処理して特異点を弱めるために使用されます。例:
四角形 (@(x) 1 ./ (sqrt (x) .* (x + 1)), 0, Inf)
積分関数の定式化では要素ごとの演算子が使用され./、すべてのユーザー関数でもquadgk同じことが実行されることに注意してください。
オプション引数abstol は、積分手順を停止するために使用される絶対許容値を定義します。デフォルト値は 1e-10 (単一の場合は 1e-5) です。
が使用するアルゴリズムではquadgk、積分区間を細分化し、各サブ区間を評価します。trace が true の場合、これらの各部分積分を計算した後、(1) このステップでのサブ区間の数、(2) 誤差errの現在の推定値、(3) 積分qの現在の推定値を表示します。
アルゴリズムの動作は、引数を quadgkペアとして渡すことで設定できます。有効なプロパティは次のとおりです。 "prop", val
AbsTol
求積法の絶対誤差許容値を定義します。デフォルトの絶対許容値は 1e-10 (単一の場合は 1e-5) です。
RelTol
求積法の相対誤差許容値を定義します。デフォルトの相対許容値は 1e-6 (単一の場合は 1e-4) です。
ArrayValued
trueに設定すると、関数fはスカラー入力に対して配列出力を生成します。デフォルトはfalseで、fは入力と同じサイズの出力を生成する必要があります。たとえば、
quadgk (@(x) x .^ (1:5), 0, 2, "ArrayValued", 1)
[x.^1, x.^2, x.^3, x.^4, x.^5]単一の匿名関数を繰り返し定義して の通常の呼び出しを使用するのではなく、 1 つの関数呼び出しに統合されますquadgk。
WayPoints
アルゴリズムのサブ区間の終点となる点を指定します。これにより、積分の誤差の推定が大幅に改善され、計算が高速化されます。また、その両方が可能になります。積分関数が急速に変化する領域の周りにサブ区間をさらに指定したり、関数の 1 次導関数に不連続性がある場所にフラグを付けたりすると便利です。たとえば、signum 関数は、 x == 0ウェイポイントを指定することで、およびで 不連続性があります。
quadgk (@(x) 符号 (x), -0.5, 1, "ウェイポイント", [0])
誤差範囲は 4e-7 から 1e-13 に減少します。
関数の積分領域内に特異点がある場合、それらはウェイポイントで対処されるべきではありません。代わりに、全体の積分をいくつかの小さな積分の合計に分解し、特異点が の呼び出しにおける積分境界の 1 つとして発生するようにする必要があります quadgk。
いずれかのウェイポイントが複雑な場合は、以下に示すように等高線積分が実行されます。
MaxIntervalCount
quadgk最初に、求積法を実行する区間を 10 区間に分割します。WayPoints が指定されている場合は、各ウェイポイントに分割します。許容できないエラーがあるサブ区間は、さらに分割され、再評価されます。サブ区間の数がいずれかの時点で 650 サブ区間を超えると、収束が不十分であることが通知され、積分の現在の推定値が返されます。このプロパティ"MaxIntervalCount"を使用して、終了する前に存在できるサブ区間の数を変更できます。
Trace
論理的に true の場合、quadgk各反復における求積法の収束に関する情報を出力します。
a、b、またはwaypointsのいずれかが複素数の場合、求積法は によって定義される区分線形パスに沿った等高線積分として扱われます 。この場合、積分にはエッジ特異点がないものとみなされます。たとえば、 [a, waypoints(1), waypoints(2), …, b]
quadgk (@(z) log (z), 1+1i, 1+1i, "WayPoints",
[-1+1i, -1-1i, +1-1i])
log (z)によって定義される正方形に沿って 積分します[1+1i, -1+1i, -1-1i, +1-1i]。
積分の結果はqに返されます。
err は積分における誤差のおおよその境界であり 、ここでI は積分の正確な値です。適応積分が収束しなかった場合、 errの値は要求された許容値よりも大きくなります。単一の出力のみが要求された場合、要求された許容値が満たされないと警告が発行されます。2 番目の出力errが要求された場合、警告は発行されず、結果が満足できるものであるかどうかを検査して判断するのはプログラマの責任となります。 abs (q - I)
参考文献: LF Shampine、 「MATLABでのベクトル化された適応求積法」、Journal of Computational and Applied Mathematics、pp. 131–140、Vol 211、Issue 2、2008 年 2 月。
See also: quad, quadv, quadl, quadcc, trapz, dblquad, triplequad, integral, integral2, integral3.
: q = quadcc (f, a, b)
: q = quadcc (f, a, b, tol)
: q = quadcc (f, a, b, tol, sing)
: [q, err, nr_points] = quadcc (…)
二重適応型クレンショウ・カーティス積分法を使用して、 aからbまでのfの積分を数値的に評価します。
fは関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。関数fはベクトル化されている必要があり、入力値のベクトルが与えられた場合は出力値のベクトルを返す必要があります。たとえば、
f = @(x) x .* sin (1./x) .* sqrt (abs (1 - x));
すべての演算子に対して要素ごとの「ドット」形式を使用します。
aとbは積分の下限と上限です。どちらかまたは両方の限界が無限大になる場合があります。 quadccは積分の変数を に代入して無限大の限界を処理しますx = tan (pi/2*u)。
オプションの引数tolは、結果の望ましい精度を指定する 1 要素または 2 要素のベクトルです。ベクトルの最初の要素は望ましい絶対許容値で、2 番目の要素は望ましい相対許容値です。相対テストのみを選択するには、絶対許容値を 0 に設定します。絶対テストのみを選択するには、相対許容値を 0 に設定します。デフォルトの絶対許容値は 1e-10 (シングルの場合は 1e-5) で、デフォルトの相対許容値は 1e-6 (シングルの場合は 1e-4) です。
オプション引数singには、積分区間内で被積分関数が既知の特異点、またはその導関数のいずれかに不連続点を持つ点のリストが含まれます。 x=1 で不連続点を持つ上記の例では、 の呼び出しはquadcc次のようになります。
整数 = quadcc (f, a, b, [], [ 1 ]);
積分の結果はqに返されます。
err は絶対積分誤差の推定値です。
nr_points は積分関数が評価されたポイントの数です。
適応積分が収束しなかった場合、 errの値は要求された許容値よりも大きくなります。単一の出力のみが要求された場合、要求された許容値が満たされないと警告が発行されます。2 番目の出力errが要求された場合、警告は発行されず、結果が満足できるものであるかどうかを検査して判断するのはプログラマーの責任となります。
quadccNaNは、またはなどの非数値の被積分関数を扱うことができますInf。積分が発散し、quadcc これを検出すると、警告が発行され、Infまたはが-Inf返されます。
注:quadccは汎用求積アルゴリズムであり、滑らかな、あるいは適切に動作する被積分関数に対しては、 などの他の方法よりも効率が悪い場合がありますquadgk。
このアルゴリズムは、各区間で次数が増加する Clenshaw-Curtis 積分法を使用し、関数が滑らかでない場合、または最大次数の規則に達した場合に区間を二分します。誤差推定は、それぞれの積分法規則のノード上の被積分関数の 2 つの連続した補間の差の L2 ノルムから計算されます。
参考文献: P. Gonnet、「明示的な補間を使用した適応求積法の信頼性の向上」、ACM Transactions on Mathematical Software、第 37 巻、第 3 号、記事番号 3、2010 年。
See also: quad, quadv, quadl, quadgk, trapz, dblquad, triplequad.
: q = integral (f, a, b)
: q = integral (f, a, b, prop, val, …)
: [q, err] = integral (…)
適応求積法を使用して、 aからbまでのfの積分を数値的に評価します。
integralは、 MATLABquadcc互換性を提供することを目的とした、 (一般的な実数値、スカラーの被積分関数と限界)、およびquadgk(指定された積分パスと配列値の被積分関数を持つ積分) のラッパーです 。さまざまな求積関数を直接呼び出すことで、数値積分をさらに制御できる場合があります。
fは、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。関数fはベクトル化される必要があり、入力値のベクトルが与えられたときに出力値のベクトルを返す必要があります。
aとbは積分の下限と上限です。いずれかまたは両方の限界が無限大であるか、または弱い端の特異点を含む場合があります。いずれかまたは両方の限界が複素数である場合、integral直線経路積分を実行します。または、オプションを使用して複素領域パスを指定することもできます"Waypoints"(以下を参照)。
追加のオプション パラメータはペアを使用して指定できます 。有効なプロパティは次のとおりです。 "property", value
Waypoints
求積法アルゴリズムのサブ区間を定義する際に使用するポイントを指定します。または、 a、b、またはウェイポイントが複素数の場合、求積法は区分的に連続したパスに沿った等高線積分として計算されます。詳細については、を参照してくださいquadgk。
ArrayValued
integralarrayvalued がtrue に指定されていない限り、 f はスカラー値を返すものと 想定します。このオプションにより、 は 配列全体にわたって積分を実行し、 fによって返されるのと同じ次元のqを返します。詳細については、 を参照してください。 integralquadgk
AbsTol
求積法の絶対誤差許容値を定義します。デフォルトの絶対許容値は 1e-10 (単一の場合は 1e-5) です。
RelTol
求積法の相対誤差許容値を定義します。デフォルトの相対許容値は 1e-6 (単一の場合は 1e-4) です。
オプションの出力err には、呼び出された積分器によって使用される絶対誤差推定値が含まれます。
適応求積法は、次の条件が満たされるまで誤差の推定値を最小化するために使用されます。
error <= max (AbsTol, RelTol*|q|).
既知のMATLAB の非互換性:
許容値が指定されず、積分限界またはウェイポイントが 型である場合single、Octave の積分関数は、上で指定されたデフォルトの絶対および相対誤差許容値を自動的に削減します。より厳しい許容値が必要な場合は、それを指定する必要があります。MATLAB はdouble 、積分限界のクラスに関係なく、入力 に適したより厳しい許容値をそのまま残します。
See also: integral2, integral3, quad, quadgk, quadv, quadl, quadcc, trapz, dblquad, triplequad.
場合によっては、関数がなく、積分を実行する生の (x, y) ポイントだけがあることがあります。これは、実験でデータを収集するときに発生することがあります。関数は、trapz次の例に示すように、これらの値を積分できます。この例では、「データ」が [0, pi/2) の範囲でコサイン関数で収集されています。
x = 0:0.1:pi/2; # Uniformly spaced points
y = cos (x);
trapz (x, y)
⇒ 0.99666
答えは 1 という正確な値にかなり近いです。通常の求積法は、積分関数の特性に敏感です。経験的積分は、積分関数だけでなく、関数を表すために選択された特定の点にも依存します。上記の例を [0, pi/2) の範囲の正弦関数で繰り返すと、はるかに劣った結果が生成されます。
x = 0:0.1:pi/2; # Uniformly spaced points
y = sin (x);
trapz (x, y)
⇒ 0.92849
ただし、データ ポイントの選択を少し変えるだけで、結果が大きく変わることがあります。同じ積分で、ポイントの数は同じでも、間隔を変えると、より正確な答えが得られます。
x = linspace (0, pi/2, 16); # Uniformly spaced, but including endpoint
y = sin (x);
trapz (x, y)
⇒ 0.99909
一般的に、事前にポイントの最適な分布を知る方法はありません。または、ポイントは、最適な分布を選択する自由がない実験から得られる可能性があります。いずれにしても、 を使用するときは、この問題を常に意識する必要がありますtrapz。
: q = trapz (y)
: q = trapz (x, y)
: q = trapz (…, dim)
台形法を使用して 点yの積分を数値的に評価します。
trapz (y)最初の非シングルトン次元に沿ってy の積分を計算します。引数xが省略された場合は、単位間隔 (1) を持つ 等間隔のxベクトルが想定されます。 xの間隔とyの値に関して積分を評価します。これは、 yの点が不均一にサンプリングされている場合に便利です。 trapz (x, y)
オプションのdim引数が指定されている場合は、この次元に沿って操作します。
アプリケーション ノート: xが指定されていない場合は、単位間隔が使用されます。積分を正しい値にスケーリングするには、実際の間隔値 (deltaX) を掛ける必要があります。たとえば、 範囲 [0, 1] でのx^3の積分はx^4/4または 0.25 です。次のコードでは、を使用して trapz3 つの異なる方法で積分を計算します。
x = 0:0.1:1; y = x.^3; ## No scaling q = trapz (y) ⇒ q = 2.5250 ## Approximation to integral by scaling q * 0.1 ⇒ 0.25250 ## Same result by specifying x trapz (x, y) ⇒ 0.25250
See also: cumtrapz.
: q = cumtrapz (y)
: q = cumtrapz (x, y)
: q = cumtrapz (…, dim)
台形法を使用した 点yの累積数値積分。
cumtrapz (y) 最初の非シングルトン次元に沿ってy の累積積分を計算します。 はtrapz全体の積分値のみを報告し、 はycumtrapzの各ポイントにおける現在の部分和の値を報告します。
引数xが省略された場合は、単位間隔(1)を持つ 等間隔のxベクトルが想定されます。 xの間隔とyの値 に関して積分を評価します。これは、 yの点が不均一にサンプリングされている 場合に便利です。cumtrapz (x, y)
オプションのdim引数が指定されている場合は、この次元に沿って操作します。
アプリケーション ノート: xが指定されていない場合は、単位間隔が使用されます。積分を正しい値にスケーリングするには、実際の間隔値 (deltaX) を掛ける必要があります。cumtrapz (y) 最初の非シングルトン次元に沿ってy の累積積分を計算します。 はtrapz全体の積分値のみを報告し、 はycumtrapzの各ポイントにおける現在の部分和の値を報告します。
引数xが省略された場合は、単位間隔(1)を持つ 等間隔のxベクトルが想定されます。 xの間隔とyの値 に関して積分を評価します。これは、 yの点が不均一にサンプリングされている 場合に便利です。cumtrapz (x, y)
オプションのdim引数が指定されている場合は、この次元に沿って操作します。
アプリケーション ノート: xが指定されていない場合は、単位間隔が使用されます。積分を正しい値にスケーリングするには、実際の間隔値 (deltaX) を掛ける必要があります。
See also: trapz, cumsum.