第 2 章 Maxima のデータとその操作
2.4 代入操作
多項式の計算で,方程式を求めた結果を早速,式に代入したい事があります. この場合,規則によ る代入や,直接変数に対してx:aの様に割当てを行う事もありますが,これらとは別にsubst等の代 入用の函数を用いる方法があります.
この節では最初に通常の代入函数について解説します.ここで通常とは,Maximaでの式の表現に 注意を払わなくても済む函数の事です.例えば,式中の変数xに2を代入する様な函数です.Maxima には式の表現から部分式や演算子を指定して入れ換える函数があります.この函数は与式から部分 式を取出すpart函数やinpart函数 に対応するものです.
2.4.1 通常の代入函数
subst函数
¶ ³
subst(⟨式1⟩,⟨式2⟩,⟨式3⟩)
µ ´
subst函数は⟨式3⟩中の⟨式2⟩を⟨式1⟩で置換します.
⟨式1⟩ と⟨式2⟩ は二重引用符で括られた式の演算子や関数名,或いは,⟨式2⟩は アトムや⟨式3⟩ に完全に含まれる部分式でなければなりません.
例えば,x+y+zは2∗(x+y+z)∗wに完全に含まれる部分式になりますが,x+y は部分式にな りません.これは式の木構造を考えると明瞭になります. 部分式は,式の木構造を考えた時に,各階 層が構成する式を取出したものになるからです.ここで,⟨式2⟩が⟨式3⟩の部分式でない場合,subst ではなく,式の階層を直接指定出来るsubstpart函数やratsubst 函数を使いましょう.
subst函数では,⟨式2⟩が 式a/式bの様に割算を伴う場合,subst(⟨式1⟩ ∗ ⟨式b⟩,⟨式a⟩,⟨式3⟩)が使 えます.又,⟨式2⟩が⟨式a⟩1/⟨式b⟩の形式であれば, subst(⟨式1⟩ˆ⟨式b⟩,⟨式a⟩,⟨式3⟩)が使えます.
substに影響を与える大域変数
¶ ³
変数名 初期値 概要
exptsust false 指数函数の代入操作を制御
opsubst true 演算子に代入する事を抑制
µ ´
大域変数exptsubstがtrueであれば%eˆ(a*x)の%eˆxをyで置換える操作が可能になります.
大域変数opsubstがfalseであれば,subst函数は式に含まれる演算子に対して代入を行いません.
例えば, (opsust:true,subst(xˆ2,r,r+r[0]))と (opsubst:false,subst(xˆ2,r,r+r[0]))を実行すると,大 域変数opsusbtがtrueであれば,subst函数は与式r+r[0]の全てのrにxˆ2を代入しますが,大域変 数opsubstをfalseにすると左側のrのみに代入操作が行われ,r[0]のrにはxˆ2が代入されません.
(%i63) (opsubst:true,subst(x^2,r,r+r[0]));
2 2
(%o63) x + (x )
0
2
(%o64) x + r
0
ratsubst函数
¶ ³
ratsubst (⟨式1⟩,⟨式2⟩,⟨式3⟩)
µ ´
ratsubst函数はlangle式3⟩に含まれる⟨式2⟩に⟨式1⟩を代入します. ⟨式2⟩は和,積,羃等の演 算子でも構いません.subst函数が代入を行う個所でratsubst函数は式が何を意味するかを判って います.その為,subst(a,x+y,x+y+z)はx+y+zを返しますが, ratsubst函数はz+aを返します.
ratsubstに影響を与える大域変数
¶ ³
変数名 初期値 概要
radsubstflag false 羃乗の扱いを制御
µ ´
大域変数radsubstflag(ratsubstflagではない事に注意)がtrueの場合,ratsubst函数を使って項の sqrtや羃で式の入れ換えが可能となります.
例えば,aをxˆ(1/3)とした場合,xはaˆ3に等しくなりますが,この様に,式xのxˆ(1/3)をaで 置換える事は通常出来ません. 大域変数radsubstflagがtrueの場合,この様な代入が行えます.
(%i5) radsubstflag:true;
(%o5) true
(%i6) ratsubst(a,x^(1/3),x);
3
(%o6) a
fullratsubst函数
¶ ³
fullratsubst(⟨式1⟩,⟨式2⟩,⟨式3⟩)
µ ´
fullratsubst函数はratsubst函数と同じですが,結果が変化しなくなる迄,自分自身を再帰的に呼 出します.この函数は,式の置き換えや置き換えられた式が一つ又はそれ以上の変数を共通に持つ 場合に便利です.fullratsubst函数はlratsubst函数と同じ引数の書き方が出来ます.最初の引数は単 一の代入方程式かその様な方程式のリストで,第二の引数は仮定された式となります.
lratsubst函数
¶ ³
lratsubst(⟨リスト⟩,⟨多項式⟩)
µ ´
lratsubst函数はsubst(⟨方程式のリスト⟩,⟨式⟩)に似ていますが,rstsubst函数がsubst函数の 代りに使われる点で異なります. lratsubst函数の最初の因子は方程式か方程式のリストで,subst函
数から得られる書式と同一のものでなければなりません.代入は方程式のリストの左から右の順で 処理します.
(%i1) load ("lrats")$
(%i2) subst ([a = b, c = d], a + c);
(%o2) d + b
(%i3) lratsubst([a^2=b,b=c^2,c^3=d], a^2+b+c^3);
2
(%o3) d + 2 c
(%i4) subst([b=c^2,a-2=b,c^3=d], a^2+b+c^3);
2 2
(%o4) d + c + a
(%i4) lratsubst([b=c^2,a-2=b,c^3=d], a^2+b+c^3);
2 2
(%o4) d + c + b + 4 b + 4
sublis函数
¶ ³
sublis(⟨リスト⟩,⟨式⟩)
µ ´
sublis函数は⟨式⟩に⟨リスト⟩で指定した複数の代入を並行して行ないます.⟨リスト⟩には,a=b の形で式を記述します.演算子=の左辺のaが⟨式⟩に含まれるアトムや函数名を指定し,右辺のb に置換える値や式を設定します.
(%i23) sublis([sin=cos,x=2*theta+1],sin(x-1)^2);
2
(%o23) cos (2 theta)
(%i24) sublis([sin=cos,cos=sin],cos(x)^2+sin(x+1)^3);
3 2
(%o24) cos (x + 1) + sin (x)
尚,sublis([sin=cos,cos=sin],cos(x)^2+sin(x+1)^3)の様な入れ換えの指定では,⟨リスト⟩ に含まれる式の代入を順番に行うのではなく同時に行う為,cosとsinが入れ換えられている事に注 意して下さい.
大域変数sublis apply lambdaがsublis函数を実行した後の簡易化を制御します.
2.4.2 substpart 函数と substinpart 函数
substpart函数とsubstinpart函数は与式の部分式を取出すpart函数と函数に各々対応する代
の内部表現に対して部分式を取出す函数となっています. substpart函数とsubstinpart函数の対 応もこれと同様です.その為,大域変数inflag をtrueに設定してpart/substpart函数を呼出す事 は,inpart/substinpart函数を呼出す事と同じ事になります.
substpartとsubstinpart函数
¶ ³
substpart(⟨式1⟩,⟨式2⟩,⟨正整数1⟩,· · ·,⟨正整数n⟩) substinpart(⟨式1⟩,⟨式2⟩,⟨正整数⟩,· · ·)
µ ´
substpart函数は⟨式2⟩からpart関数の様に⟨正整数1⟩,· · ·,⟨正整数n⟩でで抜出した部分式に
⟨式1⟨を代入します. ⟨式1⟩に演算子を入れる場合には,二重引用符でsubstpart(”+”,a*b,0)の様 に括る必要があります.
具体的な例で説明しましょう.式 x3+3x12+1の成分の入れ換えを行いましょう.この式の構造は,図 2.1に示すものになります.
+
(0)
(2,0)
/
1
(1)
* (2,2,0)
3
(2,2,1) (2,1,0)
^ 3
(2,1,2)
x
(2,1,1)
1
(2,3)
x
(2,2,2,1)
(2,2,2)
^ 2
(2,2,2,2)
図2.1: x3+3x12+1 の構造
substpart函数はこの構造に従って入れ換えを行います.その為,演算子や式で成分を置換える事
も可能です.
(%i7) 1/(x^3+3*x^2+1);
1
(%o7)
---3 2
x + 3 x + 1 (%i8) substpart(4,%,2,1,2);
1
(%o8)
---4 2
x + 3 x + 1
(%i9) substpart(1,%,2,2,2,2);
1
(%o9)
---4
x + 3 x + 1 (%i10) substpart(x,%,1);
x
(%o10)
---4
x + 3 x + 1 (%i11) substpart("^",%,0);
4
x + 3 x + 1
(%o11) x
(%i12) substpart(sin(x),%,1);
4
x + 3 x + 1
(%o12) sin(x)
(%i13) substpart(y,%,2);
y
(%o13) sin (x)
substinpart函数はsubstpart函数に似ていますが,substpart函数と違い,式の内部表現に対して 作用します.