[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

# 19. Integration

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 19.1 Introduction to Integration

Maximaは積分を扱うためのいくつかのルーチンを持っています。 `integrate`関数はそれらのほとんどを利用します。 指定されていない関数（ともちろんその導関数）を扱う `antid`パッケージもあります。 数値目的のためには `quad_qag`, `quad_qags`などと名付けられた QUADPACKから適応積分器一式があります。 それらは見出し `QUADPACK`の下で記述されています。 超幾何関数を扱うことができます。詳細は `specint`を参照してください。 一般的に言って、Maximaは「初等関数」（有理関数、三角関数、対数、指数関数、根号など）と ２、３の拡張（誤差関数、二重対数関数）を使った積分可能な積分だけを扱います。 `g(x)`や `h(x)`といった未知の関数を使った積分は扱いません。

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 19.2 Functions and Variables for Integration

関数: changevar (expr, f(x,y), y, x)

  xに関する積分を含む exprの中に現れるすべての積分に関して、 `f(x,y) = 0`で与えられる変数変換を生成します。 新しい変数は yです。

      (%i1) assume(a > 0)$
      (%i2) 'integrate (%e**sqrt(a*y), y, 0, 4);
                            4
                           /
                           [    sqrt(a) sqrt(y)
      (%o2)                I  %e                dy
                           ]
                           /
                            0
      (%i3) changevar (%, y-z^2/a, z, y);
                            0
                           /
                           [                abs(z)
                         2 I            z %e       dz
                           ]
                           /
                            - 2 sqrt(a)
      (%o3)            - ----------------------------
                                      a

  上の `'integrate`の例のような名詞形を含む式は `nouns`フラグを使って `ev`で評価できます。 例えば、上の`changevar`が返す式は `ev (%o3, nouns)`で評価できます。

  `changevar`は和や積のインデックスに関する変更にも使えます。 しかし、 変更が和や積の中でなされる時 この変更はシフトすなわち `i = j+ ...` でなければならず、高階関数ではないことをはっきり理解しなければいけません。 例えば、

      (%i4) sum (a[i]*x^(i-2), i, 0, inf);
                               inf
                               ====
                               \         i - 2
      (%o4)                     >    a  x
                               /      i
                               ====
                               i = 0
      (%i5) changevar (%, i-2-n, n, i);
                              inf
                              ====
                              \               n
      (%o5)                    >      a      x
                              /        n + 2
                              ====
                              n = - 2

  ·

  Categories: Integral calculus

関数: dblint (f, r, s, a, b)

  二重積分ルーチン。トップレベル Maximaで書かれ、翻訳され機械語にコンパイルされました。 このパッケージをアクセスするには `load (dblint)`を使ってください。 以下を計算するため xとy方向に関してシンプソンの規則方法を使います。

      /b /s(x)
      |  |
      |  |    f(x,y) dy dx
      |  |
      /a /r(x)

  関数 fは翻訳かコンパイルされた2変数関数でなければいけなく、 rと sはそれぞれ、翻訳かコンパイルされた1変数関数でなければいけません。 一方で aと bは浮動小数点数でなければいけません。 ルーチンは xと yの区間の分割の数を決める２つのグローバル変数を持ちます: `dblint_x`と `dblint_y`。 両方とも初期は10で、他の整数値に独立に変えることができます。 （x方向に計算される `2*dblint_x+1`点があり、 y方向に計算される `2*dblint_y+1`点があります） ルーチンはX軸を更に分割します。 Xのそれぞれの値に関して、最初、 `r(x)`と `s(x)`を計算します; そして `r(x)`と `s(x)`の間でY軸が更に分割され、 シンプソン規則を使ってY軸に沿っての積分が実行されます; そして、 シンプソン規則を使って Y積分である関数値を用いて X軸に沿っての積分が実行されます; この手続きは様々な理由のため数値的に不安定かもしれませんが、 かなり速いです: 非常に振動的な関数や特異点（領域内の極や分岐点）を持つ関数にこれを使うことは避けてください。 Y積分は `r(x)`と `s(x)`がどこくらい離れているかに依存します。 だからもし距離 `s(x) - r(x)`が Xに関して急速に変化するなら、 様々な Y積分で異なるステップサイズでの切り詰めから起こる本質的なエラーがあるかもしれません。 領域の範囲を改善するために `dblint_x`と `dblint_y`を増やすことができますが、 計算時間という犠牲を払うことになります。 関数値を保存しないので、関数が非常に時間がかかるものの場合、 もし何か変えたら再計算を待たなければいけません（すいません）。 関数 f, r, sは `dblint`コールの前に翻訳かコンパイルされるかどちらかが要求されます。 これは多くの場合、インタープリタコードに対して桁違いの速度改善がなされるでしょう！

  `demo (dblint)`は 実例問題に適用された `dblint`のデモンストレーションを実行します。

  ·

  Categories: Integral calculus

関数: defint (expr, x, a, b)

  定積分を計算しようとします。 `integrate`は、 積分の範囲が指定された時、 すなわち `integrate`が `integrate (expr, x, a, b)`としてコールされた時、 `defint`をコールします。

  このようにユーザーの観点からは `integrate`をコールすれば十分です。

  `defint`はシンボリック式、計算された積分または積分の名詞形を返します。 定積分の数値近似に関しては `quad_qag`と関連関数を参照してください。

  ·

  Categories: Integral calculus

オプション変数: erfflag

  デフォルト値: `true`

  `erfflag`が `false`の時、 もし始めから被積分に何もないなら (if there were none in the integrad to begin with) `risch`が答えの中に `erf`関数を導入することを抑制します。

  ·

  Categories: Integral calculus

関数: ilt (expr, s, t)

  exprの sとパラメータ tに関する逆ラプラス変換を計算します。 exprは分子が線形２次因子だけを持つ多項式の比でなければいけません。 `solve`か `linsolve`と合わせて 関数 `laplace`や `ilt`を使うことによって ユーザーは微分方程式または畳み込み積分方程式やそれらの組を解くことができます。

      (%i1) 'integrate (sinh(a*x)*f(t-x), x, 0, t) + b*f(t) = t**2;
                    t
                   /
                   [                                    2
      (%o1)        I  f(t - x) sinh(a x) dx + b f(t) = t
                   ]
                   /
                    0
      (%i2) laplace (%, t, s);
                                     a laplace(f(t), t, s)   2
      (%o2)  b laplace(f(t), t, s) + --------------------- = --
                                             2    2           3
                                            s  - a           s
      (%i3) linsolve ([%], ['laplace(f(t), t, s)]);
                                              2      2
                                           2 s  - 2 a
      (%o3)     [laplace(f(t), t, s) = --------------------]
                                          5         2     3
                                       b s  + (a - a  b) s
      (%i4) ilt (rhs (first (%)), s, t);
      Is  a b (a b - 1)  positive, negative, or zero?

      pos;
                     sqrt(a b (a b - 1)) t
              2 cosh(---------------------)       2
                               b               a t
      (%o4) - ----------------------------- + -------
                    3  2      2               a b - 1
                   a  b  - 2 a  b + a

                                                             2
                                                   + ------------------
                                                      3  2      2
                                                     a  b  - 2 a  b + a

  ·

  Categories: Laplace transform

オプション変数: intanalysis

  デフォルト値: `true`

  `true`の時、定積分が積分区間内の被積分関数の極を見つけようとします。 もしあるなら、積分は主値積分として適切に評価されます。 もしintanalysisが `false`なら、 このチェックは実行されず積分は極がないことを仮定して実行されます。

  `ldefint`も参照してください。

  例:

  `intanalysis`が `false`に設定されている時 Maximaは以下の積分を解くことができます:

      (%i1) integrate(1/(sqrt(x)+1),x,0,1);
                                      1
                                     /
                                     [       1
      (%o1)                          I  ----------- dx
                                     ]  sqrt(x) + 1
                                     /
                                      0

      (%i2) integrate(1/(sqrt(x)+1),x,0,1),intanalysis:false;
      (%o2)                            2 - 2 log(2)

      (%i3) integrate(cos(a)/sqrt((tan(a))^2 +1),a,-%pi/2,%pi/2);
      The number 1 isn't in the domain of atanh
       -- an error. To debug this try: debugmode(true);

      (%i4) intanalysis:false$
      (%i5) integrate(cos(a)/sqrt((tan(a))^2+1),a,-%pi/2,%pi/2);
                                            %pi
      (%o5)                                 ---
                                             2

  ·

  Categories: Integral calculus

関数: integrate (expr, x)
関数: integrate (expr, x, a, b)

  xに関する exprの積分をシンボリックに計算しようとします。 `integrate (expr, x)`は不定積分で、 `integrate (expr, x, a, b)`は a,bの上限下限を持つ定積分です。 上限下限は xを含んではいけません。 しかし `integrate`はこの制限を強制するわけではありません。 aは bより小さい必要はありません。 bが aと等しいなら `integrate`は0を返します。

  定積分の数値近似に関しては `quad_qag`と関連関数を参照してください。 （複素積分）留数の計算に関しては `residue`を参照してください。 不定積分の代替計算方法に関しては `antid`を参照してください。

  `integrate`が成功したら積分（`integrate`を含まない式）を返します。 そうでないなら、積分の名詞形式（クォートされた演算子 `'integrate`)もしくは１つ以上の名詞形式を含む式を返します。 `integrate`の名詞形式は積分記号で表示されます。

  いくつかの環境では、例えば `'integrate (expr, x)`のような シングルクオートされた`integrate`で手動で名詞形式を構成することが役に立ちます。 例えば、積分はまだ計算されていないいくつかのパラメータに依存しているかもしれません。 `ev (i, nouns)`を使って積分の名詞をその引数に利用することができます。 ここで iは問題の名詞形式です。 (The noun may be applied to its arguments by `ev (i, nouns)` where i is the noun form of interest.) `integrate`は不定積分とは別に定積分を扱います。 それぞれの場合を扱うため ある範囲の発見法を用意しています。 定積分の特別な場合は 0や無限大に等しい積分の下限上限を含んだり、 0や`%pi`や`2 %pi`に等しい下限上限を持つ三角関数を含んだり、 有理関数やベータやプサイ関数の定義に関連した積分やいくつかの対数的な積分、三角関数積分を含んだりします。 有理関数の処理は留数の計算を含むかもしれません。 もし適用可能な特殊な場合が見つからないなら 不定積分を計算し下限上限でそれを評価しようとするでしょう。 これは下限上限に無限大の極限を取ることを含みます。 `ldefint`も参照してください。

  不定積分の特殊な場合は三角関数、指数対数関数、有理関数を含みます。 `integrate`は初等積分の短いテーブルもまた利用しています。

  もし非積分関数が形式 `f(g(x)) * diff(g(x), x)`を持つなら `integrate`は変数の交換を実行します。 `integrate`は `g(x)`の導関数が非積分関数を割るような部分式 `g(x)`を見つけようとします。 この探索は `gradef`関数が定義した導関数を利用します。 `changevar`や `antid`も参照ください。

  もしこれまでの発見法のどれも不定積分を見つけられないなら リッシュのアルゴリズムを実行します。 フラグ `risch`が `ev`のコールやコマンドライン上で `evflag`として設定されるかもしれません。 例えば `ev (integrate (expr, x), risch)`や `integrate (expr, x), risch`というようにです。 もし `risch`が `true`なら `integrate`は発見法を最初に試さずに `risch`関数をコールします。 `risch`も参照ください。

  `integrate`は `f(x)`記法で明示的に表現された関数関係に対してだけ機能します。 `integrate`は `depends`関数が規定した陰の依存性を考慮しません。

  `integrate`は非積分関数のパラメータのある性質を知っている必要がある場合があります。 `integrate`は `assume`データベースを最初に参照し、 注目の変数がそこにないなら `integrate`はユーザーに問い合わせます。 質問に依存して、適切な応答は `yes;`や`no;`, `pos;`, `zero;`, `neg;`などです。

  `integrate`は線形には宣言されていません。 `declare`と `linear`を参照ください。

  `integrate`は２、３の特集な場合だけ、部分積分を企てます。

  例:

  - 初等不定積分、定積分

        (%i1) integrate (sin(x)^3, x);
                                   3
                                cos (x)
        (%o1)                   ------- - cos(x)
                                   3
        (%i2) integrate (x/ sqrt (b^2 - x^2), x);
                                         2    2
        (%o2)                    - sqrt(b  - x )
        (%i3) integrate (cos(x)^2 * exp(x), x, 0, %pi);
                                       %pi
                                   3 %e      3
        (%o3)                      ------- - -
                                      5      5
        (%i4) integrate (x^2 * exp(-x^2), x, minf, inf);
                                    sqrt(%pi)
        (%o4)                       ---------
                                        2

  - `assume`と対話的問い合わせの利用

        (%i1) assume (a > 1)$
        (%i2) integrate (x**a/(x+1)**(5/2), x, 0, inf);
            2 a + 2
        Is  -------  an integer?
               5

        no;
        Is  2 a - 3  positive, negative, or zero?

        neg;
                                           3
        (%o2)                  beta(a + 1, - - a)
                                           2

  - 変数変換。この例では２回変数変換があります。 `gradef`が規定した導関数を使ったものと未知関数 `r(x)`の微分 `diff(r(x))`を使ったもの。

        (%i3) gradef (q(x), sin(x**2));
        (%o3)                         q(x)
        (%i4) diff (log (q (r (x))), x);
                              d               2
                             (-- (r(x))) sin(r (x))
                              dx
        (%o4)                ----------------------
                                    q(r(x))
        (%i5) integrate (%, x);
        (%o5)                     log(q(r(x)))

  - `'integrate`名詞形を含む戻り値。 この例では Maximaは有理関数の分母の因子1つを抽出できますが、 残りを因数分解できず、いずれにせよ積分を見つけられません。 `grind`は結果の中に名詞形 `'integrate`を出力します。 積分や有理関数について更に知るには `integrate_use_rootsof`も参照ください。

        (%i1) expand ((x-4) * (x^3+2*x+1));
                            4      3      2
        (%o1)              x  - 4 x  + 2 x  - 7 x - 4
        (%i2) integrate (1/%, x);
                                      /  2
                                      [ x  + 4 x + 18
                                      I ------------- dx
                                      ]  3
                         log(x - 4)   / x  + 2 x + 1
        (%o2)            ---------- - ------------------
                             73               73
        (%i3) grind (%);
        log(x-4)/73-('integrate((x^2+4*x+18)/(x^3+2*x+1),x))/73$

  - 積分を使った関数の定義。 関数の本体は関数を定義する時には評価されません。 この例では `f_1`の本体が `integrate`の名詞形を含みます。 クォートクォート演算子`''`があると積分が評価され、その結果が `f_2`の本体になります。

        (%i1) f_1 (a) := integrate (x^3, x, 1, a);
                                             3
        (%o1)           f_1(a) := integrate(x , x, 1, a)
        (%i2) ev (f_1 (7), nouns);
        (%o2)                          600
        (%i3) /* Note parentheses around integrate(...) here */
              f_2 (a) := ''(integrate (x^3, x, 1, a));
                                           4
                                          a    1
        (%o3)                   f_2(a) := -- - -
                                          4    4
        (%i4) f_2 (7);
        (%o4)                          600

  ·

  Categories: Integral calculus

システム変数: integration_constant

  デフォルト値: `%c`

  等式の不定積分が積分定数を導入し、 `integration_constant`と `integration_constant_counter`を連結することで定数名を構成します。

  `integration_constant`には任意のシンボルに割り当てられます。

  例:

      (%i1) integrate (x^2 = 1, x);
                                 3
                                x
      (%o1)                     -- = x + %c1
                                3
      (%i2) integration_constant : 'k;
      (%o2)                           k
      (%i3) integrate (x^2 = 1, x);
                                  3
                                 x
      (%o3)                      -- = x + k2
                                 3

  ·

  Categories: Integral calculus

システム変数: integration_constant_counter

  デフォルト値: 0

  等式の不定積分が積分定数を導入する時、 `integration_constant`と `integration_constant_counter`を連結することで定数を構成します。

  `integration_constant_counter`は次の積分定数を構成する前に増分されます。

  例:

      (%i1) integrate (x^2 = 1, x);
                                 3
                                x
      (%o1)                     -- = x + %c1
                                3
      (%i2) integrate (x^2 = 1, x);
                                 3
                                x
      (%o2)                     -- = x + %c2
                                3
      (%i3) integrate (x^2 = 1, x);
                                 3
                                x
      (%o3)                     -- = x + %c3
                                3
      (%i4) reset (integration_constant_counter);
      (%o4)            [integration_constant_counter]
      (%i5) integrate (x^2 = 1, x);
                                 3
                                x
      (%o5)                     -- = x + %c1
                                3

  ·

  Categories: Integral calculus

オプション変数: integrate_use_rootsof

  デフォルト値: `false`

  `integrate_use_rootsof`が `true`でかつ有理関数の分子が因数分解できない時、 `integrate`は分子の（まだ知られていない）根上の和という形式で積分を返します。

  例えば `integrate_use_rootsof`を `false`に設定すると、 `integrate`は有理関数の未解決積分を名詞形で返します:

      (%i1) integrate_use_rootsof: false$
      (%i2) integrate (1/(1+x+x^5), x);
              /  2
              [ x  - 4 x + 5
              I ------------ dx                            2 x + 1
              ]  3    2                2            5 atan(-------)
              / x  - x  + 1       log(x  + x + 1)          sqrt(3)
      (%o2)   ----------------- - --------------- + ---------------
                      7                 14             7 sqrt(3)

  さあ、フラグを `true`に設定し、 積分の未解決部分を有理関数の分子の根上の和として表現しましょう:

      (%i3) integrate_use_rootsof: true$
      (%i4) integrate (1/(1+x+x^5), x);
            ====        2
            \       (%r4  - 4 %r4 + 5) log(x - %r4)
             >      -------------------------------
            /                    2
            ====            3 %r4  - 2 %r4
                            3    2
            %r4 in rootsof(x  - x  + 1)
      (%o4) ----------------------------------------------------------
                     7

                                                            2 x + 1
                                        2            5 atan(-------)
                                   log(x  + x + 1)          sqrt(3)
                                 - --------------- + ---------------
                                         14             7 sqrt(3)

  代わりにユーザーは別々に分子の根を計算できます。 例えば、もし分子が3次多項式なら `1/((x - a)*(x - b)*(x - c))`とか `1/((x^2 - (a+b)*x + a*b)*(x - c))`というように これらの根を使って被積分関数を表現できます。 これは時々 Maximaがもっと役立つ結果を得るのを助けます。

  ·

  Categories: Integral calculus

関数: ldefint (expr, x, a, b)

  exprの xに関する不定積分を上限 bと下限 aで評価するために、 `limit`を使って exprの定積分を計算しようとします。 もし定積分を計算するのに失敗したなら、 `ldefint`は名詞形として極限を含む式を返します。

  `ldefint`は `integrate`からコールされません。 なので、 `ldefint (expr, x, a, b)` を実行することは `integrate (expr, x, a, b)` とは違った結果をもたらすかもしれません。 `ldefint`は定積分を評価するためにいつも同じ方法を使いますが、 `integrate`は様々な発見的方法を利用し、いくつかの特殊な場合を認識することもあります。

  ·

  Categories: Integral calculus

関数: potential (givengradient)

  計算にはグローバル変数`potentialzeroloc[0]`を利用します。 それは `nonlist`か形式

      [indeterminatej=expressionj, indeterminatek=expressionk, ...]

  でなければいけません。 ここで前者 (`nonlist`)は後者(リスト形式)の中の右辺すべてに関して nonlist式とすることと同値です。 示された右辺は積分の下限として使われます。 積分が成功するかどうかはそれらの値と順序に依存するかもしれません。 `potentialzeroloc`は0に初期化されます。

関数: residue (expr, z, z_0)

  変数 zが値 z_0を仮定する時、 式 exprの複素平面での留数を計算します。 留数は exprのローラン級数における `(z - z_0)^(-1)`の係数です。

      (%i1) residue (s/(s**2+a**2), s, a*%i);
                                      1
      (%o1)                           -
                                      2
      (%i2) residue (sin(a*x)/x**4, x, 0);
                                       3
                                      a
      (%o2)                         - --
                                      6

  ·

  Categories: Integral calculus ·Complex variables

関数: risch (expr, x)

  リッシュアルゴリズムの超越な場合を使って exprを xに関して積分します。 （リッシュアルゴリズムの代数的な場合は実装されていません。） これは現在、 `integrate`の主要部が対応できない入れ子の指数関数や対数関数の場合を扱います。 `integrate`は、これらの場合が与えられたなら自動的に `risch`を適用します。

  `erfflag`を `false`にすると、 もしそもそも被積分関数になにもないなら、 `risch`が答えの中に `erf`関数を導入することを抑制します。

      (%i1) risch (x^2*erf(x), x);
                                                              2
                   3                      2                - x
              %pi x  erf(x) + (sqrt(%pi) x  + sqrt(%pi)) %e
      (%o1)   -------------------------------------------------
                                    3 %pi
      (%i2) diff(%, x), ratsimp;
                                   2
      (%o2)                       x  erf(x)

  ·

  Categories: Integral calculus

関数: tldefint (expr, x, a, b)

  `tlimswitch`が `true`に設定されている `ldefint`と同値です。

  ·

  Categories: Integral calculus

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 19.3 Introduction to QUADPACK

QUADPACKは１次元定積分の数値計算のための関数のコレクションです。 R. Piessens (1), E. de Doncker (2), C. Ueberhuber (3), D. Kahaner (4). の合同プロジェクトから始まりました。

Maximaに含まれる QUADPACKライブラリは、 SLATEC共通数学ライブラリ バージョン 4.1(5)に現れる QUADPACKの Fortranのソースコードの(プログラム`f2cl`による)自動翻訳です。

SLATECライブラリは1993年7月付ですが、QUADPACK関数は何年か前に書かれました。 QUADPACKももう１つのバージョンが Netlib (6)にあります; このバージョンが SLATECバージョンとどう違うのかはっきりしません。

Maximaに含まれる QUADPACK関数は、 これらの関数が不特定の回数の関数の評価を要求し、 指定された精度まで結果を計算しようとする意味で、 すべて自動です。 Maximaの QUADPACKの Lisp翻訳はいくつかの自動でない関数も含みますが、 それらは Maximaレベルで公開されていません。

QUADPACKについての更なる情報は QUADPACK本 (7) の中に見つけることができます。

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

### 19.3.1 Overview

`quad_qag`

  一般関数の有限の区間上の積分。 `quad_qag`は Aind(Piessens, 1973)の戦略を使った簡単な大域的適応積分器を実装しています。 呼び出し側はルール評価コンポーネントを ガウスークロンロッドの求積公式の6つのペアの中から選ぶことができます。 強く振動する非積分関数には高次のルールが適切です。

`quad_qags`

  一般関数の有限の区間上の積分。 `quad_qags`はイプシロンアルゴリズム(Wynn, 1956)による外挿 (de Doncker,1978)を使った大域的適応積分器を実装しています。

`quad_qagi`

  一般関数の無限のもしくは半無限の区間上の積分。 区間を有限の区間上に写像し、 `quad_qags`の中で使うのと同じ戦略を適用します。

`quad_qawo`

  cos(omega x) f(x) や sin(omega x) f(x) の有限の区間上の積分。 ここで、 omega は定数です。 規則評価構成要素は変形 Clenshaw-Curtis手法に基づいています。 `quad_qawo`は `quad_qags`に似て、外挿とともに適応再分割を適用します。

`quad_qawf`

  フーリエコサイン変換かフーリエサイン変換を半無限区間上で計算します。 `quad_qawo`で使うのと同じアプローチを連続する区間に適用し、 イプシロンアルゴリズム(Wynn, 1956)を使った収束の促進を積分寄与の級数に適用します。

`quad_qaws`

  w(x) f(x) の有限区間 [a, b] 上の積分。 ここで、 w は形式 (x - a)^alpha (b - x)^beta v(x) の関数で、 v(x) は、 1, log(x - a), log(b - x), log(x - a) log(b - x) のいずれかであり、 alpha > -1 かつ beta > -1 です。

  大域的適応再分割戦略を適用し、 aか bを含む部分区間上では変形 Clenshaw-Curtis積分を使います。

`quad_qawc`

  f(x)/(x - c)のコーシーの主値を有限の区間 (a, b)上で指定された cを用いて計算します。 戦略は大域的適応的で、 点 x = cを含む部分範囲上で変形 Clenshaw-Curtis積分を使います。

`quad_qagp`

  基本的に `quad_qags`と同様ですが、被積分関数の特異点や不連続点を 提供しなければいけません。 これは積分器がよい解を生成するのをより容易にします。

·

Categories: Integral calculus ·Numerical methods ·Share packages ·Package quadpack

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 19.4 Functions and Variables for QUADPACK

関数: quad_qag (f(x), x, a, b, key, [epsrel, epsabs, limit])
関数: quad_qag (f, x, a, b, key, [epsrel, epsabs, limit])

  一般関数の有限の区間上の積分。 `quad_qag`は Aind(Piessens, 1973)の戦略を使った 簡単な大域的適応積分器を実装しています。 呼び出し側はルール評価コンポーネントを ガウスークロンロッドの求積公式の6つのペアの中から選ぶことができます。 強く振動する非積分関数には高次のルールが適切です。

  quad_qagは積分 integrate (f(x), x, a, b) を計算します。

  非積分関数は依存変数 xの f(x)であり、 関数は下限 a上限 bの間で積分されます。 keyは利用する積分器で、 1から 6までのいずれかの整数でなければなりません。 keyの値はガウスークロンロッドの積分ルールの次数を選びます。 高次のルールが強く振動する非積分関数には適切です。

  非積分関数は Maximaか Lisp関数か 演算子の名前であるか Maximaのラムダ式か一般的な Maximaの式として指定することができます。

  数値積分は、望まれる精度を達成するまで 積分領域を部分区間に分割することによって適応的に実行されます。

  キーワード引数はオプションで、どの次数においても指定できます。 それらは形式 `key=val`を取ります。キーワード引数は：

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。 limitは使用する部分区間の最大数。デフォルトは200。

  `quad_qag`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード（戻り値の４番目の要素）は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qag (x^(1/2)*log(1/x), x, 0, 1, 3, 'epsrel=5d-8);
      (%o1)    [.4444444444492108, 3.1700968502883E-9, 961, 0]
      (%i2) integrate (x^(1/2)*log(1/x), x, 0, 1);
                                      4
      (%o2)                           -
                                      9

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qags (f(x), x, a, b, [epsrel, epsabs, limit])
関数: quad_qags (f, x, a, b, [epsrel, epsabs, limit])

  一般関数の有限の区間上の積分。 `quad_qags`はイプシロンアルゴリズム (Wynn, 1956)による外挿 (de Doncker,1978)を使った大域的適応積分器を実装しています。

  `quad_qags`は、積分

  integrate (f(x), x, a, b) を計算します。

  非積分関数は従属変数 xの関数 f(x)であり、 関数は下限 a上限 bの間で積分されます。

  非積分関数は、Maximaか Lisp関数か 演算子の名前であるか Maximaのラムダ式か一般的な Maximaの式として指定することができます。

  キーワード引数はオプションで、どの次数においても指定できます。 それらは形式 `key=val`を取ります。キーワード引数は：

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。 limitは使用する部分区間の最大数。デフォルトは200。

  `quad_qags`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード（戻り値の４番目の要素）は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qags (x^(1/2)*log(1/x), x, 0, 1, 'epsrel=1d-10);
      (%o1)   [.4444444444444448, 1.11022302462516E-15, 315, 0]

  この積分に関しては `quad_qags`は `quad_qag`よりも精確で効率的であることに注意してください。

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qagi (f(x), x, a, b, [epsrel, epsabs, limit])
関数: quad_qagi (f, x, a, b, [epsrel, epsabs, limit])

  一般関数の無限のもしくは半無限の区間上の積分。 区間を有限の区間上に写像し、 `quad_qags`の中で使うのと同じ戦略を適用します。

  `quad_qagi`は Quadpack QAGIルーチンを使って以下の積分の１つを評価します。

  integrate (f(x), x, a, inf)

  integrate (f(x), x, minf, a)

  integrate (f(x), x, minf, inf)

  被積分関数は従属変数 xの関数 f(x)であり、無限範囲上で積分されます。

  被積分関数は Maximaか Lispの関数か演算子の名前であるか、 Maximaのラムダ式か Maximaの一般式として指定することができます。

  積分の境界の１つは無限でなければいけません。 もしそうでないなら `quad_qagi`はただ名詞形を返します。

  キーワード引数は随意で、任意の順序で指定できます。 それらすべては形式 `key=val`を取ります。 キーワード引数は:

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。 limitは使用する部分区間の最大数。デフォルトは200。

  `quad_qagi`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qagi (x^2*exp(-4*x), x, 0, inf, 'epsrel=1d-8);
      (%o1)        [0.03125, 2.95916102995002E-11, 105, 0]
      (%i2) integrate (x^2*exp(-4*x), x, 0, inf);
                                     1
      (%o2)                          --
                                     32

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qawc (f(x), x, c, a, b, [epsrel, epsabs, limit])
関数: quad_qawc (f, x, c, a, b, [epsrel, epsabs, limit])

  f(x)/(x - c)のコーシーの主値を有限の区間 (a, b)上で指定された cを用いて計算します。 戦略は大域的適応的で、点 x = cを含む部分範囲上で変形 Clenshaw-Curtis積分を使います。

  `quad_qawc`は Quadpack QAWCルーチンを使って、 integrate (f(x)/(x - c), x, a, b)

  のコーシーの主値を計算します。

  被積分関数は従属変数 xの関数 `f(x)/(x - c)`で、 関数は aから bまでの区間上で積分されます。

  被積分関数は Maximaか Lispの関数か演算子の名前であるか、 Maximaのラムダ式か Maximaの一般式として指定することができます。

  キーワード引数は随意で、任意の順序で指定できます。 それらすべては形式 `key=val`を取ります。 キーワード引数は:

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。limitは使用する部分区間の最大数。デフォルトは200。

  `quad_qagc`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qawc (2^(-5)*((x-1)^2+4^(-5))^(-1), x, 2, 0, 5,
                       'epsrel=1d-7);
      (%o1)    [- 3.130120337415925, 1.306830140249558E-8, 495, 0]
      (%i2) integrate (2^(-alpha)*(((x-1)^2 + 4^(-alpha))*(x-2))^(-1),
            x, 0, 5);
      Principal Value
                             alpha
              alpha       9 4                 9
             4      log(------------- + -------------)
                            alpha           alpha
                        64 4      + 4   64 4      + 4
      (%o2) (-----------------------------------------
                              alpha
                           2 4      + 2

             3 alpha                       3 alpha
             -------                       -------
                2            alpha/2          2          alpha/2
          2 4        atan(4 4       )   2 4        atan(4       )   alpha
        - --------------------------- - -------------------------)/2
                    alpha                        alpha
                 2 4      + 2                 2 4      + 2
      (%i3) ev (%, alpha=5, numer);
      (%o3)                    - 3.130120337415917

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qawf (f(x), x, a, omega, trig, [epsabs, limit, maxp1, limlst])
関数: quad_qawf (f, x, a, omega, trig, [epsabs, limit, maxp1, limlst])

  フーリエコサイン変換またはフーリエサイン変換を、 Quadpack QAWF関数を使って、半無限区間上で計算します。 `quad_qawo`で使われるのと同じアプローチが、連続する区間に適用され、 イプシロンアルゴリズム(Wynn, 1956)を使った収束の促進が積分寄与の級数に適用されます。

  `quad_qawf`は積分 integrate (f(x)*w(x), x, a, inf) を計算します。

  重み関数 wが trigによって以下のように選択されます:

  `cos`

    w(x) = cos (omega x)

  `sin`

    w(x) = sin (omega x)

  被積分関数は、 Maximaか Lispの関数か演算子の名前であるか、 Maximaのラムダ式か Maximaの一般式として指定することができます。

  キーワード引数は随意で、任意の順序で指定できます。 それらすべては形式 `key=val`を取ります。 キーワード引数は:

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。(limit - limlst)/2は使用する部分区間の最大数。デフォルトは200。

  maxp1

    チェビシェフ積率の最大数。 0より大きくなければいけません。 デフォルトは100です。

  limlst

    サイクル数に関する上限。 3以上でなければいけません。 デフォルトは10です。

  `quad_qawf`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qawf (exp(-x^2), x, 0, 1, 'cos, 'epsabs=1d-9);
      (%o1)   [.6901942235215714, 2.84846300257552E-11, 215, 0]
      (%i2) integrate (exp(-x^2)*cos(x), x, 0, inf);
                                - 1/4
                              %e      sqrt(%pi)
      (%o2)                   -----------------
                                      2
      (%i3) ev (%, numer);
      (%o3)                   .6901942235215714

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qawo (f(x), x, a, b, omega, trig, [epsrel, epsabs, limit, maxp1, limlst])
関数: quad_qawo (f, x, a, b, omega, trig, [epsrel, epsabs, limit, maxp1, limlst])

  cos(omega x) f(x) や sin(omega x) f(x) の有限の区間上の積分。 ここで、 omega は定数です。 規則評価構成要素は変形 Clenshaw-Curtis手法に基づいています。 `quad_qawo`は`quad_qags`に似て、外挿とともに適応再分割を適用します。

  `quad_qawo`は Quadpack QAWOルーチンを使って積分を計算します:

  integrate (f(x)*w(x), x, a, b)

  重み関数 wが trigによって以下のように選択されます:

  `cos`

    w(x) = cos (omega x)

  `sin`

    w(x) = sin (omega x)

  被積分関数は Maximaか Lispの関数か演算子の名前であるか、 Maximaのラムダ式か Maximaの一般式として指定することができます。

  キーワード引数は随意で、任意の順序で指定できます。 それらすべては形式 `key=val`を取ります。 キーワード引数は:

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。limit/2は使用する部分区間の最大数。デフォルトは200。

  maxp1

    チェビシェフ積率の最大数。 0より大きくなければいけません。 デフォルトは100です。

  limlst

    サイクル数に関する上限。 3以上でなければいけません。 デフォルトは10です。

  `quad_qawo`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qawo (x^(-1/2)*exp(-2^(-2)*x), x, 1d-8, 20*2^2, 1, cos);
      (%o1)     [1.376043389877692, 4.72710759424899E-11, 765, 0]
      (%i2) rectform (integrate (x^(-1/2)*exp(-2^(-alpha)*x) * cos(x),
            x, 0, inf));
                         alpha/2 - 1/2            2 alpha
              sqrt(%pi) 2              sqrt(sqrt(2        + 1) + 1)
      (%o2)   -----------------------------------------------------
                                     2 alpha
                               sqrt(2        + 1)
      (%i3) ev (%, alpha=2, numer);
      (%o3)                     1.376043390090716

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qaws (f(x), x, a, b, alpha, beta, wfun, [epsrel, epsabs, limit])
関数: quad_qaws (f, x, a, b, alpha, beta, wfun, [epsrel, epsabs, limit])

  w(x) f(x)の有限の区間上の積分。 ここで w(x)はある代数的または対数関数です。 大域的適応最分割戦略が適用されます。 積分の区間の端点を含む部分区間上で変形 Clenshaw-Curtis積分を使います。

  `quad_qaws`は Quadpack QAWSルーチンを使って積分を計算します:

  integrate (f(x)*w(x), x, a, b)

  重み関数 wが wfunによって以下のように選択されます:

  `1`

    w(x) = (x - a)^alpha (b - x)^beta

  `2`

    w(x) = (x - a)^alpha (b - x)^beta log(x - a)

  `3`

    w(x) = (x - a)^alpha (b - x)^beta log(b - x)

  `4`

    w(x) = (x - a)^alpha (b - x)^beta log(x - a) log(b - x)

  被積分関数は Maximaか Lispの関数か演算子の名前であるか、 Maximaのラムダ式か Maximaの一般式として指定することができます。

  キーワード引数は随意で、任意の順序で指定できます。 それらすべては形式 `key=val`を取ります。 キーワード引数は:

  epsrel

    望まれる近似の相対誤差。デフォルトは1d-8。

  epsabs

    望まれる近似の絶対誤差。デフォルトは0。

  limit

    内部の作業配列のサイズ。 limitは使用する部分区間の最大数。デフォルトは200。

  `quad_qaws`は４つの要素のリストを返します:

  - 積分の近似
  - 見積もられた近似の絶対誤差
  - 非積分関数の評価数
  - エラーコード

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qaws (1/(x+1+2^(-4)), x, -1, 1, -0.5, -0.5, 1,
                       'epsabs=1d-9);
      (%o1)     [8.750097361672832, 1.24321522715422E-10, 170, 0]
      (%i2) integrate ((1-x*x)^(-1/2)/(x+1+2^(-alpha)), x, -1, 1);
             alpha
      Is  4 2      - 1  positive, negative, or zero?

      pos;
                                alpha         alpha
                         2 %pi 2      sqrt(2 2      + 1)
      (%o2)              -------------------------------
                                     alpha
                                  4 2      + 2
      (%i3) ev (%, alpha=4, numer);
      (%o3)                     8.750097361672829

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_qagp (f(x), x, a, b, points, [epsrel, epsabs, limit])
関数: quad_qagp (f, x, a, b, points, [epsrel, epsabs, limit])

  有限区間上の一般的な関数の積分。 `quad_qagp`は、 Epsilonアルゴリズム (Wynn, 1956)による外挿を使った大域的に適応的な区間部分分割 (de Doncker, 1978)を実装します。

  `quad_qagp`は積分

  integrate (f(x), x, a, b) を計算します。

  被積分関数は従属変数 xを持つ f(x)で、 関数は端点 aと bの間で積分されます。

  被積分関数は Maximaか Lispの関数か演算子の名前か、Maximaのラムダ式、一般の Maxima式として 指定できます。

  積分器を助けるため、 ユーザーは被積分関数の特異点や不連続点を提供しなければいけません。

  キーワード引数はオプションで、 どんな順序でも指定できます。 それらはすべて `key=val`の形を取ります。 キーワード引数は以下の通りです:

  epsrel

    所望の近似の相対誤差。デフォルトは 1d-8。

  epsabs

    所望の近似の絶対誤差。デフォルトは 0。

  limit

    内部の作業配列のサイズ。 limitは使われる部分区間の最大数です。 デフォルトは 200。

  `quad_qagp`は4要素のリストを返します:

  - 積分の近似,
  - 近似の絶対誤差の見積もり,
  - 被積分関数の評価数,
  - エラーコード。

  エラーコード(戻り値の４番目の要素)は以下の値を取ります:

  `0`

    問題が発生しなかった場合;

  `1`

    部分区間の数が上限を超えた場合;

  `2`

    丸め誤差が超過した場合;

  `3`

    非積分関数の振る舞いが極端に悪い場合;

  `4`

    収束に失敗した場合;

  `5`

    積分が発散しているか収束が遅い場合;

  `6`

    入力が無効な場合;

  例:

      (%i1) quad_qagp(x^3*log(abs((x^2-1)*(x^2-2))),x,0,3,[1,sqrt(2)]);
      (%o1)   [52.74074838347143, 2.6247632689546663e-7, 1029, 0]
      (%i2) quad_qags(x^3*log(abs((x^2-1)*(x^2-2))), x, 0, 3);
      (%o2)   [52.74074847951494, 4.088443219529836e-7, 1869, 0]

  被積分関数は `1`と `sqrt(2)`で特異性を持つので これらの点を `quad_qagp`に提供します。 `quad_qagp`は `quad_qags` より精確で効率的であることも特筆します。

  ·

  Categories: Numerical methods ·Package quadpack

関数: quad_control (parameter, [value])

  quadpackのエラーハンドリングを制御します。 パラメータは以下のシンボルのどれかでなければいけません:

  `current_error`

    現在のエラー数

  `control`

    メッセージを印字するかしないか制御します。 ゼロ以下に設定すると、メッセージは抑制されます。

  `max_message`

    メッセージを印字する最大回数。

  valueを与えないと parameterの現在の値を返します。 valueを与えると parameterの値に与えられた値を設定します。

  ·

  Categories: Numerical methods ·Package quadpack

[ << ] | [ >> ] |  |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

この文書は市川 雄二によって2012年12月月12日にtexi2html 1.82を用いて生成されました。