この文書の URL は http://www.cc.kyoto-su.ac.jp/~mtkg/lecture/comp_A/2012/maxima_01.html です。

Maxima とは

フリーで使える数式処理システムです。 微分積分や線形代数の計算だけでなく、式変形なども簡単に行えます。 検算などに威力を発揮するでしょう。

起動と終了

Maxima はターミナルだけでなく Emacs からも使うことができますが、まずはターミナルから使ってみましょう。 ターミナルから maxima というコマンドを実行すると Maxima が起動します。

$ maxima

Maxima 5.20.1 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.7 (a.k.a. GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1)

(%i...) というのは Maxima のプロンプトです。 Maxima では入力と出力に通し番号が付けられます。 N 番目の入力は %iN, 出力は %oN となります。 ユーザはこのラベルによって以前の入力と出力を参照することができます。

とりあえず 2^100 (2 の 100 乗)を計算させてみましょう。 Maxima のプロンプトに対して「2^100;」と入力しリターンキーを押します。

(%i1) 2^100;
(%o1)                   1267650600228229401496703205376

最後の「;」が入力の区切りになります。 これを忘れると入力が継続されていると判断され、結果が出力されません。

結果が正しいか検算してみましょう。

(%i2) %o1^(1/100);
(%o2)                                  2

最後の計算結果を参照したい(次の計算で使いたい)ことがよくあります。 直前に得られた結果は % で参照することができます。

(%i3) % + x;
(%o3)                                x + 2

Maxima では記号を使った計算をすることもできます。

(%i4) % + (2*x+3);
(%o4)                               3 x + 5

Maxima を終了するには quit() コマンドを実行します。

(%i3) quit();
$

使ってみよう

数式の記号

+     加算
-     減算
*     乗算
/     算除
^     ベキ乗
!     階乗
!!    2重階乗

加減乗除 +, -, *, / の優先順序はふつうの数学と同じです。 優先順序を変更したい場合は ( ... ) でグルーピングします。

(%i1) 1 + 2 * 3;
(%o1)                                  7
(%i2) (1 + 2) * 3;
(%o2)                                  9

n!! は2重階乗(1つおきの階乗)を計算します。

(%i3) 10!!;      /* 2*4*6*8*10 */
(%o3)                                3840
(%i4) 11!!;      /* 1*3*5*7*9*11 */
(%o4)                                10395

代入

変数に値を代入するには : を使います。

変数:    値

変数 a2/3 を代入するには次のようにします。

(%i1) a: 2/3;
                                       2
(%o1)                                  -
                                       3

変数に値を代入しておくと、あとでその変数を計算に使うことができます。

(%i2) a - 1/6;
                                       1
(%o2)                                  -
                                       2

変数から値を消去するには remvalue() を使います。

(%i3) remvalue(a);
(%o3)                                [a]

すべての変数を消去するには kill(all) とします。

数の計算

代数計算

Maxima は加減乗除やベキ乗の計算をすることができます。

(%i1) 123 + 456;
(%o1)                                 579
(%i2) 123 * 456;
(%o2)                                56088

整数を扱っているとき Maxima は厳密な値を出します。

(%i3) 2^456;
(%o3) 186070713419675363980626894819329160794532188335953423432061490990243657\
757029868371504908982723472783555205531204141550984858016925351936
(%i4) 100!;
(%o4) 933262154439441526816992388562667004907159682643816214685929638952175999\
932299156089414639761565182862536979208272237582511852109168640000000000000000\
00000000

有理数

2つの整数の商として表される数を「有理数」といいます。 有理数のみを含む計算では、結果を有理数または整数として返します。

(%i1) 1/2 + 1/3;
                                       5
(%o1)                                  -
                                       6
(%i2) % + 1/6;
(%o2)                                  1

1/5 という数は数学的には 0.2 に等しいですが、Maxima はこれらを区別します。

(%i3) 1/5 + 1;
                                       6
(%o3)                                  -
                                       5
(%i4) 0.2 + 1;
(%o4)                                 1.2

無理数

Maxima は結果をなるべく厳密に保とうとするので、無理数は無理数のまま結果を返します。 例えば、√(3) を求めようとすると、Maxima は √(3) を表す式 sqrt(3) を返します。

(%i1) sqrt(3);
(%o1)                               sqrt(3)

浮動小数点数 3.0 の平方根 sqrt(3.0) を求めれば近似値が返されます。

(%i2) sqrt(3.0);
(%o2)                          1.732050807568877

近似値としての小数

浮動小数点数(小数点を含む数)は近似値とみなされます。 式の中に浮動小数点数が含まれていれば、Maxima はその式全体を近似値として扱い、結果を浮動小数点数で表します。

(%i1) 1/2 + 3.4/5;
(%o1)                                1.18

実数を整数や有理数に変換するには次のような関数を使います。

ceiling(x)              x 以上の最小の整数を返す
floor(x)                x 以下の最大の整数を返す
round(x)                x にもっとも近い整数を返す

複素数

Maxima は複素数を扱うことができます。 虚数単位は %i で表します。

(%i1) (1 + 2*%i) + (3 + 4*%i);
(%o1)                              6 %i + 4
(%i2) (1 + 2*%i) / (3 + 4*%i);
                                   2 %i + 1
(%o2)                              --------
                                   4 %i + 3

分母を実数化するには algebraictrue にして ratsimp() を実行します。

(%i3) ratsimp(%), algebraic: ture;
                                   2 %i + 11
(%o3)                              ---------
                                      25

実部や虚部を得るには次のような関数を使います。

realpart(z)             実部を返す
imagpart(z)             虚部を返す

