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

記号計算

多項式などを操作する次のような関数があります。

expand()                     式の展開
factor()                     因数分解
partfrac()                   部分分数展開
ratsimp()                    式の簡単化

(x+y)^4 を展開してみましょう。

(%i1) expand((x+y)^4);
                       4        3      2  2      3      4
(%o1)                 y  + 4 x y  + 6 x  y  + 4 x  y + x

結果を因数分解してみましょう。

(%i2) factor(%);
                                          4
(%o2)                              (y + x)

因数が違っていても因数分解できます。 x^2 - 3*x + 2 で確かめてみましょう。

(%i3) factor(x^2 - 3*x + 2);
(%o3)                          (x - 2) (x - 1)

x/(x+1) を部分分数展開してみましょう。

(%i4) partfrac(x/(x+1), x);
                                         1
(%o4)                             1 - -----
                                       x + 1

ratsimp() でこの式を簡単化します。

(%i5) ratsimp(%);
                                       x
(%o5)                               -----
                                     x + 1

問題

  1. x^2 + 5*x + 6 を因数分解せよ。
  2. (x-y)^2 - 6*(x-y) + 8 を因数分解せよ。
  3. a = 1/(sqrt(7) - sqrt(5)), b = 1/(sqrt(7) + sqrt(5)) のとき、 a*b の値を求めよ。 ヒント:ratsimp(a*b) で式を簡単化すればよい。

方程式を解く

allroots()find_root() で方程式の近似解を求めましたが、 Maxima は方程式を厳密に解くこともできます。

solve(方程式, 変数)
solve([方程式1, 方程式2, ...], [変数1, 変数2, ...])

方程式 x^2 - 1 = 0 を解きましょう。

(%i1) solve(x^2 - 1 = 0, x);
(%o1)                          [x = - 1, x = 1]

連立方程式を解くこともできます。 y = x^2, y = x+2 を解いてみましょう。

(%i2) solve([y=x^2, y=x+2], [x, y]);
(%o2)                 [[x = - 1, y = 1], [x = 2, y = 4]]

問題

関数の定義

関数の定義には := を使います。 f(x) = x^2 + 2*x + 1 という2次関数を定義するには次のようにします。

(%i1) f(x) := x^2 + 2*x + 1;
                                      2
(%o1)                        f(x) := x  + 2 x + 1

組み込み関数 factor() で因数分解してみましょう。

(%i2) factor(f(x));
                                          2
(%o2)                              (x + 1)

関数値を計算することもできます。

(%i3) f(1/2);
                                       9
(%o3)                                  -
                                       4

代数式を操作する

coeff(式, x, n)              式中の x^n の係数を返す
num(有理式)                  分子を返す
denom(有理式)                分母を返す
ratsubst(a, b, c)            c 中の b に a を代入し、結果の式を返す
gcd(式1, 式2, ...)           最大公倍数を返す(式は多項式でもよい)

x^2+2*x+1, x^2+3*x+2 の最大公約数を求めてみましょう。

(%i1) gcd(x^2+2*x+1, x^2+3*x+2);
(%o1)                                x + 1

x に 9 を代入してみましょう。

(%i2) ratsubst(9, x, %);
(%o2)                                 10

三角関数を含む式の簡単化

三角関数を含む式の簡単化には次のような関数を使います。

trigsimp()                   三角関数・指数関数を含む式を簡単化する
trigreduce()                 三角関数同士の積を減らして簡単化する
trigexpand()                 加法定理や倍角公式を使って式を展開する

cos(x)^2 - sin(x)^2 を簡単化しましょう。

(%i1) trigsimp(cos(x)^2 - sin(x)^2);
                                      2
(%o1)                            2 cos (x) - 1
(%i2) trigreduce(cos(x)^2 - sin(x)^2);
                          cos(2 x) + 1   cos(2 x)   1
(%o2)                     ------------ + -------- - -
                               2            2       2
(%i3) trigsimp(%);
(%o3)                              cos(2 x)

cos(3*x) を展開しましょう。

