Maxima
※Maxima
https://maxima.sourceforge.io/
※wxMaxima
https://wxmaxima-developers.github.io/wxmaxima/
┌──┐
│目次│
├──┘
│ ◆操作方法、キー key
│ ◆文法 gra
│ ◆ファイル操作 file
│ ◆解法 sol
│ ◆グラフ生成 graph
│ ◆リスト操作 list
│ ◆lisp呼び出し call
│ ◆主要関数 func
│ ◆主要変数 var
│☆Common Lisp cl
│ ◆変数と記号 clv
│ ◆関数 clf
│ ◆スペシャルフォーム clspe
│ ◆組み込み関数 clemb
_◇終了命令
│ quit();
_◇割り込み
│ ^C キー
│ ^Gキー コンソール割込み
_◇セル
│ 入力セルの評価 SHIFT-RETURN
│ 全入力セルの評価 CTRL-R
_◇命令末
│ 「;」を入力してから[RETURN]で命令末。
│ ⇒この場合は結果を表示。
│ 「$」を入力してから[RETURN]でも命令末。
│ ⇒この場合は結果を非表示。
_◇数値化して表示
│ 例)
│ %, numer;
│ ※1つ前の式を数値にして表示
_◇ヘルプシステム
│ describe(string)
│ stringに関するヘルプを表示
│ example(topic)
│ topicの例を表示
※? 関数名;
でもHelpが表示される。
_◇入出力の参照
①直前の出力
│ %
②n番目の出力
│ %on
※nは出力番号
③n番目の入力
│ %in
_◇実行環境の操作
│ system(“システムコマンド”);
│ システムコマンドを実行する。
│ ただし、別プロセスで実行される
│ ⇒そのプロセスのstdoutはwxMaximaに自動的に送り返されることはない。
│ ⇒戻り値だけが戻される
_◇定数
│ %i 虚数単位
│ %pi π
│ %e 自然対数の底
│ lim[n→∞]{1+(1/n)}^n=2.71828…
※複素数の表現
│ 実部 + 虚部 * %i
│ として表現する。
│ inf
│ +∞
│ infinity
│ 複素無限大
│ minf
│ -∞
│ %gamma
│ lim[n→∞]{Σ[k=1:n](1/k)-log(n)}=0.5772…
│ %phi
(1+√5)/2 = 1.618…
_◇変数
│ 変数として扱える文字は英小文字、大文字、
│ 「_」およびalphabetic属性の与えられた文字および数字
│ 数字は先頭になることはできない。
例)通常変数として使えない「@」を変数名として使えるようにするため、alphabeticで宣言する
│ declare(@,alphabetic);
※演算子記号などはalphabetic宣言できない。
※変数には順序がある。
│ ⇒項順序によって多項式の項の順番の並び替えが行われる
│ ⇒基本的には辞書式順序
│ ⇒変数順序は局所的に変更できる
ordergreat( <v1>,… )
orderless( <v1>,… )
unorder()
│ 定義した変数順序を解除する
│ 順序を調べるには
│ ordergreatp( 式1,式2 )
│ orderlessp( 式1,式2 )
※変数の消去
│ kill(変数名1, 変数名2, …);
│ kill(all);
_◇代入
│ 変数名: 変数の内容;
│ ⇒変数には数だけでなく、式も代入できる
│ ⇒ただし、式の中で変数を参照するように記述してもその式の値が評価されることはない
│ ⇒式を引数とする関数に変数をわたして、式を変形させたり、解を得ることはできる。
※変数定義(代入)
_◇文脈
│ 最上位 global (根本の親文脈)
│ 立ち上げ時の初期文脈
│ initial
※事実や仮定をおくときは
│ assume( 式1,…)
※消去は
│ forget( 述語,… )
※調べるときは
│ facts()
│ facts(文脈)
│ facts( 事項 )
※文脈操作関数
│ activate
│ deactivate
│ killcontext
│ newcontext
│ supcontext
_◇属性
_◇制御変数
①fpprec
│ ビッグ浮動小数の精度
例)
│ fpprec: 100;
②algebraic
│ 分母を有理化する
│ algebraic: true;
例)
│ float(realpart((40*%i-60)/(9*%i-18))), algebraic: ture;
_◇演算子
①加算
│ a + b
②減算
│ a – b
③乗算
│ a * b
④除算
│ a / b
⑤べき乗
│ a ^ b
│ ※ ** でも代用できる。
│ ※行列のべき乗は ^^
⑥変数vへのxの代入
│ v : x
⑦等号
│ a = b
⑧aをbと定義する
│ a := b
例)関数の定義
│ F(x) := x^2;
※以後Fという名でこの関数を参照できる。
⑨行列の積
│ .
(10)階乗
│ !
※二重階乗 !!
│ ⇒1つおきの階乗
(11)式を評価しない
│ ’
_◇条件判断
<
<=
=
# 等しくない
>
>=
and
or
not
※Predicate functions
│ 多数あり
scalarp(exp)
│ スカラーなら真を返す
_◇関数定義
│ 関数名(変数名):=関数式;
例)
│ p(x,y,s,t):=x^s*y^t;
※f(x):=%のように計算結果で関数を定義することはできない。
│ ⇒この場合はdefineを使う。
例)
│ define( f(x), %o12);
※関数として定義した場合
│ f(1)のように変数に値を代入して結果を得るだけでなく
│ 関数式の中で使われる変数に
│ x:1のように値を代入しておいて、
│ f(x)のように呼び出して結果を得ることもできる
_◇式の評価(一時的)
│ 一時的に式に値を代入し、評価することができる。
│ ev(式,条件)
例)
│ c:2*x;
│ ⇒通常このままでは c を値で評価することはできない
│ ev(c,x=3);
│ ⇒cに代入された式の値をxに3を代入して求めることができる
│ ⇒cの定義は変わらない
※evの省略記法
│ evを書かず
│ 式,条件
│ だけでも一時的評価を行うことができる
_◇リストの取り出し、右辺、左辺のとりだし
│ 関数によっては2個の解を [ ]リストで返してくる
│ リストの要素は、リストが代入された変数名をつかって
│ 変数名[1] … 最初の要素
│ 変数名[2] … 2番目の要素
│ のように取り出せる
※変数に代入されているのが=で結ばれた式の場合
│ 以下の関数で右辺と左辺を取り出すことができる
│ rhs() 右辺
│ lhs() 左辺
_◇浮動小数点表示
│ float()
│ 16桁
│ bfloat()
│ 16桁以上
│ に値を渡す
│ ⇒bfloat()の表示桁数は fpprec に桁数を代入する
※浮動小数点数を関数に渡せば、浮動小数点数の結果が返る
_◇行末
①結果を表示しない行末
│ @
②結果を表示する行末
│ ;
_◇コメント
/* */
_◇ネスト
│ 算法の優先順位は ( )で制御する。
│ 範囲の指定や、リスト表現には [ ]を使う。
_◇制御構造
①分岐
│ if 条件式 then 真の場合の処理 else 偽の場合の処理;
※変数の属性を問う
│ integerp 整数か
│ evenp 偶数か
│ oddp 奇数か
│ primep 素数か
│ ratnump 有理数か
│ listp リストか
│ matrixp 行列か
※条件式は and や orで結合できる。
※3つ以上に分岐する場合は、elseの後に if を与える
例)判定する関数の定義
│ fx(x):=if x>90 then 2 else 1;
②繰り返し
│ for カウンタ名:初期値 step 増分 thru 終了値 do(反復);
│ for カウンタ名:初期値 step 増分 while 条件式 do(反復);
※stepは省略可能. その場合はi:i+1とみなす。
※doの括弧の中に複数の作業を記述するときは「,」
例)
│ for i:1 thru 100 do (…);
③ブロック化
│ 手順をまとめて一つの関数にする
│ block([局所変数のリスト],一連の手続き,return(結果));
_◇MAP一族
①map(f_n, exp_1, …, exp_n)
│ f_nはn個の引数を持つ関数
│ exp_n個の引数(リスト)の各要素についてf_nを適用した結果を返す。
│ 引数がリストでなく式であれば、各項について適用する
②mapatom(exp)
│ 引数がmapによってアトムと認識されるときtrueとなる
③maplist(f_n, exp_1, …, exp_n)
④scanmap(func, exp)
│ funcを再帰的にexpに適用する
_◇lisp
│ :lisp $expr;
│ 後に続く文字列をLISPに直接渡して結果をMaximaに戻す
※to_lisp()
│ LISPを表に呼び出す
※(to-maxima)
│ LISPからmaximaへもどる
※LISPのデバッガからの脱出
│ :q
※Maximaでのアトムの内部表現には先頭に「$」がつく
│ ⇒LISPで$つきのアトムに値を割り当てることができる
※Maximaで先頭に「?」をつけた関数は裏で「?」のない同名のLISP関数が呼ばれている
_◇手順や結果の記録
│ save(“ファイル名”,all);
│ セッションの全てを保存。
│ save(“ファイル名”,%inn,%onn,…);
│ %i, %oで始まる入出力のセルのいセーブ
※何を実行したかの確認
│ playback(all);
│ playback([開始セル番号,終了セル番号]);
※入力部分のみの保存
│ stringout(“ファイル名”, input);
_◇バッチとデモ
│ batch(“ファイル名”)
│ 入力部分のみが保存されたバッチファイルを実行する
│ demo(“ファイル名”)
│ 入力部分のみが保存されたバッチファイルを実行する
│ 1行実行する毎にプロンプトを出す
_◇保存セッションの読み込み
│ loadfile(“ファイル名”);
│ 保存されているセッションを読み込む。
※loadfileは、現在のセッションとセル番号が重なると上書きする。
_◇パッケージの読み込み
│ load(パッケージ名);
例)
│ load(newton);
│ ⇒ニュートン法のパッケージを読み込む
_◇データの入出力
※csv形式入出力
│ load(“numericalio.lisp”);
│ とすることで、
│ read_list(“ファイル名”,’csv);
│ read_matrix(“ファイル名”,’csv);
│ write_data(行列名,”ファイル名”,’csv);
│ などが追加される。
例)
│ lst:readlist(“C:/home/matrix.csv”,’csv);
例)
│ load(“numericalio”);
│ でもよい。(.mac形式のパッケージがある)
読み込むデータファイル: c:/pgm/var/dat.csv 1,1.1 2,2.1 3,3.1 4,4.1 リストとしての読み込みの結果 data: read_list("c:/pgm/var/dat.csv", 'csv); [1,1.1,2,2.1,3,3.1,4,4.1] 行列としての読み込みの結果 M: read_matrix("c:/pgm/var/dat.csv", 'csv); matrix([1,1.1],[2,2.1],[3,3.1],[4,4.1])
_◇整式の変形
①多項式の和
│ (2*x^3+x-3*x^2+4)+(8*x^3-4-7*x^2+3*x);
②多項式の展開(乗法)
│ expand((x+2)*(x^2-3*x+1));
│ expand((x^2+x+1)*(x^2-x+1));
│ expand((a+b)^5);
※radcan()でもよい
③整式の除法
│ divide(x^3+x+3, x^2+2*x-1);
④求める変数の係数をつむぎだす。
│ ratcoef(a*x^2+b*x^2+c*x+d,x^2);
⑤因数分解
│ factor(2*x^2-5*x+2);
│ factor(1-a^2+2*a*b-b^2);
⑥有理式の通分
│ ratsimp(2/(x+1)-1/(x-1));
⑦部分分数展開
│ partfrac((x^3+2*x-4*x-3)/(x+1),x);
_◇2次方程式の変形例
│ 元の方程式
│ x^2/9-(m*x-1)^2/4=1
│ まず展開する
│ expand(x^2/9-(m*x-1)^2/4=1);
│ 項を左辺に集める
│ lhs(%)-rhs(%)=0;
│ 次数毎に係数を得る(変形済みの式が%o5にあった場合)
│ a: coeff(%o5,x,2);
│ b: coeff(%o5,x,1);
│ c: coeff(%o5,x,0);
│ 判別式b^2-4*a*cを0とするようなmを求める
│ solve(b^2-4*a*c=0,m);
_◇実部、虚部のとりだし
z1, z2を定義する (%i1) z1:R1+1/(%i*omega*C1); (%o1) R1-%i/(omega*C1) (%i2) z2:1/(%i*omega*C2+(1/R2)); (%o2) 1/(1/R2+%i*omega*C2) z1, z2をつかってVipを定義する (%i6) Vip:z2*Vo/(z1+z2); (%o6) Vo/((1/(1/R2+%i*omega*C2)+R1-%i/(omega*C1))*(1/R2+%i*omega*C2)) 分母を取り出す (%i7) denom(%); (%o7) (1/(1/R2+%i*omega*C2)+R1-%i/(omega*C1))*(1/R2+%i*omega*C2) 分母の実部を取り出す (%i8) realpart(%o7); (%o8) (1/((1/R2^2+omega^2*C2^2)*R2)+R1)/R2-omega*C2*(-(omega*C2)/(1/R2^2+omega^2*C2^2)-1/(omega*C1)) 取り出した実部を整理する (%i9) ratsimp(%); (%o9) ((C2+C1)*R2+C1*R1)/(C1*R2) 分母の虚部を取り出す (%i10) imagpart(%o7); (%o10) omega*C2*(1/((1/R2^2+omega^2*C2^2)*R2)+R1)+(-(omega*C2)/(1/R2^2+omega^2*C2^2)-1/(omega*C1))/R2 取り出した虚部を整理する (%i11) ratsimp(%); (%o11) (omega^2*C1*C2*R1*R2-1)/(omega*C1*R2) 実部を展開する (%i12) expand(%); (%o12) omega*C2*R1-1/(omega*C1*R2) 実部を展開する (%i13) expand(%o9); (%o13) R1/R2+C2/C1+1
_◇方程式を解く
①2次方程式
│ solve(a*x^2+b*x+c=0,x);
②3次方程式を解いた上で、解を数値近似する
│ float(expand(solve((x^3+3*x-7)=0,x)));
※solveの結果をfloatやbfloatに渡しても括弧を展開しない場合
│ ⇒数値評価の結果をさらにexpandに渡す
│ expand(float(solve(方程式,解かせる変数)));
_◇連立方程式の解をもとめる
①solveで解く
│ solve([方程式のリスト],[解かせる変数のリスト]);
│ solve([2*x+4*y=30,x+y=12],[x,y]);
※不足方程式は不定変数%r_nを用いて解を記述してくる。
│ ⇒solve: dependent equations eliminated:
│ solve([2*x+4*y-3*z=30,x+y+z=12],[x,y,z]);
※不能方程式は 空リスト[]が返る
│ (旧:不能方程式は、Inconsistent equations エラーとなる。)
例)
│ solve([x+y=3, 2*x+2*y=0],[x,y]);
②方程式を定義したのち、algsys関数により結果を求める
例)
(%i1) e1: 3*x + y = 5;
(%o1) y+3*x=5
(%i2) e2: 5*x – y = 3;
(%o2) 5*x-y=3
(%i3) algsys([e1, e2], [x, y]);
(%o3) [[x=1,y=2]]
例)リスト処理関数により変数毎に解を取り出す。
(%i20) first(first(algsys([e1, e2, e3],[I1, I2, I3])));
(%o20) I1=-(5*%i+10)/(%i-10)
例)複素数解について、浮動小数表現で値を取り出す。
float(realpart( -(5*%i+10)/(%i-10) )), algebraic: ture;
float(imagpart( -(5*%i+10)/(%i-10) )), algebraic: ture;
_◇逆関数とそのグラフ
f(x):=(2*x-1)/(x+1); f1:y=f(x); f2:first(solve( f1, x )); define(g(x), subst(x,y,rhs(f2))); plot2d([f(x),g(x),x],[x,-3,3],[y,-50,50]);
_◇区間別の関数定義
│ if then else で記述すればよい
例)
│ f(x):=if x<0 then -1 else if x>=0 then 1;
_◇媒介変数tを消去してxとyの関係式を導く
(1) x=-1+t y=3+2t
(%i1) x=-1+t;
(%o1) x=t-1
(%i2) solve([%], [t]);
(%o2) [t=x+1]
(%i6) t:rhs(%o2[1]);
(%o6) x+1
(%i7) y=3+2*t;
(%o7) y=2*(x+1)+3
(%i8) ratsimp(%);
(%o8) y=2*x+5
_◇三角関数
※引数にπ/6の整数倍の定数項がある場合
│ 自動的に簡略化される
│ 引数が虚数だけであれば三角関数と双曲線関数の変換が行われる。
│ 他の場合、自動的な簡略化は行われない。
※exponentializeフラグをtrueにすると、三角関数、双曲線関数は指数関数で表される。
①加法定理、倍角公式などを用いて引数を関数外へ展開
│ trigexpand(sin(2*x)/2);
│ trigexpand(sin(x+y));
②三角関数の積を半角、積和公式などで引数に収める。
│ trigreduce(cos(x)*sin(x));
③三角関数それぞれの係数をまとめ単純化する
│ trigsimp(cos(x)^2-sin(x)^2);
│ trigsimp(1-sin(x)^2);
④三角方程式
cos(x)-cos(2*x)+cos(3*x)=1 z=cos(x)と置く eqn:cos(x)-cos(2*x)+cos(3*x)=1; eqn2:trigexpand(eqn); eqn3:ratsubst(1-z^2,sin(x)^2,eqn2); eqn4:ratsubst(z,cos(x),eqn3); zz:solve(eqn4,z); z1:rhs(first(zz)); z2:rhs(second(zz)); z3:rhs(third(zz)); if (z1 >= -1) and (z1 <= 1) then acos(z1); if (z2 >= -1) and (z2 <= 1) then acos(z2); if (z3 >= -1) and (z3 <= 1) then acos(z3);
⑤三角方程式
2*cos(x)^2-7*sin(x)+2=0 z=sin(x)と置く eqn:2*cos(x)^2-7*sin(x)+2=0; eqn:ratsubst(1-z^2,cos(x)^2,eqn); eqn:ratsubst(z,sin(x),eqn); zz:solve(eqn,z); z1:rhs(first(zz)); z2:rhs(second(zz)); if (z1 >= -1) and (z1 <= 1) then asin(z1); if (z2 >= -1) and (z2 <= 1) then asin(z2);
_◇極限
①
│ seq1:(-2*n^2+1)/(5*n^2);
│ limit(seq1,n,inf);
②
│ seq1:sqrt(3*n^2+1)/(sqrt(n^2+1)+sqrt(n));
│ limit(seq1,n,inf);
③
│ seq1:(1+h)^(1/h);
│ limit(seq1,h,0);
_◇微分
①x^xの微分
│ diff(x^x,x);
②
│ diff(sin(x^2),x,2);
③
│ diff(sin(x*y),x,2,y,2);
④全微分
│ diff(x^2*y^2);
※del(x), del(y)は、微小量dx, dyである。
⑤
│ diff(log(1-3*x),x);
⑥
│ diff(log(x/(1+cos(x))),x);
│ trigsimp(%);
⑦
│ diff(sin(x)/(1+cos(x)),x);
│ trigsimp(%);
⑧
│ diff(1/sqrt(tan(x)),x);
│ trigreduce(%);
_◇陰関数の微分
y^2+x^2=a^2 depends(y,x) diff(y^2+x^2-a^2,x); 2*y*('diff(y,x,1))+2*x solve(%,diff(y,x)); 'diff(y,x,1)=-x/y
_◇関数の増減、極値、変曲点を求める
①f(x)=x/(x+1)^2
│ f(x):=x/(x+1)^2;
│ solve( diff(f(x),x)=0,x);
│ ev(f(x),%);
│ 2階微分する
│ d2: diff(f(x), x, 2);
│ solve( d2=0, x);
│ ev(f(x), %);
_◇積分
①1/(x^3+1)の積分
│ integrate(1/(x^3+1),x);
②
│ integrate(a*x^2+b*x+c,x);
③定積分
│ integrate(exp(-x^2),x,0,inf);
※erf
│ 誤差関数。
│ erf(x)=∫[-x:x]((e^t^2)/√π)dt。
│ 特殊関数が混ざるとfloatなどで数値化できなくなる。
_◇微分方程式の解を求める(その1)
│ 方程式を定義したのち、atvalue関数で初期値を与え、desolve関数で結果を求める。
│ 求める関数がf(x)ならばf(x)のように記述すること。
例)
(%i1) eqn_1: ‘diff(p(z),z)=-c*g*p(z);
(%o1) ‘diff(p(z),z,1)=-c*g*p(z)
(%i2) atvalue(p(z),z=0,p0);
(%o2) p0
(%i3) desolve (eqn_1,p(z));
(%o3) p(z)=p0*%e^(-c*g*z)
①空気抵抗を考慮した自然落下の運動方程式
※m*x”(t)=mg-r*x'(t), x'(0)=0,x(0)=h
│ atvalue(x(t),t=0,h);
│ atvalue(diff(x(t),t),t=0,0);
│ desolve(m*diff(x(t),t,2)=m*g-r*diff(x(t),t), x(t));
②CR微分回路
│ ┌─┐
│ ○─┤C├┬─○
│ Vi└─┘│Vo
│ ┌┴┐
│ i↓│R│
│ └┬┘
│ ○────┴─○
│ eqn: Vi=q(t)/C+R*’diff(q(t),t);
│ atvalue(q(t),t=0,q0);
│ desolve(eqn,q(t));
│ q(t)=((q0*C-Vi*C^2)*%e^(-t/(C*R)))/C+Vi*C
│ diff(%o9, t);
│ ⇒’diff(q(t),t,1)=-((q0*C-Vi*C^2)*%e^(-t/(C*R)))/(C^2*R)Vi=q/C+R*’diff(q(t),t);
│ Vo=R*i=R*’diff(q(t),t);
※q0の項を0とおけば
│ Vo=-Vi*%e^(-t/(C*R))
③RC積分回路
│ ┌─┐
│ ○─┤R├┬─○
│ Vi└─┘│Vo
│ ┌┴┐
│ i↓│C│
│ └┬┘
│ ○────┴─○
│ eqn: Vi=q(t)/C+R*’diff(q(t),t);
│ tvalue(q(t),t=0,0);
│ esolve(eqn,q(t));
│ ただし、Vo=q(t)/Cなので
│ Vo=Vi(1-%e^(-t/(C*R)))
_◇ベクトル演算
│ リストを数ベクトルとして扱う.
│ v1:[1,0,2,-1];
│ v2:[2,1,-2,0];
※ベクトルの特定の成分を指定するには、要素番号を指定する
例)
│ v1[2];
①加減、スカラー倍
│ v1+v2;
│ 3*v1;
│ -2*v1+3*v2;
②内積
│ v1.v2;
③ベクトルの大きさ(ノルム)||v||
│ 自身との内積の平方根をとればよい。
│ sqrt(v1.v1);
④外積(3次元)
│ v3:[a,b,c];
│ v4:[x,y,z];
│ transpose(adjoint(matrix(v3,v4,[1,1,1])))[3];
_◇行列演算
│ 複数の数ベクトルを行として、matrixで行列属性を与える。
│ M1:matrix([1,-2],[2,1]);
│ M2:matrix([2,-1],[1,2]);
※行列の特定の成分を指定するには、要素番号を指定する
例)
│ M1[1,2];
①加法とスカラー倍
│ -2*M1+3*M2;
②行列の積
│ matrix([1,-2],[2,1]).[2,3];
│ M1:matrix([1,-2,3],[2,1,0]);
│ M2:matrix([2,-1],[1,2],[-1,1]);
│ M1.M2;
│ M2.M1;
③行列の累乗
│ ^^で記述できる。
│ M3:matrix([1,1],[1,0]);
│ M3^^100;
④行列とベクトルの演算
│ ベクトルが「.」の前にあると行ベクトル、後にあれば列ベクトルと判断される。
│ mtx:matrix([1,-2],[2,1]);
│ vec:[3,-2];
│ mtx.vec;
│ vec.mtx;
⑤転置行列
│ mtx:matrix([2,-1,0,0],[-1,2,-1,0],[0,-1,2,-1]);
│ transpose(mtx);
⑥行と列のとりだし
│ col(mtx,1);
│ row(mtx,1);
⑦単位行列の生成
│ ident(5);
⑧対角行列の生成
│ apply(matrix,makelist(ident(次数)[i]*対角成分リスト[i],i,1,次数));
│ apply(matrix,makelist(ident(4)[i]*[2,3,5,7][i],i,1,4));
⑨零行列の発生
│ zeromatrix(4,4);
⑩行列式
│ expand(determinant(matrix([1-t,t,1],[-t,-1,t-1],[1,1-t,t])));
⑪余因子行列を求める。
│ adjoint(matrix([1,-2],[2,1]));
⑫逆行列を求める。
│ invert(matrix([1,-2],[2,1]));
_◇モンテカルロ法
shikou: 10000$ mieta: 0$ for i: 1 thru shikou do( x: random(9.0), y: random(9.0), if abs(x-y)<1.0 then mieta: mieta+1 )$ kakuritu: float(mieta/shikou)$ print("simulation=",kakuritu)$ print("theory=",float(17/81))$
_◇ニュートン法
│ 数値的に関数の零点を求める。
│ load(newton);
│ の後、
│ newton(零点を求める関数,探索開始値);
_◇数値積分
│ load(simpsn);
①台形公式
│ traprule(関数名,初期値,終了値,等分数);
②シンプソン公式
│ simpson(関数名,初期値,終了値,等分数);
※被積分関数(1変数)をあらかじめ定義しておく。
例)
fresnelsin(x):=sin(x^2/2);
float(traprule(fresnelsin,0,2,100));
float(simpson(fresnelsin,0,2,100));
_◇ラプラス変換
│ laplace(f(t),t,s);
│ ilt(g(s),s,t);
_◇fft
│ load(fft);
│ fft(f(t),t,w);
│ ift(f(t),t,w);
※demo(fft)で使用方法例を見ることができる。
※fが実部、hが虚部だが、hをすべて0にすることで実部のみの数列に適応可能。
│ fとhの要素数は2のべき乗であること。
│ 結果はfとhを書き換えて返す。
│ fft(g,h)
_◇ベクトル解析
│ load(VECT);
※vect.demあり
※内積と外積、勾配、発散、回転やLaplace演算子を含む記号式の纏めと簡易化が行える
※含まれる命令
VECTORSIMP、SCALEFACTORS、EXPRESS、POTENTIALとVECTORPOTENTIAL
※DESCRIBEを実行するかPRINTFILE(VECT,USAGE,SHARE);で詳細を読む事が出来る。
※警告: VECTパッケージの読み込みを行うと”.”演算子を行列の非可換積では無く、可換演算子であると宣言してしまう。
_◇不等式をとく
│ load(fourier_elim);
※以下が使えるようになる
│ fourier_elim([f],[x])
例)
fourier_elim([x/2+2/x>2],[x]);
[0<x,x<2] or [2<x]
_◇浮動小数点に変換する
※float()に数値評価する式を引き渡す
※指数精度を
│ fpprec:桁数;
│ で指定し、
│ bfloat()に数値評価する式を渡す
_◇最小二乗法
例)
│ lsquares_estimates(M,[x,y], y=A*x+B, [A,B]);
│ M データ行列
│ [x,y] 変数
│ y=A*x+B 式
│ [A,B] 求めるパラメータ
※マニュアルではload(lsquares)が必要なように読めるが、wxMaxima 0.8.5ではloadせずとも使える。
_◇関数の2次元プロット
│ 陽関数、媒介変数のプロット
│ ⇒陰関数、極座標プロットは drawパッケージによる
①サイン関数
│ plot2d(sin(x), [x, -5, 5]);
②不連続点がある場合の、値域の制限
│ plot2d(1/(x-1)+1,[x,-5,5],[y,-5,5]);
│ ⇒yはつねに縦軸を示す変数と解釈される
※不連続点がある場合
│ wxplot2d(x*sin(1/x), [x,-2,2]);
│ x=0では値が計算できない。以下のようなメッセージが出力されるがプロットは可能
│ plot2d: expression evaluates to non-numeric value somewhere in plotting range.
③cos(x)と複数の次数のテイラー近似の同時描画
│ plot2d([cos(x),1-x^2/2,1-x^2/2+x^4/24,1-x^2/2+x^4/24-x^6/720],[x,-2*%pi,2*%pi],[y,-4,4]);
④グラフの交点
│ plot2d([exp(x),3-x^2],[x,-2,2],[y,-1,4]);
⑤媒介変数表示関数のプロット
│ x=cos(t), y=sin(t), 0≦t≦2π
※デフォルトでは媒介変数の範囲を10等分に区分するだけ
│ ⇒nticksで分割数を調整し、なめらかにする。
│ plot2d([parametric,cos(t),sin(t)],[t,0,2*%pi],[nticks,100]);
※縦横比を1:1にする
│ plot2d([parametric,cos(t),sin(t),[t,0,2*%pi],[nticks,50]],[gnuplot_preamble,”set size square”]);⑥楕円のプロット
│ x=a*cos(t), y=b*sin(t), 0≦t≦2π
│ wxplot2d([parametric,a*cos(t),b*sin(t)],[t,0,2*%pi],[nticks,100]);
⑦パラメトリックなグラフと通常のグラフの重ね合わせ
│ wxplot2d([[parametric,sqrt(5)*cos(t),sqrt(5/4)*sin(t)],[t,0,2*%pi],[nticks,100], (1/4)*x,-x+(5/2),-x-(5/2) ],[x,-2.5,2.5],[y,-2,2]);
_◇減衰振動のグラフ
│ plot2d(exp(-t)*cos(4*t),[t,0,2*%pi]);
_◇3次元グラフ
①z=x^2-y^2
│ plot3d(x^2-y^2,[x,-2,2],[y,-2,2],[grid,30,30]);
②z=x^3-3*x*y^2
│ plot3d(x^3-3*x*y^2,[x,-1,1],[y,-1,1]);
_◇drawパッケージ
│ 陰関数などもグラフ化できるパッケージ
│ 極座標もグラフ化できる
│ load(“draw”);
※implicit(式, x,x始点,x終点,y,y始点,y終点)
│ 陰関数のプロット
※explicit(式, x,x始点,x終点)
│ 陽関数のプロット
※color=色
│ プロット色の指定
※draw2d(コマンド, …)
①双曲線のプロット
│ draw2d(xaxis=true,yaxis=true,color=green,implicit(x^2-y^2-4*x+2*y+2=0,x,-2,4,y,-2,4));
②極座標のプロット
│ draw2d(user_preamble = “set grid polar; set size square”,
│ nticks = 200,
│ xrange = [-5,5],
│ yrange = [-5,5],
│ color = blue,
│ line_width = 3,
│ title = “Hyperbolic Spiral”,
│ polar(10/theta,theta,1,10*%pi) )$
_◇Maxima上のリスト
①データの各要素をコンマで区切り、全体を[]でくくる。
②リストの中には、数値、変数、数式、文字列だけでなくリストも入れることができるので、「ネストしたリスト」も作れる。
※文字列と変数を区別するために、文字列は「”」で括る。
③リストの要素を抽出するには
│ リスト変数名[要素番号];
※ネストしたリストの要素を抽出する例
│ lst[3][2];
│ 3行2列の要素を取り出す。
表現例)
│ [1, 2, 3]
④リストの要素を書き換えるには
│ リスト変数名[要素番号]: 値;
※リストのCommon List表現
│ ⇒Maxima内部では、Maximaの内部演算子を第0の成分として持つリストとして扱われている。
│ このため[ ] でくくられた要素の最初の成分は1から始まる
_◇append(list1, list2, …)
│ 2つ以上のリストを連結する。
_◇assoc(key, list)
│ 連想listの中でkeyを探す
│ あれば、値を返す
│ assoc(key, list, default)
│ keyが見つからなかったらdefault値を返す。
│ defaultを省略すると、default値はfalseである
_◇atom(exp)
│ expがアトム(数値か名前)なら真をかえす
_◇cons(elem, list)
│ リストの冒頭に要素elemを加える。
_◇copylist(list)
│ リストの複製を作る
_◇delete(exp1, exp2)
│ exp2に含まれるexp1を削除する
│ delete(exp1, exp2, int)
│ exp2に含まれるexp1を先頭からint個削除する
_◇emptyp(a)
│ aが空集合か、空リストなら真を返す
_◇endcons(elem, list)
│ リストの末尾に要素elemを加える。
_◇first(lis)
│ リストの最初の要素を取り出す
│ (first [1,2,3])
│ → 1, 2, 3
│ first (first [1,2,3]);
│ → 1
_◇get(a,i)
_◇last(exp)
│ expの末尾の成分を得る
_◇length(exp)
成分の数を返す
_◇listarith
_◇listp(exp)
リストであれば真を返す
_◇makelist(e, cnt, start, end)
│ リストの要素番号からリストを生成する。
│ 各要素を生成するときに適用される式
│ 通常cnt変数を使って記述するか、定数であれば
│ 0
│ []
│ などのようにする
例)
│ makelist(i^2,i,1,5);
│ makelist(makelist(i*j,i,1,3),j,1,4);
_◇member(exp, list)
│ expがlistに含まれていれば真を返す
_◇rest(lis,n)
│ n>0 リストの冒頭をn個除いた残りを得る
│ n<0 リストの末尾をn個除いた残りを得る
_◇reverse(lis)
_◇second(lis)
│ リストlisの第2の要素を取り出す
_◇sort(list [, option])
│ リストをソートする。
※降順に並べる
│ sort(リスト, ordergreatp);
│ reverse(sort(リスト));
_◇third(lis)
│ リストlisの第3の要素を取り出す
_◇unique(list)
│ リストの重複しない要素を返す
◆lisp呼び出し
│ :lisp関数により、直接lispの関数を呼び出すことができる。
例)
│ :lisp (car ‘(a b c));
│ → A
例)
│ :lisp (defun ax (x) (+ x 33));
│ :lisp (ax 4);
※lispの関数を、頭に?をつけることで呼び出すこともできる
│ ?truncate
※$で始まるLispシンボル
│ ⇒Maximaシンボル
※?で始まるMaximaシンボル
│ ⇒?抜きのLispシンボル
※Lispシンボル中のハイフン、アスタリスクなど特殊文字
│ ⇒Maxima上ではバックスラッシでエスケープ
※Maximaとかぶる一部のLisp関数はシャドウされている
_◇abs(x)
│ xの絶対値を求める。
例)
│ abs(1+%i);
_◇algsys(x)
│ 連立方程式を解く
例)
│ algsys([e1,e2,e3],[x,y,z]);
_◇allroots(e)
│ 等式eを満たす数値解を求める。
例)
│ allroots(x^5-3*x^4-3*x^3-8*x^2+8*x-5=0);
_◇array(name,type,dim_1,…,dim_n)
│ n次元でそれぞれ、dim_1,…,dim_nの要素(0~dim)を持つ、typeで指定された形のアレイを作る。
例)
│ array([g,h,xa],float,31);
│ 32個の要素を持つ1次元の浮動小数アレイg,h,xaを作る。
_◇asin, acos, atan, asec, acsc, acot
│ 逆三角関数。ラジアンで値が返る。
_◇asinh, acosh, atanh, asech, acsch
逆双曲線関数
_◇assume(cond)
│ 式を簡単化する最などの仮定や等式を設定する。
│ assume(x>0);
_◇atvalue(expr,x1=a1,c)
│ x1=a1のときに、exprの値をcとする。
│ 初期値を与えるために使用する。
│ x1=a1部分は[]でリストとしても与えられる。
例)
│ (%i14) atvalue(‘diff(p(z),z),z=0, p0);
│ (%o14) p0
_◇append(a, b)
│ リストa, bを結合する。
例)
│ g: append(g, [g1, g2]),
_◇args( e )
│ 関数の引数を取り出す
_◇block([v_1, …, v_m], expr_1, …, expr_n)
│ expr_1…を順に評価し、最後に評価されたものを返す。
│ ローカル変数v_1…を[]内で定義できる。
│ (他はグローバルである。)
例)
│ block([x0: 0, y0:0], …);
_◇bfloat(e)
│ 浮動小数をビッグ形式に変換
※ビッグフロート形式では、末尾に B に続いて最高桁の指数が表示される。
例)
│ fpprec:50;
│ bfloat(%pi);
_◇cabs(x)
│ 複素絶対値
_◇csc(e)
│ cosec(e)=1/sin(e)
_◇cf(x)
│ 式xを連分数展開する
例)
│ cf(sqrt(2)),cflength=9;
_◇cfdisrep(x)
│ リスト形式の連分数xを普通の式に変換する
例)cfdisrep(%);
_◇cflength
│ 連分数展開の長さを指定する
_◇coeff
│ coeff(有理式,変数名,次数)
│ 「有理式」の「変数」の「次数」次項の係数を返す。
│ 定数項の場合は、次数を0とする
※多変数の場合はcoeff(coeff(と繰り返して全ての変数に対して次数を指定する
例)xを変数として書かれた2次式からDとなる式を求める
discriminant(exp2):=block( aT: coeff(exp2, x, 2), bT: coeff(exp2, x, 1), cT: coeff(exp2, x, 0), ratsimp( bT^2-4*aT*cT ) );
_◇cos(e)
│ ラジアンで与える
_◇cot(e)
│ cot(e)=1/tan(e)
│ ラジアンで与える
_◇denom(e)
│ 分母だけ取り出す
_◇diff(e, x)
│ 式eを変数xについて微分する。
※n次微分
│ diff(e, x, n)
※微分方程式等においては、
│ ’diff(e,x)という形で入力に使用することができる。
│ diff(関数,微分用変数1,階数1,微分用変数2,階数2,…);
※微分する変数がひとつの場合は、階数は省略可能。その場合は1階の偏導関数を求める。
※微分用変数を与えなければ全導関数を求める。
_◇divide(e1, e2)
│ 式e1を式e2で割る
例)
│ divide((x^3+x+3),(x^2+2*x-1),x);
│ =[x-2,6*x+1]
│ 商 x-2 余り 6*x+1
_◇depends(f1, x1,…)
│ 依存関係(独立変数、従属変数を定義する)
│ なにも宣言しなければdiff(y,x)は0であるが、
│ depends(y, x)
│ とすれば、dy/dx などとなる
_◇desolve(eqn,x)
│ 微分方程式eqnをxについて解く。連立微分方程式では、eqnおよびxを[]を使ってリストで与える。
例)
(%i16) desolve (eqn_1,p(z));
(%o16) p(z)=p(0)*%e^(-c*g*z)
_◇determinant(M)
│ 行列式det(M)を求める。
例)
determinant(matrix([a, b],[c, d]));
_◇exp(e);
│ 指数関数を求める。
※%eをつかって、演算子 ^ で記述しても良い。
_◇expand(e);
│ 式eを展開する
例)
expand((a+b)^2);
_◇factor(e)
│ 式eを因数分解する
例)
factor(x^5+5*x^4*y+10*x^3*y^2+10*x^2*y^3+5*x*y^4+y^5);
例)
factor(1/a+1/b);
※factorに自然数を与えると素因数分解もできる。
_◇fillarray(name,[val]);
│ アレイに値を満たす。
_◇float(x)
│ xを浮動小数点数に変換する
例)
│ float(17/222);
_◇for
│ 繰り返し
│ for i: n1 thru n2 do(a, b, c,…)
※整数値iをn1からn2まで変えながらa, b, c,…を順に実行する。
_◇gcd(a, b);
│ 最大公約数を求める。a, bは多項式をとれる。
_◇genmatrix(a, i_2, j_2)
│ 配列から行列を作り出す
例)
genmatix(配列名,右下の行,右下の列)
_◇imagpart(z)
│ 複素数zの虚数部をとる
例)
mycomplex(z):=ratsimp(realpart(z)+imagpart(z)*%i);
│ 複素数zの分母を実数化して表す。
_◇inpart(expr)
│ 関数などの中から引数をとりだすのに使う
_◇integrate(e,x)
│ 式eをxについて(不定)積分する
※不定積分
│ integrate(被積分関数,積分変数);
※定積分
│ integrate(被積分関数,積分変数,開始値,初期値);
_◇invert(m)
│ 逆行列を求める。
例)
invert(A);
_◇kill(v)
│ vの定義を消去する
※前の問題で定義した式や変数などを消さないと、後の問題で悪さをすることがあるので注意
_◇lcm(a, b);
※load(functs)必要
│ 最小公倍数を求める。a,bは多項式。
_◇limit(e, v, lim)
│ 極限を求める。
limit(関数,変数,近づける値,[plusかminus]);
│ plusの場合右極限
│ minusの場合左極限
│ 正の無限大に近づける場合はinf
│ 負の無限大に近づける場合はminf
例)
│ limit((1+1/n)^n,n,inf);
例)
│ f(x):=x/(1+x)^2
│ limit(f(x),x,-1,plus);
_◇log(e)
│ 自然対数を求める。
※常用対数であれば log(10.0)で割る。
例)
log(2.0)/log(10.0)
_◇matrix(M)
│ 行列を生成する。
例)H2(アマダール行列)
│ A: matrix([1,1],[1,-1]);
例)E(単位行列)
│ E: matrix([1,0],[0,1]);
例)行列の足し算
│ A + E;
例)行列の積
│ A . E;
_◇num(e)
│ 分子だけを取り出す。
_◇nusum(e,v,start,end)
│ 記号的に総和を求める。
例)
nusum(k^7,k,1,n);
nusum(k*r^k,k,1,n);
_◇sec(e)
│ sec(e)=1/cos(e)
│ ラジアンで与える
_◇sin(e)
│ sinをもとめる
│ ラジアンで与える
_◇sinh, cosh, tanh, sech, csch, coth
│ 双曲線関数
_◇signum(x)
│ sgn(x) =1 (x>0)
│ =0 (x=0)
│ =-1 (x<0)
_◇solve(e, v)
│ 方程式の求解。
│ 式eを変数vについて解く。
│ expが1変数であればvを省略可能。
│ eが等式でないなら=0と過程される。
│ vは関数f(x)などでもよい
│ solve(expr, x)
│ solv([eqn_l,…,eqn_n],[x_l,…,x_n])
例)solve(x^3-6*x-10=0, x);
例)
│ x+y-2*z=0
│ x-y-z=0
│ をx,yに関する連立方程式とみなして解く
│ solve([x+y-2*z=0, x-y-z=0],[x,y]);
_◇sqrt(e)
│ 平方根を求める
_◇sum(e,v,start,end);
│ 総和を求める。(数値的に)
│ sum(関数,添え字変数,初期値,終値);
例)
│ sum(i,i,1,30);
※初期値と終値が整数でなければ、∑の形の表現になったりもする。フラグで制御。
_◇tan(e)
│ ラジアンで与える
_◇taylor(e, v, c, r)
│ テイラー展開する。
│ taylor(関数,展開変数,展開の中心,近似次数);
例)
│ taylor(tan(x),x,0,9);
│ taylor(x/(1-x-x^2),x,0,7);
_◇trigexpand(expr)
│ 三角関数の引数の角に加法定理を適用し展開する。
例)
│ trigexpand(sin(10*x+y));
│ =cos(10*x)*sin(y)+sin(10*x)*cos(y)
_◇trigrat(expr)
│ 三角関数を含む有理式(分数の形)を整理する
例)
(%i4) trigrat(sin(3*a)/sin(a+%pi/3));
(%o4) sqrt(3)*sin(2*a)+cos(2*a)-1
_◇trigreduce(expr)
│ 三角関数の積やべき乗を、角の掛け算の形に変換する
例)
(%i3) trigreduce(sin(x)^2);
(%o3) (1-cos(2*x))/2
_◇trigsimp(expr)
│ 三角関数の変形に三平方の定理を適用する
_◇part(expr)
│ 式の一部を取り出す
_◇partfrac(e, v)
部分分数展開する。
_◇plot2d(e, op…)
│ 2次元プロット
│ plot2d (expr, x_range, …, options, …)
※expr
│ 式として与える場合は、xのレンジで一意に決まらねばならない。
│ 複数のグラフを同時にかくときは、[exp1, …, expn]の形で指定
※x_rangeの表記
│ [variable, min, max]
│ [discrete, [x list], [y list]]で、離散的な値を与えてプロットすることもできる。
│ [discrete, [[x1,y1],…,[xn,yn]]]の形でもよい。
│ [parametric, x_exp,y_exp,t_range]の形で{(x(t),y(t))} にtついて媒介変数tによるプロットも可能。
│ t_rangeは[t,0,%pi]のように指定。
│ ⇒デフォルトでは媒介変数の範囲を10等分してプロット
│ ⇒滑らかにするには[nticks,100]のように分割数と指定する
例)
│ plot2d([parametric,cos(t),sin(t),[t,0,2*%pi],[nticks,100]);
※値域の範囲を[y,-5,5]のように指定するとそこからはみ出す部分は描画しない
※optionの指定
│ 引数の無いオプションは、[option]
│ 引数のあるものは、[option,xxx]
※オプション
│ y 縦方向の範囲
│ xlabel xラベル
│ ylabel yラベル
│ logx x対数スケール
│ logy y対数スケール
│ legend 題名
│ ntics サンプル点の個数(デフォルト10)
│ style lines, points, linespoints, dots, impulese
│ lines(style)
│ 線の属性指定
│ [style,[lines,xxx,yyy]]
│ xxx 線の太さ
│ yyy 線の色(1~7)
│ points(style)
│ 点の属性指定
│ [style,[points,xxx,yyy,zzz]
│ xxx 点の半径
│ yyy 点の色(1~7)
│ zzz 点の形状(1~13)
※wxplot2d
例)wxplot2d(x^3-6*x-10,[x,-5,5]);
例)関数 F, G が定義されていたとして2つを重ねてプロット
│ wxplot2d([F, G], [x,-5,5]);
_◇plot3d(e, op…)
│ 3次元プロット
│ plot3d(関数式, [x成分変数名,開始,終了], [y成分変数名,開始,終了],オプション]);
※デフォルトではx、yとも30分割なので、[grid, xx, yy]オプションにより分割数を調整する。
※媒介変数表示の場合
│ x=f(s,t), y=g(s,t), z=h(s,t)
│ plot3d([f(s,t),g(s,t),h(s,t)],[s,開始,終了],[t,開始,終了],オプション);
_◇print(e)
│ eの評価結果を表示する
_◇product(e,v,start,end);
│ 総積を求める。(数値的に)
│ product(関数,添え字変数,初期値,終値);
例)
│ product(i,i,1,30);
※初期値と終値が整数でなければ、Πの形の表現になったりもする。フラグで制御。
_◇random(x)
│ 0以上x未満の乱数を返す
_◇rat(x)
│ xを正規化した分数にする
例)
│ rat(%);
_◇radcan(exp)
│ 指数、対数、根号などの含まれる式を簡約化する
_◇ratsimp(p)
│ 有理式を簡約化する
例)
ratsimp((25*x^4*y)/(30*x^2*y^2));
=(5*x^2)/(6*y)
_◇ratsubst(a, b, c)
│ 式cの中のbをaで置き換える。
※単なるsubstと異なり、aは式として解釈される。
※substにより完全に形式的な交換が可能
_◇ratcoef(e,v);
│ 多項式eの、変数vの係数をとりだす。
_◇realpart(z)
│ 複素数zの実数部をとる
_◇remfaunctin(f1, …, fn)
│ 関数定義の消去
※全消去
│ remfunction(all)
_◇remvalue(v1,…,vn)
│ 変数定義の消去
※全消去
remvalue(all)
_◇sqrt(x)
│ xの平方根を求める
例)
│ sqrt(2);
_◇algebraic
│ デフォルトでfalse
│ trueとすることで、ratsimpなどが有理化をするようになる。
_◇fpprec
│ fpprec:桁数;
│ により、指数表現する場合の数値の精度を指定できる
_◇変数
│ どんなデータでも変数に入れることができる
│ 一つの変数には同時に2つ以上のデータをしまっておくことはできない。
│ 変数に入っているデータ:変数の値
│ 変数にデータをいれること:代入
※変数にはかならず名前がついていて、変数名を式として与えると変数の値が式の値となる
※変数に値を代入する
│ (setq 変数名 式)
│ ⇒複数の代入を行わせることもできる
│ (setq 変数名1 式1 変数名2 式2 …)
│ ⇒setqはスペシャルフォームである
※psetq
│ setqと同型だが、代入する値をすべて求めてから個々の代入を行う。
※代入を行う関数もある
│ 関数なので引数は評価されてから渡される
│ 通常の変数に対しての代入は下のようにquoteしなければならない
│ (set (quote x) 10)
│ その代わり、評価結果により代入する対象の変数を変えることができる
_◇quote
│ (quote 記号名)
│ を評価すると、記号名という名が値として変える。
│ スペシャル・フォーム
_◇関数呼び出し
│ ( 関数名 式1 式2 … )
_◇引数の評価順序
│ 左から順に
│ ⇒式の中には副作用のあるものがある
│ ⇒引数の評価順序が決まらないと一意な結果とならないことがある
◆スペシャルフォーム
│ 通常の関数と異なり、引数を評価するのではなく、変数名などと解釈する、特別扱いをするフォーム(式)
_◇算術
※(floor arg1 arg2)
│ arg1をarg2で割った商と余りを返す