第 9 章 多項式について
17.3 関連する函数
第 17 章 代入操作
17.1 はじめに
多項式の計算で,方程式を求めた結果を早速,式に代入したい事があります. この場合,規則によ る代入や,直接変数に対してx:aの様に割当てを行う事もありますが,これらとは別にsubst等の代 入用の函数を用いる方法があります.
172 第17章 代入操作 lratsubst
lratsubst(hリストi,h多項式i)
subst(方程式のリスト,式)と似ていますが,rstsubstがsubst
の代りに使われる点で異なります.lrat-substの最初の因子は方程式か方程式のリストで,subsから得られる書式と同一のものなければな
りません. 代入は方程式のリストで与えられた順序(リストの左から右)で処理します.
(%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
ratsubst
ratsubst (a, b, c)
cに含まれるbにaを代入します.bは和,積,羃等であっても構いません.substが代入を行う個所 で,ratsubstは式が何を意味するかを判っています. その為,subst(a,x+y,x+y+z)はx+y+zを返し ますが,ratsubstはz+aを返します.
radsubstflagがtrueであれば,ratsubstがxにuをsqrt(x)として代入する事を許容します.
(c1) radsubstflag:false;
(d1) false
(c2) ratsubst(u,sqrt(x),x);
(d2) x
(c3) radsubstflag:true;
(d3) true
(c4) ratsubst(u,sqrt(x),x);
2
(d4) u
この様にratsubstflagがtrueでないとsqrt(x)がxに代入されません.
sublis
sublis (hリストi,h式i)
h式iにhリストiで指定した複数の代入を並行して行ないます. hリストiには,a=bの形で式 を記述します.演算子=の左辺のaがh式iに含まれるアトムや函数名を指定し,右辺の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)の様な入れ換えの指定では,hリストi に含まれる式の代入を順番に行うのではなく同時に行う為,cosとsinが入れ換えられている事に注 意して下さい.
大域変数sublis apply lambdaはsublisを実行した後の簡易化を制御します.
subst
subst (a, b, c)
cの中のbをaで置き換える.ここでbは原子か,cに完全に含まれる部分式でなければならない.
例えば,x+y+zは2*(x+y+z)/wに完全に含まれる部分式であるが,x+yはそうではない.bがこれら の特徴を持たなければ,時にはsubstpartかratsubst (以下を参照せよ)を使っても良い.他にbが e/fの様な形式であればsubst(a*f,e,c)が使え,同様にbがe**(1/f)の形式であれば,subst(a**f,e,c) が使える.
このsubst命令はx^-yでx^yを認識するので, subst(a,sqrt(x),1/sqrt(x))は1/aとなる.aとb はまた”で括られた式の演算子や関数名でも良い.微分形式での独立変数に代入を行う場合,at関数
(以下を見よ)を利用すべきである.
注意: substはsubstituteの別名である.subst(eq1,exp)やsubst([eq1,...,eqk],exp)は他の可能な 代入形式である.各eqiは指定した代入が実行されるべき等式である. 各々の等式でその右側が式 expの左側に代入される.
substinpart
substinpart (x, exp, n1, ...) substpartに似ているが,expの内部式に対して作用する.
(c1) x.’diff(f(x),x,2);
2
174 第17章 代入操作 d
(d1) x . (--- f(x))
2 dx (c2) substinpart(d**2,%,2);
2
(d2) x . d
(c3) substinpart(f1,f[1](x+1),0);
(d3) f1(x + 1)
追加情報
part関数の最後の引数が添字のリストであれば,幾つかの部分式が取り出され,各々 はそのリストの添字に関連するものである.それ故,part(x+y+z,[1,3])はz+xとなる.
pieceはpart関数を用いた時に選ばれた最後の式の値を保つ.その関数の実行中に設定 され,それ故に,その関数でそれ自体を以下に見る様に参照しても良い.
partswitch[false]がtrueに設定されていれば,存在しない式の成分を選択した場合, endが返され,それ以外ではエラーメッセジが与えられる.
(c1) 27*y**3+54*x*y**2+36*x**2*y+y+8*x**3+x+1;
3 2 2 3
(d1) 27 y + 54 x y + 36 x y + y + 8 x + x + 1 (c2) part(d1,2,[1,3]);
2
(d2) 54 y
(c3) sqrt(piece/54);
(d3) y
(c4) substpart(factor(piece),d1,[1,2,3,5]);
3
(d4) (3 y + 2 x) + y + x + 1 (c5) 1/x+y/x-1/z;
1 y 1
(d5) + +
-z x x
(c6) substpart(xthru(piece),%,[2,3]);
y + 1 1
(d6)
-x z
又,オプションのinflagをtrueに設定してpart/substpartを呼出す事は, inpart/substinpartを 呼出す事と同じである.
substpart
substpart (x, exp, n1, ..., nk)
part関数の様に引数の残り(訳者注:n1,...,nkの事)で抜き出した部分式にxを代入する.expの 新しい値を返す.xはexpの演算子として代入されるべきものでも良い. 場合によっては”で括られ ていなければならない(例えば,substpart(”+”,a*b,0); -¿ b + a).
(c1) 1/(x**2+2);
1
(d1)
---2 x + 2 (c2) substpart(3/2,%,2,1,2);
1
(d2)
---3/2
x + 2
(c3) a*x+f(b,y);
(d3) a x + f(b, y)
(c4) substpart("+",%,1,0);
(d4) x + f(b, y) + a
(c2)の代入では1/(x**2+2)の内部形式を利用し,その内部の2,1,2で指定される要素を 入れ換えている.内部形式はlispのs式による表現(/ 1 (+ (** x 2) 2 )に似たもので ある(実際は演算子が例えば,"+"が(mplus)と原子のリストになっている程度で本質的 な構造は同じ).実例での2,1,2の意味はこの内部形式の階層構造に関連する.
先頭の2が内部形式のリストの2番目の元を意味するが,内部形式で先頭が演算子となる ので実際は1を加えたものが対応する.従って,3番目の成分(+ (** x 2) 2)となる.
次の1は同様に(** x 2),2で,このリストの2番目の引数2が対応し,それを3/2に変更 する為,最終的に1/(x**(3/2)+2)となる.ここで0が演算子となるので,0を指定すれば 一番上の"+"が対応する.
(c15) a:1/(x**2+2);
1
(d15)
---2 x + 2
176 第17章 代入操作 (c16) substpart("*",a,0);
2
(d16) x + 2
(c17) substpart("*",a,2,0);
1
(d17)
----2 2 x
又,この階層を利用すれば,成分の入れ替えも可能である.
(c22) substpart("sin(x)+cos(y)+2",a,2,1);
1
(d22)
---sin(x)+cos(y)+2 + 2 この例では,x^2をsin(x)+cos(y)で置き換えている.
オプションのinflagをtrueにし,part/substpartを用いる事はinpart/substinpartを 直接利用する事と同じである.
平成17年12月6日(火)