この文書の 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
問題
x^2 + 5*x + 6を因数分解せよ。(x-y)^2 - 6*(x-y) + 8を因数分解せよ。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]]
問題
- 方程式
x^2 + 1 = 0を解け。 - 円
x^2 + y^2 = 10と直線y = 2*x-5の共有点の座標を求めよ。
関数の定義
関数の定義には := を使います。
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)
問題
- 三角関数の加法定理
trigexpand(sin(x+y))などを確認せよ。 - 双曲線関数の加法定理
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)
問題
y = (x+2)*(3*x-1)を2階微分せよ。y = x * sqrt(x)を微分せよ。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)
問題
x+1の不定積分を求めよ。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
問題
cos(x + cos(x))を[0, 1]の範囲で積分せよ。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
問題
(1+1/x)^xのx→∞での極限を求めよ。x*log(x)のx→+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
問題
exp(x)をx=0の周りで5次の項までテイラー展開せよ。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)
問題
- ベクトル
a = [1, 1, -1],b = [2, -1, 1]の内積を求めよ。 - ベクトル
a = [1, 1, 1],b = [1, -1, 1]のなす角をθとする。cosθの値を求めよ。
行列
行列は 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 ]
問題
- 行列 A とその逆行列の積が単位行列になることを確かめよ。
- 連立方程式
x + y = 2,2*x - y = 1を逆行列を利用して解け。 (ヒント:係数行列はmatrix([1, 1], [2, -1])^^-1、右辺のベクトルは[1, 1]と表される。)
練習問題
P = x^2 + x - 3,Q = 2*x^2 - x + 4,R = -3*x^2 + 5のとき、P - Q + Rを計算せよ。x^2 = 2の解を(1, 2)の範囲で求めよ。sin(x) = x-1の解を(0, %pi)の範囲で求めよ。- 2次関数
y = x * exp(-x^2)が極大値とその時の x の値を求めよ。 1/(1+x^2)の不定積分を求めよ。1/(1+x^2)を[0, 1]の範囲で積分せよ。x*sqrt(x-1)の不定積分を求めよ。(ratsimp(),factor()で式を簡単化する。)sin(x+%pi/4)をsin(x),cos(x)の和で表せ。sin(3*x)をsin(x)だけで表せ。 ヒント:式 eq 中の A を B で置き換えるにはratsubst(B, A, eq)とする。tan(x)をx=0の周りで5次の項までテイラー展開せよ。sin(x)/xをx=0の周りで5次の項までテイラー展開せよ。

