|
◆ qawo_r()
void qawo_r |
( |
double |
a, |
|
|
double |
b, |
|
|
double |
omega, |
|
|
int |
integr, |
|
|
double |
epsabs, |
|
|
double |
epsrel, |
|
|
int |
limit, |
|
|
int |
maxp1, |
|
|
double * |
result, |
|
|
double * |
abserr, |
|
|
int * |
neval, |
|
|
int * |
last, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int |
iwork[], |
|
|
int |
liwork, |
|
|
int * |
info, |
|
|
double * |
xx, |
|
|
double |
yy, |
|
|
int * |
irev |
|
) |
| |
有限区間の積分 (適応自動積分) (振動型関数) (25点クレンショー・カーチス公式および15点ガウス・クロンロッド則) (リバースコミュニケーション版)
- 目的
- 本ルーチンは要求精度を満たす I = [a, b]におけるf(x)*w(x)の積分 を求める. ただし, 重み関数 w(x) = cos(ω*x) または sin(ω*x) である.
25点修正クレンショー・カーチス則および15点ガウス・クロンロッド則を使用し, 要求精度を満足するように適応自動積分を行う.
- 引数
-
[in] | a | 積分区間の下限. |
[in] | b | 積分区間の上限. |
[in] | omega | 重み関数のパラメータ ω. |
[in] | integr | 重み関数を指定する.
= 1: w(x) = cos(ω*x)
= 2: w(x) = sin(ω*x) |
[in] | epsabs | 要求絶対誤差.
abserr <= max(epsabs, epsrel*|result|) であれば要求精度を満足したものとする. |
[in] | epsrel | 要求相対誤差.
abserr <= max(epsabs, epsrel*|result|) であれば要求精度を満足したものとする.
epsabs <= 0 かつ epsrel < 50*eps であれば, epsrel = 50*eps とみなす(epsはマシンイプシロン). |
[in] | limit | 積分区間[a, b]を分割する部分区間の最大数. (limit >= 1) |
[in] | maxp1 | チェビシェフモーメント数の上限. (maxp1 >= 1)
長さが abs(b-a)*2^(-L) の区間について L = 0, 1, ..., maxp1-2. |
[out] | result | 求められた I = [a, b]における f(x)*w(x) の積分値. |
[out] | abserr | 絶対誤差の推定値. 真の誤差に等しいかそれより大きい. |
[out] | neval | 被積分関数の評価回数. |
[out] | last | 分割により作り出された部分区間数. |
[out] | work[] | 配列 work[lwork]
作業領域.
work[0], ..., work[last-1]: [a, b]を分割する部分区間の左端点.
work[limit], ..., work[limit+last-1]: 部分区間の右端点.
work[2*limit], ..., work[2*limit+last-1]: 部分区間の積分値.
work[3*limit], ..., work[3*limit+last-1]: 部分区間の誤差推定値.
work[4*limit], ..., work[4*limit+25*maxp1-1]: チェビシェフモーメントの格納場所. |
[in] | lwork | 配列 work[]のサイズ. (lwork >= 4*limit + 25*maxp1) |
[out] | iwork[] | 配列 iwork[liwork] (liwork >= limit)
作業領域.
最初のk要素は部分区間の誤差推定値へのポインタで, work[3*limit+iwork[0]-1], ..., work[3*limit+iwork[k-1]-1] は降順に並ぶ. last <= limit/2+2 であれば k = last, その他の場合には k = limit+1-last である.
iwork[limit], ..., iwork[limit+last-1] は部分区間の分割レベルを示す. iwork[limit+i-1] = L であれば, i番目の部分区間の長さは abs(b-a)*2^(1-L) である. |
[in] | liwork | 配列 iwork[]のサイズ. (liwork >= 2*limit) |
[out] | info | = 0: 正常終了
= -4: 入力パラメータ integr の誤り (integr != 1 かつ integr != 2)
= -7: 入力パラメータ limit の誤り (limit < 1)
= -8: 入力パラメータ maxp1 の誤り (maxp1 < 1)
= -14: 入力パラメータ lwork の誤り (lwork < 4*limit + 25*maxp1)
= -16: 入力パラメータ liwork の誤り (liwork < 2*limit)
= 1: 部分区間数が最大分割数に達した
= 2: 丸め誤差のため要求精度が達成できない
= 3: 積分区間内において被積分関数の挙動が悪い点があった
= 4: 外挿テーブルの丸め誤差のためにアルゴリズムが収束しない
= 5: 積分が発散している, または, 収束が遅い |
[out] | xx | irev = 1〜30: 再呼び出し時に関数値を求めるべき点を返す. |
[in] | yy | irev = 1〜30: 再呼び出し時に関数値f(xx)を与えること. |
[in,out] | irev | リバースコミュニケーションの制御変数.
[in] 最初の呼び出し時に 0 に設定しておくこと. 2回目以降の呼び出し時には値を変更してはならない.
[out] 0 以外の場合, 下記処理を行いirevを変更せずに再び本ルーチンを呼び出すこと.
= 0: 処理終了.
= 1〜30: xxにおける関数値を求めyyに設定する. yy以外の変数を変更してはならない. |
- 出典
- SLATEC (QUADPACK)
|