(%i4) trigexpand(cos(3*x));
                             3                  2
(%o4)                     cos (x) - 3 cos(x) sin (x)
(%i5) trigsimp(%);
                                  3
(%o5)                        4 cos (x) - 3 cos(x)

問題

  1. 三角関数の加法定理 trigexpand(sin(x+y)) などを確認せよ。
  2. 双曲線関数の加法定理 trigexpand(sinh(x+y)) などを確認せよ。

微分

関数を微分するには diff() を使います。

diff(f(x), x)                f(x) を x で微分
diff(f(x), x, n)             f(x) を x で n 階微分

x^2 を微分してみましょう。

(%i1) diff(x^2, x);
(%o1)                               2 x

cos(x)exp(x) などの関数を微分することもできます。 x*cos(x) を微分してみましょう。

(%i2) diff(x*cos(x), x);
(%o2)                          cos(x) - x sin(x)

x^x (x の x 乗)を微分することまでできます。 (ヒント:x^x = exp(x*log(x))

(%i3) diff(x^x, x);
                                 x
(%o3)                          x  (log(x) + 1)

問題

  1. y = (x+2)*(3*x-1) を2階微分せよ。
  2. y = x * sqrt(x) を微分せよ。
  3. y = e^(x^2) を微分せよ。(%e^(x^2) または exp(x^2) を微分する。)

積分

Maxima では不定積分、定積分が計算できます。 積分定数は表示されないので注意してください。 また、うまく計算できないこともあります。

integrate(f(x), x)               不定積分
integrate(f(x), x, a, b)         区間 [a, b] の定積分

f(x) = x の不定積分を求めてみましょう。

(%i5) integrate(x, x);
                                       2
                                      x
(%o5)                                --
                                      2

正しい結果は x^2 + C (C は積分定数)です。 というわけで、定数を除けばあっていますね。

こんどは f(x) = x^2*cos(x) + 2*x*sin(x) の不定積分を求めてみましょう。

(%i6) integrate(x^2*cos(x) + 2*x*sin(x), x);
                                       2
(%o6)       2 (sin(x) - x cos(x)) + (x  - 2) sin(x) + 2 x cos(x)

この結果はもう少し簡単になりそうです。 このような場合は ratsimp() で式を簡単化できます。

(%i7) ratsimp(%o18);
                                    2
(%o7)                             x  sin(x)

次は定積分です。 f(x) = sin(x) を 0 からπまで積分してみましょう。 円周率πは %pi という定数で用意されています。

(%i8) integrate(sin(x), x, 0, %pi);
(%o8)                                 2

無限大まで積分することもできます。 次の積分はガウス積分と呼ばれ、物理では非常に重要です。

(%i9) integrate(exp(-x^2), x, -inf, inf);
(%o9)                              sqrt(%pi)

問題

  1. x+1 の不定積分を求めよ。
  2. x+1[0, 1] の範囲で積分せよ。

数値積分

解析的に積分できない場合は romberg() で数値積分することができます。 f(x) = sin(sin(x)) を 0 から 1 まで積分してみましょう。

(%i1) integrate(sin(sin(x)), x, 0, 1);
                                1
                               /
                               [
(%o1)                         I  sin(sin(x)) dx
                               ]
                               /
                                0
(%i2) romberg(sin(sin(x)), x, 0, 1);
(%o2)                          0.43060592364256

問題

  1. cos(x + cos(x))[0, 1] の範囲で積分せよ。
  2. exp(-x^2)[-10, 10] の範囲で積分し、結果の2乗を求めよ。

極限

Maxima は極限を計算することができます。

limit(式, 変数, 値)
limit(式, 変数, 値, 方向)

「方向」には極限を取る方向を指定します。 上からの極限は plus、下からの極限は minus となります。

sin(x)/x の極限値を求めてみましょう。

(%i1) limit(sin(x)/x, x, 0);
(%o1)                                  1

無限大での極限を計算することもできます。

(%i2) limit(log(x)/x, x, inf);
(%o2)                                  0

問題

テイラー展開

taylor() を使うとテイラー展開ができます。

taylor(f(x), x, a, n)        f(x) を x=a の周りで n 次の項までテイラー展開する

sin(x)x=0 の周りで5次の項まで展開してみましょう。

(%i1) taylor(sin(x), x, 0, 5);
                                  3    5
                                 x    x
(%o1)/T/                     x - -- + --- + . . .
                                 6    120

3次の項の係数を求めるには coeff() を使います。

(%i2) coeff(%, x, 3);
                                        1
(%o2)/R/                              - -
                                        6

問題

  1. exp(x)x=0 の周りで5次の項までテイラー展開せよ。
  2. cos(x)x=0 の周りで5次の項までテイラー展開せよ。

ベクトル

ベクトルを定義するには [ ... ] を使います。

[要素1, 要素2, ...]

変数 u(1, 2, 3) というベクトルを代入しましょう。

(%i1) u: [1, 2, 3];
(%o1)                              [1, 2, 3]

ベクトル u, v の内積は u . v で計算できます。 ベクトル u の大きさを求めてみましょう。

(%i2) u . u;
(%o2)                                 14
(%i3) sqrt(%);
(%o3)                              sqrt(14)

したがって、ベクトルの大きさを返す関数 norm() は次のように定義できます。

(%i4) norm(x) := sqrt(x . x);
(%o4)                       norm(x) := sqrt(x . x)
(%i5) norm(u);
(%o5)                              sqrt(14)

問題

行列

行列は matrix() で定義できます。

[ 2  -1 ]
[-1   3 ]

という行列 A を定義するには

(%i1) A: matrix([2, -1], [-1, 3]);
                                 [  2   - 1 ]
(%o1)                            [          ]
                                 [ - 1   3  ]

とします。

行列には次のような演算が用意されています。

determinant(A)                   行列式
transpose(A)                     転置行列
A^^-1                            逆行列
A . x                            行列 A とベクトル x の積
A . B                            行列 A, B の積

行列 A の行列式、転置行列、逆行列を求めてみましょう。

(%i1) A: matrix([2, -1], [-1, 3]);
                                 [  2   - 1 ]
(%o1)                            [          ]
                                 [ - 1   3  ]
(%i2) determinant(A);
(%o2)                                  5
(%i3) transpose(A);
                                 [  2   - 1 ]
(%o3)                            [          ]
                                 [ - 1   3  ]
(%i4) A^^-1;
                                   [ 3  1 ]
                                   [ -  - ]
                                   [ 5  5 ]
(%o4)                              [      ]
                                   [ 1  2 ]
                                   [ -  - ]
                                   [ 5  5 ]

ベクトル x = [1, 3] との積を計算してみましょう。

(%i5) x: [1, 3];
(%o5)                               [1, 3]
(%i6) A . x;
                                    [ - 1 ]
(%o6)                               [     ]
                                    [  8  ]

問題

練習問題

  1. P = x^2 + x - 3, Q = 2*x^2 - x + 4, R = -3*x^2 + 5 のとき、P - Q + R を計算せよ。
  2. x^2 = 2 の解を (1, 2) の範囲で求めよ。
  3. sin(x) = x-1 の解を (0, %pi) の範囲で求めよ。
  4. 2次関数 y = x * exp(-x^2) が極大値とその時の x の値を求めよ。
  5. 1/(1+x^2) の不定積分を求めよ。
  6. 1/(1+x^2)[0, 1] の範囲で積分せよ。
  7. x*sqrt(x-1) の不定積分を求めよ。(ratsimp(), factor() で式を簡単化する。)
  8. sin(x+%pi/4)sin(x), cos(x) の和で表せ。
  9. sin(3*x)sin(x) だけで表せ。 ヒント:式 eq 中の A を B で置き換えるには ratsubst(B, A, eq) とする。
  10. tan(x)x=0 の周りで5次の項までテイラー展開せよ。
  11. sin(x)/xx=0 の周りで5次の項までテイラー展開せよ。