Next: , Previous:   [Contents][Index]

19 Integration


19.1 Introduction to Integration

Maximaは、積分を扱うためのいくつかのルーチンを持っています。 integrate関数はそれらのほとんどを利用します。 指定されていない関数(ともちろんその導関数)を扱うantidパッケージもあります。 数値目的のためには、 quad_qag, quad_qagsなどと名付けられたQUADPACKから適応積分器一式があります。 それらは見出しQUADPACKの下で記述されています。 超幾何関数を扱うことができます。詳細はspecintを参照してください。 一般的に言って、Maximaは 「初等関数」(有理関数、三角関数、対数、指数関数、根号など)と2、3の拡張(誤差関数、二重対数関数)を使った積分可能な積分だけを扱います。 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
関数: dblint (f, r, s, a, b)

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

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

関数fは、2つの変数の翻訳されコンパイルされた関数でなければいけなく、 rsはそれぞれ、翻訳されコンパイルされた変数でなければいけません。 一方で、abは浮動小数点数でなければいけません。 ルーチンは、 xとyの区間の分割の数を決める2つのグローバル変数を持ちます: dblint_xdblint_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_xdblint_yを増やすことができます。 関数値は保存されないので、もし関数が非常に時間がかかるものなら、 もし何か変えたら再計算を待たなければいけません(すいません)。 関数f, r, sは、 dblintコールの前に、翻訳されるかコンパイルされるかどちらかが要求されます。 これは、多くの場合、インタープリタコードに対して桁違いの速度改善がなされるでしょう!

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

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

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

このように、ユーザーの観点からは、integrateをコールすることは十分です。

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

オプション変数: erfflag

デフォルト値: true

erfflagfalseの時、 rischが もしまず第一に被積分になにもないなら、 答えの中にerf関数を導入することを妨げます。

関数: ilt (expr, s, t)

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

(%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
オプション変数: intanalysis

デフォルト値: true

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

ldefintも参照してください。

例:

intanalysisfalseに設定されている時 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
関数: integrate (expr, x)
関数: integrate (expr, x, a, b)

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

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

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

いくつかの環境では、(例えば、'integrate (expr, x)のように、 シングルクオートされたintegrateで手動で名詞形式を構成することが役に立ちます。 例えば、積分が、また計算されていないいくつかのパラメータに依存しているかもしれません。 名詞は、iが注目の名詞形式であるところのev (i, nouns)によって、引数に適用されるかもしれません。

integrateは不定積分とは別に、定積分を扱います。 それぞれの場合を扱うため、ある範囲の発見法を用意しています。 定積分の特別な場合は、0や無限大に等しい積分の下限上限を含んだり、 0や%pi2 %piに等しい下限上限を持つ三角関数を含んだり、 有理関数やベータやプサイ関数の定義に関連した積分やいくつかの対数的な積分、三角関数積分を含んだりします。 有理関数の処理は、留数の計算を含むかもしれません。 もし適用可能な特殊な場合が見つからなければ、不定積分を計算し、下限上限でそれを評価しようとするでしょう。 これは、下限上限に無限大の極限を取ることを含みます。ldefintも参照してください。

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

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

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

integratef(x)記法で陽に表現された関数関係のみに動作します。 integratedepends関数で規定された陰の依存性を考慮しません。

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

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

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

例:

  • 初等不定積分、定積分
    (%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
    
  • 変数変換。この例では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は有理関数の分母の因子を抽出できますが、剰余を因数分解できないか積分をみつけられません。 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
    
システム変数: integration_constant

デフォルト値: %c

積分定数は、等式の不定積分によって導入され、 定数名は、 integration_constantintegration_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
システム変数: integration_constant_counter

デフォルト値: 0

積分定数が等式の不定積分によって導入された時、 定数名は、 integration_constantintegration_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
オプション変数: integrate_use_rootsof

デフォルト値: false

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

例えば、 integrate_use_rootsoffalseに設定すると、 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(%r4  - %r4  + 1, %r4)
(%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がもっと役立つ結果を得るのを助けます。

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

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

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

関数: potential (givengradient)

計算は、 nonlistまたは形式

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

でなければならないグローバル変数potentialzeroloc[0]を利用します。 ここで、前者は後者の中のすべての右辺の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
関数: risch (expr, x)

リッシュアルゴリズムの超越な場合を使って、 exprxに関して積分します。 (リッシュアルゴリズムの代数的な場合は実装されていません。) これは、現在、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)
関数: tldefint (expr, x, a, b)

tlimswitchtrueに設定されているldefintと同値です。


19.3 Introduction to QUADPACK

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

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

SLATECライブラリは1993年7月付ですが、QUADPACK関数は何年か前に書かれました。 QUADPACKももう1つのバージョンが 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積分が使われます。


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) を計算します。

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

非積分関数は、MaximaもしくはLisp関数もしくは演算子の名前もしくMaximaのラムダ式か、 一般的なMaximaの式として指定されます。

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

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

epsrel

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

epsabs

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

limit

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

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

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

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

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
関数: 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) を計算します。

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

非積分関数は、MaximaもしくはLisp関数もしくは演算子の名前もしくMaximaのラムダ式か、一般的なMaximaの式として指定されます。

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

epsrel

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

epsabs

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

limit

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

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

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

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

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よりも精確で 効率的であることに注意してください。

関数: 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ルーチンを使って以下の積分の1つを評価します。

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

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

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

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

被積分関数は、MaximaまたはLispの関数または演算子の名前、 Maximaのラムダ式またはMaximaの一般式として指定されるかもしれません。

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

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

epsrel

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

epsabs

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

limit

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

quad_qagiは、4つの要素のリストを返します:

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

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

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
関数: 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)

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

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

被積分関数は、MaximaまたはLispの関数または演算子の名前、 Maximaのラムダ式またはMaximaの一般式として指定されるかもしれません。

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

epsrel

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

epsabs

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

limit

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

quad_qagcは、4つの要素のリストを返します:

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

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

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
関数: 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) を計算します。

重み関数wtrigによって選択されます:

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は、4つの要素のリストを返します:

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

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

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
関数: 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は、4つの要素のリストを返します:

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

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

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
関数: 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)

重み関数wwfunによって選択されます:

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は、4つの要素のリストを返します:

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

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

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

Footnotes

(1)

Applied Mathematics and Programming Division, K.U. Leuven

(2)

Applied Mathematics and Programming Division, K.U. Leuven

(3)

Institut für Mathematik, T.U. Wien

(4)

National Bureau of Standards, Washington, D.C., U.S.A

(5)

http://www.netlib.org/slatec

(6)

http://www.netlib.org/quadpack

(7)

R. Piessens, E. de Doncker-Kapenga, C.W. Uberhuber, and D.K. Kahaner. QUADPACK: A Subroutine Package for Automatic Integration. Berlin: Springer-Verlag, 1983, ISBN 0387125531.


Next: , Previous:   [Contents][Index]