int3d 求積法および立体求積法により3次元積分を定義

## 呼び出し手順

                [result, err] = int3d(X, Y, Z, f)
                [result, err] = int3d(X, Y, Z, f, nf)
                [result, err] = int3d(X, Y, Z, f, nf, params)

## 引数

X

  `NUMTET`個の4面体の頂点の横座標軸の値を有する 4行`NUMTET`列の配列

Y

  `NUMTET`個の4面体の頂点の縦座標軸の値を有する 4行`NUMTET`列の配列

Z

  `NUMTET`個の4面体の頂点の第三座標軸の値を有する 4行`NUMTET`列の配列

f

  被積分関数 `f(xyz,nf)`を定義する 外部 (関数またはリストまたは文字列) , ただし `xyz` は点の座標のベクトル, nf は関数の数

nf

  成分する関数の数 (デフォルトは 1)

params

  実数ベクトル `[minpts, maxpts, epsabs, epsrel]` .デフォルト値は `[0, 1000, 0.0, 1.d-5]` .

  epsabs

    絶対誤差の指定値.

  epsrel

    相対誤差の指定値.

  minpts

    関数評価の最小値.

  maxpts

    関数評価の最大値. 各サブ領域における関数評価の最大値は 43 回です

result

  積分値,または積分値のベクトル.

err

  絶対誤差の推定値.

## 説明

この関数は指定したベクトルの定積分に関する近似値を計算します.

    I  I  I (F ,F ,...,F )      dx(3)dx(2)dx(1),
              1  2      numfun

ただし,積分区間は NUMTET個の4面体で以下のように定義されます

    F = F (X(1),X(2),X(3)), J = 1,2,...,NUMFUN.
     J   J

近似値`result(k)` を計算する際に, I の各要素が以下の精度指標を満たすことが期待されるような グローバルな適用型ストラテジが適用されます: `ABS(I(K)-RESULT(K))<=MAX(EPSABS,EPSREL*ABS(I(K)))`

`int3d` は, 推定誤差が最大となる4面体を分割し, 積分値と誤差を分割後の新しい4面体で積分値と誤差を評価し続ける処理を 指定された誤差を満たすか, `MAXPTS`回の関数評価が行われるまで反復します.

すべての点が4面体の内側となる43 点の積分則が 適用されます.この積分則は8次の多項式を有します.

入力パラメータ `EPSABS` または `EPSREL` として十分に大きな値が選択された場合, ある積分則が複数の各4面体をまたがって適用され, その結果の合算値が近似値`RESULT(K)`を計算する際に使用 されます.この場合,4面体の更なる分割は行われません.

`int3d` が積分値ベクトルの指定値を計算する場合, ベクトルの全要素に同じ処理が行われます.

`j` と `k`が等しくない `I(Fj)` および `I(Fk)` が積分区間の同じ分割領域で積分されます. 十分な類似性がある積分の場合, `int3d`を1回のコールですべての被積分関数に 適用することで時間を節約することができます. なんらかのパラメータの関数として積分値が変化する場合, すべての要素に同じ分割が適用されるとすると， `int3d`により計算される推定値も これは,異なる要素に指定した処理の適用が指定される場合には あてはまりません.

一方, 積分の異なる要素が明確に異なる分割を必要とする場合には この機能を注意して使用する必要があります.

## 参考

Fortran ルーチン dcutet.f

## 例

    X = [0;1;0;0];
    Y = [0;0;1;0];
    Z = [0;0;0;1];
    [RESULT, ERROR] = int3d(X, Y, Z, 'int3dex')
    // computes the integrand exp(x*x+y*y+z*z) over the
    //tetrahedron (0.,0.,0.),(1.,0.,0.),(0.,1.,0.),(0.,0.,1.)

    //integration over a cube  -1<=x<=1;-1<=y<=1;-1<=z<=1

    //  bottom  -top-     right    -left-   front   -rear-
    X =[0, 0,    0, 0,    0, 0,    0, 0,    0, 0,    0, 0;
       -1,-1,   -1,-1,    1, 1,   -1,-1,   -1,-1,   -1,-1;
        1,-1,    1,-1,    1, 1,   -1,-1,    1,-1,    1,-1;
        1, 1,    1, 1,    1, 1,   -1,-1,    1, 1,    1, 1];
    Y =[0, 0,    0, 0,    0, 0,    0, 0,    0, 0,    0, 0;
       -1,-1,   -1,-1,   -1, 1,   -1, 1,   -1,-1,    1, 1;
       -1, 1,   -1, 1,    1, 1,    1, 1,   -1,-1,    1, 1;
        1, 1,    1, 1,   -1,-1,   -1,-1,   -1,-1,    1, 1];
    Z =[0, 0,    0, 0,    0, 0,    0, 0,    0, 0,    0, 0;
       -1,-1,    1, 1,   -1, 1,   -1, 1,   -1,-1,   -1,-1;
       -1,-1,    1, 1,   -1,-1,   -1,-1,   -1, 1,   -1, 1;
       -1,-1,    1, 1,    1, 1,    1, 1,    1, 1,    1, 1];

    function v = f(xyz,numfun), v=exp(xyz'*xyz), endfunction
    [result, err] = int3d(X, Y, Z, f, 1, [0,100000,1.d-5,1.d-7])

    function v = f(xyz, numfun), v=1, endfunction
    [result, err] = int3d(X, Y, Z, f, 1, [0,100000,1.d-5,1.d-7])

## 参照

- intc
- intl
- int2d