この文書の 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次の項までテイラー展開せよ。