倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

commons-math 解読 (12) : 複素数 Complex に定義されている複素関数 【一価関数編】

前回に引き続き、今回も Complex クラスを見ていきます。 今回扱うのは、Complex クラスに定義されている一価複素関数

複素関数メソッド

今回見ていく関数:

public class Complex{
    ...

    // 指数関数
    Complex exp()

    // 三角関数
    Complex sin()
    Complex cos()
    Complex tan()

    // 双曲線関数
    Complex sinh()
    Complex cosh()
    Complex tanh()
}

これらはすべて一価関数です。 つまり、1つの引数に対して返り値が一意に定まります。 次回にみる多価関数は、数学上は1つの引数に対していくつかの返り値の候補がありますが、commons-math では(通常そうするように)主値をとって返す値を1つに定めています。

サンプル

いくつかメソッドを見繕ってサンプルを書いてみました:

import static java.lang.Math.*

// 指数関数
assert new Complex(0d, PI/2d).exp() == Complex.I    // exp(iπ/2) = i

// 三角関数
assert new Complex(2d, 0d).sin() == new Complex(sin(2d), 0d)    // 実数値の三角関数と等しい
assert new Complex(0d, 2d).sin() == new Complex(0d, sinh(2d))    // sin(2i) = i sinh(2)

// 双曲線関数
assert new Complex(2d, 0d).sinh() == new Complex(sinh(2d), 0d)    // 実数値の双曲線関数と等しい
assert new Complex(0d, 2d).sinh() == new Complex(0d, sin(2d))    // sinh(2i) = i sin(2)

ちょっと込み入ってる部分もありますが、コンストラクタで Complex オブジェクトを生成しようとすると仕方がないですぅ。 各関数について以下で少し数学をしてます。

指数関数 Exponential Function

上記の複素関数を1つずつ見ていきましょう。 まず指数関数。 これは以下で出てくる三角関数双曲線関数の基本となる関数です。 複素変数の指数関数はもともと冪級数によって定義がなされてますが、他の関数への応用を考える場合はオイラーの公式

  { \displaystyle
\begin{align*}
    e^{i\theta} = \cos\theta + i\sin\theta
\end{align*}
}

を基本にすると分かりやすいでしょう(複素変数の指数関数を定義する冪級数からこのオイラーの公式が導けるのでやってることは同じですが)。

実部・虚部での表現
引数の複素数{z = x + yi }{ x,\,y } は実数)として、{ \exp(z) } の値を { x,\,y } と実数関数(引数に実数をとり、実数を返す関数とします)によって表すと

  { \displaystyle
\begin{align*}
    \exp(x + yi) = e^x\cos y + ie^x\sin y
\end{align*}
}

となります。

三角関数 Trigonometric Functions

次は三角関数。 オイラーの公式を使えば、三角関数と指数関数とは密接に関係していることが分かります。

指数関数との関係

  { \displaystyle
\begin{align*}
    \sin z &= \frac{e^{iz} - e^{-iz}}{2i} \\
    \cos z &= \frac{e^{iz} + e^{-iz}}{2} \\
    \tan z &= \frac{e^{iz} - e^{-iz}}{e^{iz} + e^{-iz}} = \frac{e^{2iz} - 1}{e^{2iz} + 1}
\end{align*}
}

実部・虚部での表現

  { \displaystyle
\begin{align*}
    \sin(x + yi) &= \sin x \cosh y + i \cos x \sinh y \\
    \cos(x + yi) &= \cos x \cosh y - i \sin x \sinh y \\
    \tan(x + yi) &= \frac{\sin 2x + i \sinh 2y}{\cos 2x + \cosh 2y}
\end{align*}
}

{ \tan(x + yi) } の表式は、導くのに三角関数双曲線関数の倍角の公式が必要です。

双曲線関数 Hyperbolic Functions

最後は双曲線関数。 三角関数よりはなじみがないかも知れませんが、指数関数との関係を見ると兄弟みたいなモノです。 むしろ三角関数よりも簡単かも。 要は慣れですね。

指数関数との関係

  { \displaystyle
\begin{align*}
    \sinh z &= \frac{e^z - e^{-z}}{2} \\
    \cosh z &= \frac{e^z + e^{-z}}{2} \\
    \tanh z &= \frac{e^z - e^{-z}}{e^z + e^{-z}} = \frac{e^{2z} - 1}{e^{2z} + 1}
\end{align*}
}

三角関数との関係

  { \displaystyle
\begin{align*}
    \sinh iz &= i \sin z &
    \sin iz &= i\sinh z \\
    \cosh iz &= \cos z  &
    \cos iz &= \cosh z \\
    \tanh iz &= i\tan z &
    \tan iz &= i\tanh z
\end{align*}
}

実部・虚部での表現

  { \displaystyle
\begin{align*}
    \sinh(x + yi) &= \sinh x \cos y + i \cosh x \sin y \\
    \cosh(x + yi) &= \cosh x \cos y + i \sinh x \sin y \\
    \tanh(x + yi) &= \frac{\sinh 2x + i \sin 2y}{\cosh 2x + \cos 2y}
\end{align*}
}

まぁ、三角関数の所で見た関係式と同じようなのばっかりですね。

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典

解析入門 (1)

解析入門 (1)