Next: Introduction to QUADPACK, Previous: Introduction to Integration, Up: Integration [Contents][Index]
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
トップレベルMaximaで書かれ、翻訳され機械語にコンパイルされた二重積分ルーチン。
このパッケージをアクセスするにはload ("dblint")を使ってください。
以下を計算するため、xとy方向に関して
シンプソンの規則方法を使います。
/b /s(x) | | | | f(x,y) dy dx | | /a /r(x)
関数fは、2つの変数の翻訳されコンパイルされた関数でなければいけなく、
rとsはそれぞれ、翻訳されコンパイルされた変数でなければいけません。
一方で、aとbは浮動小数点数でなければいけません。
ルーチンは、
xとyの区間の分割の数を決める2つのグローバル変数を持ちます:
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のデモンストレーションを実行します。
定積分を計算しようとします。
integrateは、
積分の範囲が指定されている時、
すなわち、integrateが
integrate (expr, x, a, b)としてコールされた時、
defintをコールします。
このように、ユーザーの観点からは、integrateをコールすることは十分です。
defintは、シンボリック式、計算された積分または積分の名詞形、
を返します。
定積分の数値近似に関しては、quad_qagと関連関数を参照してください。
デフォルト値: true
erfflagがfalseの時、
rischが
もしまず第一に被積分になにもないなら、
答えの中にerf関数を導入することを妨げます。
exprのsとパラメータtに関する逆ラプラス変換を計算します。
exprは、
分子は線形2次因子だけを持つ多項式の比でなければいけません。
solveまたはlinsolveと合わせて
関数laplaceやiltを使うことによって
ユーザーは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
デフォルト値: 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
xに関するexprの積分をシンボリックに計算しようとします。
integrate (expr, x)は不定積分で、
integrate (expr, x, a, b)はa,bの上限下限を持つ定積分です。
integrateはこの制限を強制しませんが、上限下限はxを含んではいけません。
aはbより小さい必要はありません。
bがaと等しいなら、integrateは0を返します。
定積分の数値近似に関してはquad_qagと関連関数を参照してください。
(複素積分)留数の計算に関してはresidueを参照してください。
不定積分の代替計算方法に関してはantidを参照してください。
integrateが成功すれば、積分(integrateを含まない式)を返します。
そうでなければ、積分の名詞形式(クォートされた演算子'integrate)もしくは1つ以上の名詞形式を含む式を返します。
integrateの名詞形式は積分記号で表示されます。
いくつかの環境では、(例えば、'integrate (expr, x)のように、
シングルクオートされたintegrateで手動で名詞形式を構成することが役に立ちます。
例えば、積分が、また計算されていないいくつかのパラメータに依存しているかもしれません。
名詞は、iが注目の名詞形式であるところのev (i, nouns)によって、引数に適用されるかもしれません。
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は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
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
デフォルト値: %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
デフォルト値: 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
デフォルト値: 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(%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がもっと役立つ結果を得るのを助けます。
exprのxに関する不定積分を上限bと下限aで評価するために
limitを使うことによってexprの定積分を計算しようとします。
もし定積分を計算するのに失敗したなら、
ldefintは、名詞形として極限を含む式を返します。
ldefintは、integrateからコールされないので、
o executing 
ldefint (expr, x, a, b)
を実行することは、
integrate (expr, x, a, b)
とは違った結果をもたらすかもしれません。
ldefintは、定積分を評価するためにいつも同じ方法を使いますが、
integrateは、様々な発見的方法を利用し、いくつかの特殊な場合を認識することもあります。
計算は、
nonlistまたは形式
[indeterminatej=expressionj, indeterminatek=expressionk, ...]
でなければならないグローバル変数potentialzeroloc[0]を利用します。
ここで、前者は後者の中のすべての右辺のnonlist式と同値です(訳者無理解)。
示された右辺は、積分の下限として使われます。
積分の成功は、
それらの値と順序に依存するかもしれません。
potentialzerolocは、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
リッシュアルゴリズムの超越な場合を使って、
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)
tlimswitchがtrueに設定されているldefintと同値です。
Next: Introduction to QUADPACK, Previous: Introduction to Integration, Up: Integration [Contents][Index]