第 9 章 多項式について
16.2 代入と評価に関連する函数
’
単引用符’はMaximaによる評価を防止します.例えば,’(f(x))とする事でMaximaに式f(x)を評 価しない事を報せます.この場合,’f(x)はxに函数fを作用させ,その名詞型で返す形になります.
”
二つの単引用符”は特殊な評価を行います.例えば,’’%o4で%i4を再評価します.又,’’f(x)は函 数fをxに作用させて動詞型で返します.
(%i65) test:2*%pi;
(%o65) 2 %pi
(%i66) sin(test);
(%o66) 0
(%i67) test:%pi/4;
%pi
(%o67)
---4 (%i68) ’’%i66;
1/2 2
(%o68)
----2
(%i69) ’’sin(test);
(%o69) .7071067811865475
equal
equal(h式1>,h式2i)
is函数と一緒に使われ,h式1iとh式2iが(ratsimpで指定された)全ての可能な変数値に対して等
しい(又は等しくない)場合,又,その時に限ってtrue(又はfalse)を返します. xが不定元であって
もis(equal((x+1)^2,x^2+2*x+1))はtrueを返しますが, is((x+1)^2=x^2+2*x+1)はfalseを 返します.
is(rat(0)=0)はfalseですが,is(equal(rat(0),0))はtrueとなる事に注意して下さい.もし,equalで 判別出来ない場合,同値だが簡易化された形式で返されますが,=を使っていれば常にtrueかfalse が返されます. 式中の全ての変数は実数値であると予め仮定しています.
尚,ev(式,pred)はis(式)と同値です.
(c1) is(x\^2 >= 2*x-1);
(d1) true
166 第16章 Maximaによる評価 (c2) assume(a>1);
(d2) done
(c3) is(log(log(a+1)+1)>0 and a^2+1>2*a);
(d3) true
is
is(h述語i)
h述語iが,Maximaの文脈や宣言等に含まれている事象に適合するかどうかを判定します.isが trueと返すのは,h述語iに含まれる変数に関して,全ての値で述語がtrueとなる場合で,そうでな
い場合はfalseを返します.それ以外はprederrorの設定に依存します.
isはprederrorがtrueの場合はエラーを出力を行い,falaseであればunknownを返します.
eval
eval(h式i)
h式iの評価を行います.LISPのeval函数と同じ働きをします.
ev
ev(h式i,h引数1i,· · ·,h引数ni)
Maximaの最も強力で高機能の命令の一つです.h引数iで指定した環境でh式iを評価します.
評価は次の手順で実行されます.
1. 最初に以下の様に設定されたh引数iiを探索し,環境が設定されます.
• simp
与式を大域変数simpの設定とは無関係で簡易化を行います. 大域変数simpは,値が
falseの場合は簡易化を禁じる大域変数です.
• noeval
evの評価(以下の(4)を見よ)を中断します.これは他の大域変数と組合せたり,与式が 再評価されずに再簡易化が行われるので便利です.
• expand
与式の展開を行います.尚,expand(m,n)でmaxposexとmaxnegexの値にm,nを各々設 定して展開を行います.
• detout
与式で計算した逆行列に対し,その行列式を逆行列の外に置いたままにして各要素を割 らないでおきます.
• diff
与式内部の指定された全ての微分を実行します.
• derivlist(h変数1i,· · ·,h変数ni)
指定した変数に対し,微分を実行します.
• float
非整数の有理数を浮動点小数に変換します.
• numer
数値変数を持つ幾つかの数学函数(指数函数を含む)は浮動点小数で評価され,与式中の 変数で,数値を割当てられたものは,割当てられた値で置換えます. 又,大域変数floatも 入ります.
• pred
述語(trueかfalseで評価されるべき式)が評価されます.
• eval
expの特別な後評価が生じる(以下の段階(5)を見よ).
• eがevflagとして宣言されたアトムであれば,与式の評価中はeをtrueとします.
• v:式(または代りにv=式)
与式の評価中に,式の値がvに束縛されます.vがMaximaのオプションであれば,与式 の評価の間,その値が用いられる事に注意して下さい. evに対して一つ以上の引数がこ の型であれば,並行して束縛が実行されます. もし,vがアトムでなければ,束縛ではなく 代入が実行されます.
• infeval
無限評価モードに入ります.この場合,evは与式の変化がなくなる迄,繰返し式を評価し ます.変数,ここではxとしますが,このモードで評価されるのを防ぐ為に,単にevに対 する引数としてx=’xを含めます.勿論,ev(x,x=x+1,infeval)の様な式は無限ループを生 成します.
• evfun
函数がevfunを持つ函数として宣言されていれば,その函数を与式に適用します. 任意
の別の函数名(例えば,sum)が与式中に現われると,これらの名前を動詞型として評価し, 与式に現われる函数(f(引数)とします)を与式評価の為にevの引数としてf(引数):=本 体を与えて局所的に定義しても構いません.
上で言及されていないアトム,添字された変数,又は添字された式が引数として与えられてい れば,それらが評価されて,その結果が方程式や割当てであれば, 指定された束縛や代入が実 行されます.結果がリストであれば,そのリストの成分は,それらがevに対して与えられた追 加の引数であるかの様に扱われます. この為,方程式のリスト(例えば,[x=1,y=aˆ2])やsolve
168 第16章 Maximaによる評価 で返されるものの様な方程式の名前のリスト(例えば,[e1,e2].ここで,e1とe2は方程式であ る)で与えても構いません.
ev函数の引数は,左から右への順番で処理される方程式の代入を除いて,任意の順序で与えら れます.そして,ev(exp,ratsimp,realpart)の様に合成されたevfuncは,realpart(ratsimp(exp)) として処理されます.
大域変数simp,numer,floatとpredはblock文の中で局所的に,或いはMaximaのトップレベ ルで大域的にそれらが再設定される迄,効果を持ち続ける様に設定していても構いません.
与式がCRE形式であれば,evは結果をCRE形式で返しますが,大域変数のnumerとfloat両 方共trueにはなりません.
2. 段階(1)の間,引数か,もしも値が方程式であれば,ある引数の変数中で方程式の左側に現れ る添字されていない変数のリストが作られます.
与式中の変数(配列函数に無関係の添字された変数と添字されていない変数の両方)は,それ らの大域変数値で置換えられますが,このリストに現れるものは除外されます.通常,与式は ラベルであるか(以下の(c2)の様に) %であり,evがそれに作用しても良い様に,この段階は 単純にラベルによって名付けられた式を見出します.
3. 任意の下添字が引数で指定されていれば,それらは直ちに実行されます.
4. 結果の式は(引数の内の一つがnoevalで無い限り)その様に再評価され,それから引数に従っ て簡易化されます.任意の函数の与式での呼出しは,その中の変数が評価された後に実行され ます.それ故,ev(f(x))がf(ev(x))の様に振舞う事に注意して下さい.
5. 引数のうち一つがevalであれば,(3)と(4)の段階を繰り返す.
(c1) sin(x)+cos(y)+(w+1)^2+’diff(sin(w),w);
d 2
(d1) cos(y) + sin(x) + -- sin(w) + (w + 1) dw
(c2) ev(%,sin,expand,diff,x=2,y=1);
2
(d2) cos(w) + w + 2 w + cos(1) + 1.90929742
ev函数は,Maximaのトップレベルでは,ev()無しにその引数を何処で入力しても構いません.つ まり,次の様に簡単に書いても良いのです.
ev函数の別の表記方法
¶ ³
exp, arg1, ...,argn.
µ ´
これは他の式,つまり,函数やblock等での成分として記述する事は出来ません.
(c4) x+y,x:a+y,y:2;
(d4) y + a + 2
(並行した束縛の過程に注意せよ) (c5) 2*x-3*y=3$
(c6) -3*x+2*y=-4$
(c7) solve([d5,d6]);
solution
1
(e7) y =
-5 6
(e8) x =
-5
(d8) [e7, e8]
(c9) d6,d8;
(d9) - 4 = - 4
(c10) x+1/x > gamma(1/2);
1
(d10) x + - > sqrt(%pi) x
(c11) %,numer,x=1/2;
(d11) 2.5 > 1.7724539 (c12) %,pred;
(d12) true
第 17 章 代入操作
17.1 はじめに
多項式の計算で,方程式を求めた結果を早速,式に代入したい事があります. この場合,規則によ る代入や,直接変数に対してx:aの様に割当てを行う事もありますが,これらとは別にsubst等の代 入用の函数を用いる方法があります.