• 検索結果がありません。

関連する函数

ドキュメント内 , (ページ 178-186)

第 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,hi)

hihリストiで指定した複数の代入を並行して行ないます. hリストiには,a=bの形で式 を記述します.演算子=の左辺のaがhiに含まれるアトムや函数名を指定し,右辺の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日(火)

18 簡易化について

ドキュメント内 , (ページ 178-186)