近似

Maxima は整数と有理数を厳密に扱いますが、関数 float(), bfloat() を使うと近似値を求めることができます。

(%i1) float(sqrt(3));
(%o1)                          1.732050807568877

float() は16桁の近似値を返します。 それ以上の桁数が必要なら bfloat() を使います。 bfloat() の返す桁数は変数 fpprec で制御します。

(%i2) bfloat(sqrt(3)), fpprec: 50;
(%o2)        1.7320508075688772935274463415058723669428052538104b0

定数

Maxima には次の定数があらかじめ定義されています。

%pi                     円周率
%e                      自然対数の底
%i                      虚数単位
inf                     正の無限大

これらの記号は数学的に厳密な値を表します。 特に指定しない限り、Maxima はこれらの値の近似値を計算しません。

(%i1) %pi * 2;
(%o1)                                2 %pi
(%i2) bfloat(%pi), fpprec: 100;
(%o2) 3.1415926535897932384626433832795028841971693993751058209749445923078164\
06286208998628034825342117068b0

基本的な関数

Maxima には次のような関数が用意されています。

sqrt(x)                        平方根
exp(x), log(x)                 指数関数・対数関数
sin(x), cos(x), tan(x)         三角関数
asin(x), acos(x), atan(x)      三角関数の逆関数
sinh(x), cosh(x), tanh(x)      双曲線関数
abs(x)                         絶対値

sin(%pi/2) の値を求めてみましょう。

(%i1) sin(%pi/2);
(%o1)                                  1

問題

式を使った計算

数式の計算

1から10までの和を求めてみましょう。

(%i1) 1+2+3+4+5+6+7+8+9+10;
(%o1)                                 55

これは公式 1+2+3+...+n = n*(n+1)/2 を使って計算することができます。

(%i2) n*(n+1)/2, n=10;
(%o2)                                 55

n*(n+1)/2, n=10ev(n*(n+1)/2, n=3) の省略形で、式に一時的に値を代入することができます。 ev は evaluate (評価する)のことでしょう。

数列の和

数列の和を sum(), nusum() で計算できます。

sum(一般項, 添字変数, 下限, 上限)
nusum(一般項, 添字変数, 下限, 上限)

1 + 2 + ... + 10 を計算してみましょう。 添字変数を i とすると、一般項は i、添字の加減と上限は 1, 10 となります。

(%i12) sum(i, i, 1, 10);
(%o12)                                55

こんどは 1^2 + 2^2 + ... + 10^2 を計算してみましょう。

(%i13) sum(i^2, i, 1, 10);
(%o13)                                385

nusum() を使うと第 n 項までの和を計算することもできます。

(%i14) nusum(i, i, 1, n);
                                   n (n + 1)
(%o14)                             ---------
                                       2
(%i15) nusum(i^2, i, 1, n);
                              n (n + 1) (2 n + 1)
(%o15)                        -------------------
                                       6
(%i16) nusum(i^3, i, 1, n);
                                   2        2
                                  n  (n + 1)
(%o16)                            -----------
                                       4

数列の積

Maxima には総積 Π を計算する関数も用意されています。

product(式, 添字, 下限, 上限)

sin(1*π/4) * sin(2*π/4) * sin(3*π/4) を計算してみましょう。

(%i5) product(sin(k*%pi/4), k, 1, 3);
                                       1
(%o5)                                  -
                                       2

数値積分

Maxima は数値的に積分を行うことができます。 関数 integrate() は f(x) を x について min から max まで積分します。

integrate(f(x), x, min, max)

sin(x) を区間 [0, π] で積分してみましょう。

(%i1) integrate(sin(x), x, 0, %pi);
(%o1)                                  2

根を求める。

Maxima には方程式の根を数値的に求める関数が用意されています。

allroots(f(x))                 実数係数の方程式 f(x)=0 の実数解と複素解を求める
find_root(f(x), x, min, max)  f(x)=0 の解を区間 [a, b] の間でみつける

x^2 - x - 2 = 0 の解を求めてみましょう。

(%i1) allroots(x^2-x-2);
(%o1)                        [x = - 1.0, x = 2.0]

式は f(x) = a という形で与えることもできます。

(%i2) allroots(x^2 = 4);
(%o2)                        [x = 2.0, x = - 2.0]

区間を指定して探すこともできます。

(%i3) find_root(x^2-x-2, x, 0, 5);
(%o3)                                 2.0

x*exp(x) = 1 の解が (0, 1) に含まれることは明らかでしょう。

(%i4) solve(x*exp(x) = 1, x);
                                         - x
(%o4)                            [x = %e   ]
(%i5) find_root(x*exp(x) = 1, x, 0, 1);
(%o5)                         0.56714329040978

問題

  1. sum() を用いて 1^3 + 2^3 + ... + 10^3 を計算せよ。
  2. product() を用いて 10! (つまり 1*2*...*10)を求めよ。
  3. 関数 1/(1+x^2) を区間 [0, 1] で積分せよ。
  4. x^3 - 4*x^ = 0 の解を求めよ。
  5. sin(x) = cos(x) の解を求めよ。(ヒント:区間 [0, %pi] で探せ)

練習問題

  1. sum() を用いて 1 + 3 + 5 + ... + 99 を計算せよ。
  2. sum() を用いて 1/1 + 1/2! + 1/3! + ... + 1/10! を計算せよ。
  3. exp(1*π/6) * exp(2*π/6) * exp(3*π/6) * exp(4*π/6) * exp(5*π/6) を計算せよ。
  4. x * tan(x) = 1 の解を求めよ。(ヒント:区間 [0, %pi/2] で探せ)