- Maxima ではセルに実行文を書き,
- 行末にセミコロン ; を入力後,
- Shift キーを押しながら Enter キー(Return キー)を押すと実行します。
- SHift + Enter のかわりに,メニューの「▶︎ Run」をクリックしてもよいです。
導関数の定義
$f(x) = x^2$ を微分する。
Maxima では関数の定義は以下のように :=
を使います.
f(x) := x**2;
/* Maxima での関数 f(x) の定義 */
f(x) := x**2;
まずは以下の導関数の定義に基づいて極限を計算する。
$$ \lim_{h \rightarrow 0} \frac{f(x+h) – f(x)}{h}$$
limit((f(x + h) - f(x))/h, h, 0);
ともかく答えを求めたい場合はこれで OK です。極限の計算をする前の表示をしたい場合は
'limit((f(x + h) - f(x))/h, h, 0)
のように '
で始めると,実行せずに表示のみを行います。
'limit((f(x + h) - f(x))/h, h, 0) =
limit((f(x + h) - f(x))/h, h, 0);
微分を計算するのにいちいち極限をとっているわけにはいきません。次に微分を行う関数 diff()
を使って直接 f(x)
を微分してみます。
/* 微分を行う diff() 関数で直接微分します。*/
diff(f(x), x);
/* f(x) の定義をなしにします。*/
kill(f)$
微分法の公式
微分法の公式 にある公式を確認します。
$\displaystyle 1. \left\{ f(x) \pm g(x) \right\}’ = f'(x) \pm g'(x)$
'diff( (f(x) + g(x)), x ) =
diff( (f(x) + g(x)), x );
$\displaystyle 2. \left\{ c f(x) \right\}’ = c f'(x) $
'diff((c*f(x)), x) =
diff((c*f(x)), x);
$\displaystyle 3. \left\{ f(x)\, g(x) \right\}’ = f'(x)\,g(x) + f(x)\,g'(x) $
ライプニッツルールを知っているか?
'diff( (f(x)*g(x)), x ) =
diff( (f(x)*g(x)), x );
$\displaystyle 4. \left\{ \frac{1}{g(x)} \right\}’ = – \frac{g'(x)}{\left\{g(x)\right\}^2} $
'diff(1/g(x), x) =
diff(1/g(x), x);
$\displaystyle 5. \left\{ \frac{f(x)}{g(x)} \right\}’ = \frac{f'(x)\,g(x) – f(x)\, g'(x)}{\left\{g(x)\right\}^2} $
'diff(f(x)/g(x), x) =
diff(f(x)/g(x), x);
ratsimp()
関数は,通分などを行なって簡単化してくれます。
%
は直前の結果をあらわします。
ratsimp(%);
合成関数の微分法
$y = y(u), \ u = u(x)$,つまり $y$ が $u$ を通して $x$ の関数であるとき,
$$\frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx}$$
/* y は u に依存する,と宣言する.*/
depends(y, u);
/* u は x に依存する,と宣言する.*/
depends(u, x);
'diff(y, x) = diff(y, x);
/* 今後のために宣言を消去 */
kill(y, u);
/* 今度は y は x に依存しないので... */
'diff(y, x) = diff(y, x);
例: $ y = (a x^2 + b x + c)^5 $ の微分。
u: a*x**2 + b*x + c;
y: u**5;
diff(y, x);
/* 後々のために */
kill(y)$
べき関数の微分
べき乗(累乗)は **
で表す(^
でもいいですが,Maxima 以外の処理系では ^
が使えない場合もあるので **
で通します)。$x^p$ は,x**p
。べき関数 x**p
を直接微分してみます。微分には diff()
関数を使います。
'diff(x**p, x) = diff(x**p, x);
例として,べき関数の合成関数である,以下のような関数の微分。
$$\frac{d}{dx} \frac{1}{\sqrt{1 + x^2}}$$
$\sqrt{x} = $ sqrt(x)
と書きます。
'diff(1/sqrt(1 + x**2), x) =
diff(1/sqrt(1 + x**2), x);
参考:べき関数のグラフ
$y = x^2$ を $ -3 \leq x 3$ の範囲でグラフを描く例。2次元グラフは plot2d()
で描きます。(darw2d()
でも描けます。plot 系と draw 系では書式が異なります。
ここでは plot2d()
で話を進めますが, plot2d()
と darw2d()
の対応については「参考:Maxima で初等関数のグラフを描く」などを参照してください。)
plot2d()
は 行末を $
としてもグラフを表示します。
plot2d(x**2, [x, -3, 3])$
$y = x, x^2, x^3$ を $ -3 \leq x 3$ の範囲でグラフを描く例。
- 複数の関数のグラフをまとめて描くときは
[x, x**2, x**3]
などのようにします。 - $y$ の表示範囲を設定するときは
[y, -3, 7]
などのようにします。 - 凡例(legend)の位置を変更するのに
gnuplot_preamble
オプションを使っています。 grid2d
オプションもつけてみました。plot2d()
の最後のログ出力が不要な場合は,行末に$
をつけます。
plot2d([x, x**2, x**3], [x, -3, 3], [y, -3, 7],
[gnuplot_preamble, "set key bottom right"], grid2d)$
$y = x, x^{1/2}, x^{1/3}$ のグラフを描く例です。
- 凡例(legend)を指定する場合は
[legend, ...]
のように書きます。
plot2d([x, x**(1/2), x**(1/3)], [x, 0, 3],
[legend, "x", "x^(1/2)", "x^(1/3)"],
[gnuplot_preamble, "set key top left"], grid2d)$
$y = x^{-2}, \ x^{-3}$ のグラフを描く例。$x=0$ で発散するため文句をつけられますが,ちゃんと描いてくれます。
plot2d([1/x**2, 1/x**3], [x, -3, 3], [y, -5, 5])$
指数関数の微分
念のため,Maxima が $\displaystyle \lim_{h \rightarrow 0}(1 + h)^{\frac{1}{h}}$ がわかるか確認します。
'limit((1 + h)**(1/h), h, 0) =
limit((1 + h)**(1/h), h, 0);
ネイピア数 $e$ を底とした指数関数 $e^x$ は exp(x)
で表します。
'diff(exp(x), x) = diff(exp(x), x);
くどいようですが,微分した答えだけを知りたいなら,以下のようにするだけ。
diff(exp(x), x);
参考:Maxima の基本的な定数として,以下のようなものがあります。
円周率 $\pi$ | ネイピア数 $e$ | 虚数単位 $i$ | 無限大 $\infty$ |
---|---|---|---|
%pi | %e | %i | inf |
$\exp(1) = e^1 = e$ であることを確認します。
exp(1) - %e;
float()
関数で %e
つまり $e$ の値を小数点表示します。
float(%e);
参考:指数関数のグラフ
$y = e^x, e^{-x}$ のグラフ。凡例(legend)をつけています。
plot2d([exp(-x), exp(x)], [x, -3, 3],
[legend, "exp(-x)", "exp(x)"], grid2d)$
対数関数
定義
自然対数は log(x)
です。自然対数は,ネイピア数 $e$ を底とした指数関数 $e^x$ の逆関数であるから,
$$e^{\log x} = x, \quad \log e^x = x$$
が成り立ちます。確認してみます。
exp(log(x));
log(exp(x));
微分
$x$ の絶対値 $|x|$ は abs(x)
と表します。
'diff(log(abs(x)), x) =
diff(log(abs(x)), x);
参考:対数法則
- $\log(x y) = \log x + \log y$
- $\log(x^y) = y \log x$
radcan()
関数は指数関数や対数関数を含む式を簡単化してくれるかもしれません。
log(x*y) = radcan(log(x*y));
log((x**y));
上式の表示が $\log x\, y$ と紛らわしいですが,
$\left(\log x\right) \cdot y = y \, \log x$ のことです。
参考:対数関数のグラフ
$y = \log x$ のグラフを $0 < x < 5$ の範囲で描く。$y$ の表示範囲を $ -3 < y < 3$ くらいにして。
plot2d(log(x), [x, 0.01, 5], [y, -3, 3], grid2d)$
三角関数
性質
三角関数は sin(x), cos(x), tan(x)
のように書きます。
$\sin^2 x + \cos^2 x = 1$ を確認します。
sin(x)**2 + cos(x)**2 = trigsimp(sin(x)**2 + cos(x)**2);
極限公式の確認
三角関数の微分を求めるためには,以下の極限
$$ \lim_{x \rightarrow 0} \frac{\sin x}{x} $$
の値が必要でした。この極限ができるか確認します。
'limit(sin(x)/x, x, 0) =
limit(sin(x)/x, x, 0);
$\displaystyle \lim_{x \rightarrow 0} \frac{1 – \cos x}{x} = 0$ であることも確認します。
'limit((1-cos(x))/x, x, 0) =
limit((1-cos(x))/x, x, 0);
加法定理の確認
$\sin (x + h) = \sin x \, \cos h + \cos x \, \sin h$ および
$\cos (x + h) = \cos x \, \cos h – \sin x \, \sin h$ の確認。
三角関数を「展開」するときは,trigexpand()
関数を使います。
sin(x + h) = trigexpand(sin(x + h));
cos(x + h) = trigexpand(cos(x + h));
微分
まずは導関数の定義に従って $\sin x$ の微分をしてみます。
$\displaystyle \lim_{h \rightarrow 0} \frac{\sin(x+h) – \sin (x)}{h} = \cdots$
'limit((sin(x + h) - sin(x))/h, h, 0) =
limit((sin(x + h) - sin(x))/h, h, 0);
diff()
関数で三角関数を微分しても同じ答えが出ることを確認します。
'diff(sin(x), x) =
diff(sin(x), x);
$\cos x, \tan x$ の微分についても diff()
関数で計算します。
'diff(cos(x), x) =
diff(cos(x), x);
'diff(tan(x), x) =
diff(tan(x), x);
$\sec^2 x$ って見慣れないですね。
三角関数を「簡単化」する trigsimp()
関数でみると…
diff(tan(x), x) = trigsimp(diff(tan(x), x));
$\sec^2 x$ とは $\ \displaystyle \frac{1}{\cos^2 x}\ $ のことでした。
参考:三角関数のグラフ
$y = \sin x, \cos x, \tan x$ のグラフを描く。$ -2 \pi \leq x \leq 2 \pi$ の範囲で。$\tan x$ は非常に大きい値になる場合があるので,$y$ の表示範囲を適宜設定します。
plot2d([sin(x), cos(x), tan(x)],
[x, -2*%pi, 2*%pi], [y, -3, 3], grid2d)$
参考:横軸の目盛を $\pi/2$ ごとに
$x$ 軸(横軸)の目盛を $\pi/2$ ごとにしてみる。
plot2d(
[sin(x), cos(x), tan(x)], [x, -2*%pi, 2*%pi],
/* 線の太さを 2 に */
[style, [lines, 2], [lines, 2], [lines, 2]],
/* 凡例の設定 */
[legend, "sin x", "cos x", "tan x"],
[y, -3, 3], grid2d,
/* x 軸の目盛を π/2 ごとに */
[xtics, %pi/2],
/* x 軸のラベルのフォーマット設定; 凡例の線の長さ設定 */
[gnuplot_preamble, "set format x '%3.1P π';set key sample 0.2;"]
)$
逆三角関数
定義
逆三角関数は三角関数の逆関数として定義され,それぞれ
$\sin^{-1} x = \arcsin x = $ asin(x)
$\cos^{-1} x = \arccos x = $ acos(x)
$\tan^{-1} x = \arctan x = $ atan(x)
と書きます。逆関数ですから以下の関係が成り立つはずです。
$\sin\left(\sin^{-1} x\right) = x$
$\cos\left(\cos^{-1} x\right) = x$
$\tan\left(\tan^{-1} x\right) = x$
確認してみます。
sin(asin(x));
cos(acos(x));
tan(atan(x));
しかし,$\sin^{-1} \left(\sin x\right) = x$ などとは一般にはなりません。
反例は $x = \pi$ とすれば…
asin(sin(%pi));
答えは $\pi$ ではなく,$0$ です。$x = \pi$ の場合は $\sin^{-1} \left( \sin x \right) \neq x$ ということですね。
微分
'diff(asin(x), x) =
diff(asin(x), x);
'diff(acos(x), x) =
diff(acos(x), x);
'diff(atan(x), x) =
diff(atan(x), x);
参考:逆三角関数のグラフ
$\sin^{-1} x$ と $\cos^{-1} x$ の定義域は $ -1 < x < 1$,
$\tan^{-1} x$ の定義機は $-\infty < x < \infty$
であることに留意して,逆三角関数のグラフを描く。
plot2d([asin(x), acos(x)], [x, -1, 1], grid2d,
/* y 軸の目盛を π/4 ごとに */
[ytics, %pi/4],
[gnuplot_preamble, "set format y '%4.2P π';"])$
plot2d(atan(x), [x, -10, 10], grid2d,
/* y 軸の目盛を π/4 ごとに */
[ytics, %pi/4],
[gnuplot_preamble, "set format y '%4.2P π';"])$
双曲線関数
定義
双曲線関数は指数関数を使って以下のように定義されます。
$\displaystyle \sinh x \equiv \frac{e^{x} – e^{-x}}{2} =$ sinh(x)
$\displaystyle \cosh x \equiv \frac{e^{x} + e^{-x}}{2} =$ cosh(x)
$\displaystyle \tanh x \equiv \frac{\sinh x}{\cosh x} = \frac{e^{x} – e^{-x}}{e^{x} + e^{-x}} =$ tanh(x)
双曲線関数を指数関数を使って書き直すには
exponentialize()
関数を使います。
sinh(x) = exponentialize(sinh(x));
cosh(x) = exponentialize(cosh(x));
tanh(x) = exponentialize(tanh(x));
性質
$\cosh^2 x – \sinh^2 x = 1$ を確認してみます。双曲線関数も三角関数と同様に trigsimp()
を使って「簡単化」します。
cosh(x)**2 - sinh(x)**2 =
trigsimp(cosh(x)**2 - sinh(x)**2);
加法定理の確認
双曲線関数にも,三角関数の場合と似たような加法定理があります。trigexpand()
で「展開」して確認してみます。
cosh(x + y) = trigexpand(cosh(x + y));
sinh(x + y) = trigexpand(sinh(x + y));
tanh(x + y) = trigexpand(tanh(x + y));
微分
'diff(cosh(x), x) = diff(cosh(x), x);
'diff(sinh(x), x) = diff(sinh(x), x);
'diff(tanh(x), x) = diff(tanh(x), x);
$\operatorname{sech} x$ を簡単化すると…
'diff(tanh(x), x) = trigsimp(diff(tanh(x), x));
参考:双曲線関数のグラフ
$y = \sinh x, \ \cosh x$ のグラフ。
plot2d([sinh(x), cosh(x)], [x, -3, 3], grid2d)$
$ y = \tanh x$ のグラフ。
plot2d(tanh(x), [x, -5, 5], grid2d)$
逆双曲線関数
定義
逆双曲線関数は双曲線関数の逆関数として定義され,それぞれ
$\sinh^{-1} x = \mbox{arsinh}\ x = $ asinh(x)
$\cosh^{-1} x = \mbox{arcosh}\ x = $ acosh(x)
$\tanh^{-1} x = \mbox{artanh}\ x = $ atanh(x)
と書きます。(ar であり,arc ではない。)逆関数ですから以下の関係が成り立つはずです。
$\sinh\left(\sinh^{-1} x\right) = x$
$\cosh\left(\cosh^{-1} x\right) = x$
$\tanh\left(\tanh^{-1} x\right) = x$
確認してみます。
sinh(asinh(x));
cosh(acosh(x));
tanh(atanh(x));
双曲線関数は指数関数を使って表すことができましたが,逆双曲線関数は対数関数を使って表すことができます。以下の例のように,logarc()
関数を使います。
asinh(x) = logarc(asinh(x));
acosh(x) = logarc(acosh(x));
atanh(x) = logarc(atanh(x));
微分
'diff(asinh(x), x) = diff(asinh(x), x);
'diff(acosh(x), x) = diff(acosh(x), x);
'diff(atanh(x), x) = diff(atanh(x), x);
参考:逆双曲線関数のグラフ
$y = \sinh^{-1} x$ の定義域は $-\infty < x < \infty$
plot2d(asinh(x), [x, -10, 10], grid2d)$
$y = \cosh^{-1} x$ の定義域は $x \geq 1$
plot2d(acosh(x), [x, 1, 10], grid2d)$
$y = \tanh^{-1} x$ の定義域は $-1 < x < 1$
plot2d(atanh(x), [x, -0.999, 0.999], grid2d)$