Go to the first, previous, next, last section, table of contents.


積分エンジンのカスタマイズ

Calc は IntegRules, IntegAfterRules と呼ばれる 2つの書替え規則を組込みで持っていて、 これらを編集して新しい積分方法を定義することができます。 積分プロセスの各段階で、Calc は当面の積分対象を架空の関数呼出 `integtry(expr,var)' の中に代入します。 ここで expr は積分対象、var は積分変数です。 ユーザー定義規則群がこれを(integtry を呼出さない)普通の式に書替えたら、 Calc はそれを expr の積分結果として使います。 例えば、規則 `integtry(mysin(x),x) := -mycos(x)' は、 サイン関数のように振舞う関数 mysin を積分する規則を定義します。 そうしておいてから、スタックに `4 mysin(2y+1)' を置いて a i y と タイプすると、積分結果 `-2 mycos(2y+1)' が生成されます。 Calc はユーザー規則を活用するために、 この積分に対し種々の変換を自動的に行ったことに注意してください。 積分表などでは一般的に `mysin(a x + b)' と書きますが、 IntegRules ではそこまで一般化して定義しなくても構いません。

もっと深刻な例ですが、 式 `exp(x)/x' の積分は普通の関数で表現することができません。 そこで、これを表現するために "exponential integral" 関数 Ei(x) が考案されました。 規則 `[integtry(exp(x)/x, x) := Ei(x)]'IntegRules に追加すれば、 でっち上げた Ei を使って積分を表現させることができます。 こうしておいて、 `exp(2x)/x' をスタックに置き、 a i x とタイプすると `Ei(2 x)' が得られます。 この新しい規則は、 (置換積分のような) Calc 組込みのいろいろな積分手法と協調して働き、 Ei を含んだ様々な式の積分を解決します。 例えば、この新規則によって `exp(exp(x))'`ln(ln(x))' が 積分できるようになります(積分結果はそれぞれ、 `Ei(exp(x))'`x ln(ln(x)) - Ei(ln(x))' になります)。

integ を呼出すことによって、 ユーザー定義規則はさらなる積分をすることができます。 例えば、`integtry(twice(u),x) := twice(integ(u))' は、 `twice(sin(x))' を積分して `twice(-cos(x))' になるようにします。 integ が 1引数だけで呼出されたことに注意してください。 この表記方法は IntegRules でのみ許され、 その意味は「これを同じ積分変数について積分せよ」です。 Calc が u を積分できなかったら、 IntegRules を呼出した元の積分も不成功となります。 それで、`twice(f(x))' の積分は不成功に終わり、 未評価の積分 `integ(twice(f(x)), x)' が返されます。 2つ以上の引数で integ を呼出しても違反ではありませんが、この場合、 もし u が積分不可能であっても twice 自体は積分可能として扱われます。 もし上記の規則を `... := twice(integ(u,x))' に変更したら、 `twice(f(x))' の積分結果は `twice(integ(f(x),x))' になります。

もし、ある規則が式 `integsubst(sexpr, svar)' を生成したら、 それがトップレベルの integtry の置換であろうが、 式中の一部分の置換であろうが、 Calc は置換 `u = sexpr(svar)' を適用して 元の expr を積分しようとします。 例えば、規則 `sqrt(a) := integsubst(sqrt(x),x)' は、 積分対象中に平方根があったら `u = sqrt(x)' による置換積分を試みるべきということを意味します。 (この特別な規則は実は不必要です。なぜなら、 Calc は積分対象中に実際に sexpr が現れるような 「明白な」置換を常に試みるからです。) 変数 svarintegtry の呼出しに現れた var と同じでも良いし、同じでなくてもかまいません。

ある integsubst に従って置換積分する際に、 (もし積分対象が sexpr にマッチする部分以外で var を参照していたら) Calc は equation solver を使って sexpr の逆関数を見つけます。 Calc は微分エンジンを利用して、 sexpr および/またはその逆関数の導関数を計算します (Calc は2つの方法を持っていて、どちらかの導関数を利用します)。 ユーザー規則の integsubst に追加の引数を加えることで、 それらを指定することもできます。一般書式は `integsubst(sexpr, svar, sinv, sprime)' で、 ただし sinv は (svar の関数であるところの) sexpr の逆関数、 sprimesexprsvar についての導関数です。 もしこれらが指定されず、かつ Calc が自力で見つけることもできなければ、 その置換積分規則が働くのは非常に限定された単純な場合に限られることになります。

Calc はあたかも C-u 1 a r IntegRules とした場合のように IntegRules を適用します。 言換えれば、Calc は規則群のどれかが書替えに成功したとたんに書替えを止めます。 (そうでなければ、上記の例 `integsubst(sqrt(x),x)' はどこまでも無限に integsubst 呼出しを加え続けるでしょう!)

積分エンジンが a s を用いて中間結果を簡単化する度に、 IntegSimpRules にストアされたもう一つの規則群が適用されます。 例えば IntegSimpRules に規則 `twice(x) := 2 x' を登録すると、 twice 関数をいつでも積分できる形式に変換するように Calc に指示することになります。

Z F コマンド (Programming with Formulas 参照 ) による関数定義も、 積分エンジンに影響を与えます。 Calc の積分エンジンはユーザー定義された関数群を 定義式に従って自動的に展開します。 たとえ、定義した関数の引数をシンボリックにして、 未評価のまま残されるように仕向けても展開されます。 (微分エンジンや equation solver のように、 他の Calc システムにもこれを行うものがあります。)

Calc は積分の解を見いだせても、 その結果を不必要なまでに複雑に表現してしまうことがあります。 このような場合、 上述のように integsubst を使って、 望ましい結果へのより直接的な手段を教えることもできるし、 あるいは IntegAfterRules が使えます。 これは主積分エンジンがその結果を返した後に動作する特別の規則群であって、 Calc は基本的に、結果を表示する前に a r IntegAfterRules を実行します。 (その後さらに簡単化するために、 a sIntegSimpRules 抜きで実行することもします。) 例えば、Calc の積分エンジンは `ln(1+x) - ln(1-x)' 形式の表現を生成することがありますが、 デフォルトの IntegAfterRules は、 これをより読みやすい形式の `2 arctanh(x)' に書替えます。 IntegSimpRulesIntegAfterRules は、 IntegRules とは異なり、 それ以上の書替えが起こらなくなるまで何回でも適用されることに注意してください。 IntegAfterRules による書替えは 主積分エンジンの動作が完了した後にだけ起こるのであって、 毎回適用される IntegRulesIntegSimpRules とは異なります。


Go to the first, previous, next, last section, table of contents.     利用度数