integrate や sum、product に対して変数変換を実行する。以下、積分の場合の例を述べる。書式
changevar(積分, 関係式, 新変数, 元変数)
で用い、「元変数」を含む積分を「新変数」による積分に置換する。具体例として、1/sin(x) の不定積分を我々が普段実行している手順に従って計算してみよう。
(%i1) logabs:true;
(%o1) true
(%i2) 'integrate(1/sin(x),x);
/
[ 1
(%o2) I ------ dx
] sin(x)
/
まず、t = cos(x) と置いて置換積分する(ここで changevar を使う)。
(%i3) eq:t=cos(x);
(%o3) t = cos(x)
(%i4) changevar(%o2, eq, t, x);
/
[ 1
(%o4) I ------ dt
] 2
/ t - 1
変数変換式 t=cos(x) をわざわざ eq などと置かずに、changevar(%o2, t=cos(x), t, x) としてももちろんよいが、最後に再びこの式を利用することになるのでこのようにした。さて、我々は普段
(%o4) 式を部分分数分解して、積分を実行するのであった。
(%i5) part(%, 1);
1
(%o5) ------
2
t - 1
(%i6) partfrac(%, t);
1 1
(%o6) --------- - ---------
2 (t - 1) 2 (t + 1)
(%i7) integrate(%, t);
log(abs(t - 1)) log(abs(t + 1))
(%o7) --------------- - ---------------
2 2
(%i8) subst(eq, %);
log(abs(cos(x) - 1)) log(abs(cos(x) + 1))
(%o8) -------------------- - --------------------
2 2
関数 changevar は定積分に用いることも出来る。具体例として、1/(1+x^2) の 0 から π/4 までの定積分を高校流に計算してみよう(大学生なら原始関数が
arctan x であることを知っているハズ)。
(%i9) 'integrate(1/(1+x^2), x, 0, 1);
1
/
[ 1
(%o9) I ------ dx
] 2
/ x + 1
0
(%i10) changevar(%, x=tan(t), t, x);
%pi
---
4
/ 2
[ sec (t)
(%o10) I ----------- dt
] 2
/ tan (t) + 1
0
現在はほとんど使われないが sec とは 1/cos のことである。いずれにしてもこのままでは何のことか分からないので、関数 trigsimp
を用いて簡単にしてみる。
(%i11) part(%, 1);
2
sec (t)
(%o11) -----------
2
tan (t) + 1
(%i12) trigsimp(%);
(%o12) 1
従って原始関数の 1 つが t と分かったから(脚注参照)、答え π/4 - 0 = π/4 が得られる。念のため、もとの積分をそのまま Maxima
に計算させておく。
(%i12) ev(%o9, integrate);
%pi
(%o12) ---
4
補足 「関係式」は「方程式」でなく changevar(%o2, t-cos(x), t, x) のように「式」で与えることも出来る。この場合、式 t-cos(x) が方程式 t-cos(x)=0 と見なされて計算される。
脚注 maxima-5.9.1 の場合、一旦 kill(all) を実行してしまうとおかしなことになる。kill(all) を実行したら、同時に load("trgsmp") も実行せよ。