#author("2022-12-26T13:24:53+09:00","default:okazaki","okazaki")
#author("2022-12-26T13:27:39+09:00","default:okazaki","okazaki")
#menu(howto/MenuBar)

* howto/maxima [#u83cbd5a]
#contents

** Maximaをベースにした種類 [#a2d5d9e5]

 wxmaxima, 12.04.0(win7)
 ├ maxima, 5.27.0(win7)
 └ xmaxima, テキストベースらしい
 
 imaxima, wxmaximで十分のようだ
 
 texmacs, 1.99.1.8496(win7), maximaとの連携がうまくいかない。それ以外は単なるエディタ。

- mac版のwxmaximaはファイル保存できない。.wxmxと.macには入力テキストいちおう保存される(2013年)


** 一行メモ [#m023c494]

- オイラーの公式を展開する例(これしかない?
 trigsimp(
   subst( cos(phi)+%i*sin(phi), exp(%i*phi), 
    1/sqrt(2)/%i*( spherical_harmonic(1,1,theta,phi) +  spherical_harmonic(1,-1,theta,phi) )
   )
 );

- 水素原子の波動関数
 LaguerreBiPoly(k,s,x):= diff( exp(x)*diff(x^k*exp(-x),x,k), x, s );
 LaguerreBiFunc(n,l,x):= expand( exp(-x/2)*x^l * LaguerreBiPoly(n+l,2*l+1,x) );
 SpheHarm(l,m,theta,phi):=spherical_harmonic(l,m,theta,phi);   /* 2014/11/20訂正,2016/07/13訂正 */
                            /* このsperical_harmonic には、通常のものに(-1)^(m)が掛けられている */
 SpheHarm(l,m,theta,phi):=(-1)^(m)*spherical_harmonic(l,m,theta,phi); /* 通常のYlm */
 Psi(n,l,m,r,theta,phi):= -sqrt( (n-l-1)!/(2*n*((n+l)!)^3)*(2/n)^3 ) *
   factor(( subst( 2*r/n, x, LaguerreBiFunc(n,l,x) ) * SpheHarm(l,m,theta,phi) ));

- auからfsecへの変換
 fs2au(t):=t/2.418e-2;
- Maxima 5.33.0 マニュアル(日本語) http://maxima.sourceforge.jp/maxima.html --  &new{2014-06-05 (木) 10:15:22};
- trgsimp以外に、radcanという指数・対数の整理があり。 --  &new{2014-06-05 (木) 10:49:54};
- declare(k,integer)  k を整数として宣言 --  &new{2014-06-05 (木) 10:54:23};
- 前置演算子 --  &new{2014-06-05 (木) 10:56:00};
 prefix( "A" );
 A f := diff( r^2 * diff( f, r ), r )/(2*r^2)
      + diff( sin(theta) * diff( f, theta ), theta )/(2*r^2*sin(theta))
      - 1/r*f - E*r*sin(omega*t)*cos(theta)*f;
 Psi[0](r):=exp(-r)/sqrt(%pi);
 A Psi[0](r);
- 部分分数分解 partfrac( (2*x^2+6*x+1)/(x*(x+1)^2), x ); --  &new{2014-06-19 (木) 12:14:31};
- 式をまとめる?: factorout, rat, ordergreat --  &new{2014-09-10 (水) 10:57:54};
- http://www.kabipan.com/computer/maxima/quick.html より --  &new{2014-09-14 (日) 20:21:46};
 1/3, numer; と入力すると .3333333333333333 が得られる
 
 値の割り当て(assingment)
 シンボルはその場で評価され、その値に置き換わる
 remvalue (n); で、n に割り当てられた値を削除する。
 remvalue (all); で、ユーザがシンボルに割り当てた値をすべて削除する。
 kill(n); でシンボル n を削除。kill (all) で、ユーザが作成したすべてのシンボルを削除。
 シンボルの値として割り当てることができるものは、数に限らない。たとえば式を値として
 割り当てることができる:シンボルに割り当てられた値を評価したい場合は、ev () を用いる
 
 declare (n, integer); で、n を整数であると宣言する。
 facts (); で n 以外の変数に対する制約も表示される。
 フラグは features; で知ることができる
 remove (all,integer); で、すべてのシンボルから整数フラグを取り除くことができる
 
 assume (n > 0); で、n が 0 より大きいことを仮定することができる
 forget (n > 0) で、仮定 n > 0 を取り除くことができる。forget (all) で、すべての assume されたものを削除
 
 fundef(f); で関数 f の定義を見ることができる。dispfun(all) ですべてのユーザ関数定義を見ることができる。
 remove (f, function); で、f から関数定義を取り除くことができる
 
 assume (n = m); の形が許されないのも、これに似た事情である。n の字面はどうやっても m の
 字面とは同じではない。assume (equal(n, m)); なら可能である。
- 行列をくっつけるには、行の場合はaddcol(A, B)、列の場合は addrow(A, B)  --  &new{2014-12-10 (水) 14:57:34};
- 行列の要素を取り出すには、Eq[i,j]である。一列や一行であってもi,jを指定する。.jを略すとi行目の一行の行列が得られるようだ --  &new{2014-12-10 (水) 15:03:27};
- x[k]の扱い方。(配列、配列関数とかいうものらしい)
 x[2*k] は 下付き添字2kが付いた x で表示されるが、配列のようだ。
 arrayinfo( x ) で、[hashed, 次元, 登録されたハッシュキー, …]
 listarray( x) で、[ハッシュ値, …]
 を知ることができる。kill( x ) も可。
 
 下付き文字 2k の付いた x の文字として使用するには、' を付ける。
 例) integrate( 'x[2*k+1], x, 'x[2*k+1]-h, 'x[2*k+1]+h );
- 配列関数 N[9](x,y):=1/1*(1-x)*(1+x)*(1-y)*(1+y); --  &new{2014-12-20 (土) 09:53:46};
- h[i,j]:=(i-1)*3+j; genmatrix(h,3,3); で行列を作成できる。 --  &new{2014-12-20 (土) 16:43:45};
- row(A,2); col(A,2); 行列の行や列を取り出す。 --  &new{2014-12-20 (土) 16:44:42};
- setelmx(p, 2, 3, A); 行列Aの2行3列をpに置き換える。 --  &new{2014-12-20 (土) 16:45:40};
- a: lambda([i, j], x[j]ˆi); genmatrix(a, 3, 4, 0, 1); ラムダを使った行列の作成 --  &new{2014-12-20 (土) 16:49:46};
- 連立方程式を解く --  &new{2014-12-25 (木) 11:00:27};
 B0(x):=a*x^5+b*x^4+c*x^3+d*x^2+e*x+f;
 B1(x):=a*5*x^4+b*4*x^3+c*3*x^2+d*2*x+e;
 B2(x):=a*5*4*x^3+b*4*3*x^2+c*3*2*x+d*2;
 /* [-1,0] j=0 */
 solve( [B0(0)=1,B1(0)=0,B2(0)=0,B0(-1)=0,B1(-1)=0,B2(-1)=0],[a,b,c,d,e,f] );
- 極限値 limit(sin(x)/x, x, inf); limit(1/x, x, 0, minus); 4番目の引数は方向を示す --  &new{2015-02-10 (火) 17:47:03};
- 等高線を描く wxcontour_plot ( uo(x)*uo(y), [x,-1,1], [y,-1,1] ); --  &new{2015-02-28 (土) 10:42:25};
- 数値積分 romberg( exp(-x^2), x, 0, 1 ); rombergtol;(なおこれはrombergを使用したら値が初期値がセットされる); 被積分関数に条件分岐(if)があればやはり積分してくれない。 --  &new{2015-03-03 (火) 18:04:22};
- 積分の例: integrate( r*r*exp(-2*r) , r, 0, inf ); --  &new{2016-07-05 (火) 10:47:54};

#comment



** ベクトルの外積 [#j5f967fd]

 関数を定義して使うしかないらしい
 cross( u, v ):=  [ u[2]*v[3] - u[3]*v[2], u[3]*v[1] - u[1]*v[3], u[1]*v[2] - u[2]*v[1] ];
 A1:[a,0,0] ;
 A2:[0,b,0];
 A3:[0,0,c];
 A1 . cross( A2, A3 ); /* スカラー三重積 */


** グラフ描画 [#q7c07cb7]

- plot2d 
 f(x, A, a):=x*(1+A*exp(-a*x));
 plot2d( [f(x,4,2), f(x,8,2),f(x,4,4),f(x,8,4), x], [x, 0,5],
   [legend, "f(x,4,2)", "f(x,8,2)","f(x,4,4)", "f(x,8,4)", "x"],
   [gnuplot_preamble, "set grid; set key bottom right;
                       set xrange[0:5]; set yrange[0:5];"] );
 またはwxplot2d
 
 軸ラベルは [xlabel,"Intensity (W/m^2)"], [ylabel,"E (V/Angstrom)"]
 軸を対数にするには、[gnuplot_preamble, " set logscale x; set logscale y; "]
 軸の目盛の特殊なフォーマットは、[gnuplot_preamble, "set format x \"%1.0le%2L\"; "] Lは10のべき乗部分、lは仮数部
 
 別の例)
 wxplot2d( [D(t/au2fs),C1(t/au2fs),C2(t/au2fs)], [t,0,1086*au2fs],
     [legend, "Dipole", "C1", "C2"],
     [xlabel,"time (fs)"], [ylabel,"(au)"],
     [gnuplot_preamble, "set grid; set key top center;" ]
 );

- plot3d
 f(x,t):=-400/16*sin(2*%pi/0.4*t)*(x-8);
 wxplot3d( f(x,t), [x,0,16], [t,0,0.4],
     [legend, "f(x,t)"] );
 またはwxplot3d

- plot2d(媒介変数)
 plot2d( [parametric, 1/2*t*t+t, sin(2*%pi*t)], [t,0,50], [nticks, 10000] );
 変数はtでないとダメなようだ。

- その他
 [legend,false]  凡例を表示させない


** 雑多なこと [#kb571d6b]

 assume( W > 0 )  /* 前提条件。積分とかで場合分けの質問が煩わしいときなどに使用。andを使用可。 */
 forget( W )  /* 変数Wの値を未設定にする? */
 forget( all )  /* 全ての変数の値を未定義にする? */
 kill( all )  /* 全ての変数の値を未定義にする? */

 W:0.25         /* 変数Wの値を0.25に設定する */

 inf  /* ∞ */
 %i   /* 虚数単位 */
 %pi  /* π */

 conjugate( hoge )  /* 複素共役をとる */
 realpart( hoge )   /* 実部を取り出す */
 imagpart( hoge )   /* 虚部を取り出す*/
 abs( hoge )        /* 絶対値 */

 diff( hoge(x), x [,n] )  /* hoge(x)のn回微分。nを省略したときは1 */

 taylor( exp(%i*C*x), x, 0,5)  /* テイラー展開をxについて、0次から5時までする */

 subst( a, x, hoge(x) )    /* 関数hogeのxをaに置き換える(x,aは数式でも可) */

 nusum( A^^k, k, 0, inf );
 num( BBconjinv[1,1] );

 末尾$    /* 出力を省略 */

 hoge(x), x:0.25;  /* env( x:0.25, hoge(x) ) と同じく、一時的な代入 */

 romberg  数値積分


** 関数の定義 [#e2ba1611]

 hoge( x, y, z ):= x,y,zを使った関数  /* 関数の定義 */

 f(x):=0.3*x*x-1.2*x+5;
 define( nab_f(x), diff( f(x), x ) );  /* 微分として定義する場合 */
 
 nab_f(x):=diff( f(x), x );    /* 期待通りに働かない */
 nab_f(x):='diff( f(x), x );   /* 期待通りに働かない */
 
 f(1.2);
 nab_f(1.2);

 場合分けのある関数の定義
 ua(x,c):=if x>=c-1 and x<=c+1 then 1/2*(x-c)*(x-c-1) else 0;


** 行列 [#z584eafe]

 A:matrix( [ 1,2],[3,4] );
 A:matrix( [-1, exp(-%i*phi)], [exp(%i*phi), 0] );
 A.A; A^^3; A^^4; A^^5; A^^-1; A^^0;  /*  行列の積は . べき乗は ^^ 逆行列は^^-1 */

 exp( A ); /* これは各要素のexpが計算されるので注意 */
 
 determinant(A);  /* 行列式の値。なお、0のときA^^-1はエラーになる */

 transpose( A )  /* 行列Aを転置する */
 conjugate(transpose( A ))  /* Aの転置複素共役 */


** 浮動点少数として計算 [#nc11b5ec]

 float( 1/3 );  /* 浮動点少数として結果を出力 */
 bfloat(1/3);   /* 〃 */
 bfloat(1/3), fpprec:8;  /* 8桁の浮動点少数として出力 */


** 方程式を解く [#b7ba135d]

 TOUfunc(V0,E,a):=( (1+V0^2*(sinh(sqrt(2*(V0-E))*a))^2/(4*E*(V0-E)) )^(-1) );
 ans:solve( TOUfunc( 80, 74, a )=0.5, a );
 bfloat( [rhs(ans[1]), rhs(ans[2])] ), fpprec:4;


** 式展開やまとめる方法 [#l519030c]
 expand   展開 <--> factor 因数分解
 partfrac      <--> ratsimp
 trigreduce 三角関数の積を減少   <--> trigsimp
 trigexpand 三角関数の引数を展開 <--> trigsimp

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS