[VBA] 複素変数の指数関数と対数関数、ベキ関数

 この記事に載っている関数を使用するには複素数型変数の定義と CPX関数, CPXCLC関数、CPXARG関数を実装しておく必要があります。最新コード をモジュールに貼り付けてください(この記事のマクロも含まれています)。

複素変数の指数関数

 複素変数の指数関数 は次のように定義されています。

\[e^z=e^x(\cos y+i\sin y)\tag{A}\]

 このような形で拡張された指数関数は
 
\[e^{x+iy}=e^xe^{iy}\tag{A1}\]
という指数法則をみたし、実関数 $e^x$ もこの中に含まれます。
 
\[e^{x+i0}=e^xe^{0}=e^x\]
 複素変数の指数関数を使うと $e^i$ のような値も計算できます。
 
\[e^i=e^{0+1i}=e^0(\cos 1+i\sin 1)=\cos 1+i\sin 1\]
 定義により $e^z$ は次のような性質をみたすこともわかります。
 
\[\begin{align*}&e^{z_1}e^{z_2}=e^{z_1z_2}\tag{A2}\\[6pt]
&(e^z)^{-1}=e^{-z}\tag{A3}\\[6pt]
&|e^z|=e^x\tag{A4}\\[6pt]
&e^{z+2k\pi i}=e^x\quad (k=0,\:\pm1,\:\cdots)\tag{A5}\end{align*}\]
 ほとんどの計算規則は実関数の指数計算と同じですが、公式 (A5) にあるように、$e^z$ は周期 $2\pi i$ の周期関数となっています。このことは $e^z$ の逆関数として定義される対数関数 $\log z$ が多価関数となることを意味しています。
 

複素変数の指数関数を計算する CEXP関数

 任意の複素数 $z$ を与えて $e^z$ を計算するマクロを作ってみます。

 '複素変数の指数関数 (C)Blog Cat

 Function CEXP(z As Complex) As Complex

 CEXP.re = exp(z.re) * (Cos(z.im))
 CEXP.im = exp(z.re) * (Sin(z.im))

 End Function

 CEXP関数をよびだすときには、複素数型数値を引数に指定して

CEXP(z)

と記述します。戻り値もまた複素数型となります。以下に使用例を載せておきます。

 '複素変数指数関数の計算例

 Sub CEXPtest()

 Dim i As Integer
 Dim z(3) As Complex
 Dim expz(3) As Complex

 z(1) = CPX(1, 0)
 z(2) = CPX(0, 1)
 z(3) = CPX(1, 1)

 For i = 1 To 3
  expz(i) = CEXP(z(i))
  Debug.Print expz(i).re; expz(i).im
 Next i

 End Sub

 $z=1,\:i,\:1+i$ という複素数を用意して $e^z$ を計算させています。
 実行すると、それぞれ

 2.71828182845905 + 0i
 0.54030230586814 + 0.841470984807897i
 1.46869393991589 + 2.28735528717884i

のような計算結果が表示されます。
 

複素変数の対数関数

 複素変数の対数関数は指数関数 $z=e^w$ の逆関数として定義され、

\[\log z=\log|z|+i\mathrm{arg}z\tag{A}\]

と表されます(底は $e$ です)。ただし偏角は
 
\[\mathrm{arg}z=\theta+2k\pi i\]
という任意性があるので、$\log z$ は無限多価関数です。

複素変数の自然対数を計算する CXLOG関数

 複素変数の自然対数を計算する Function Macro です。

 '複素変数の対数関数 (C)Blog Cat

 Function CXLOG(z As Complex, _
 Optional s As Boolean = False) As Complex

 Dim absz As Double
 Dim argz As Double
 Dim logz As Complex
 Dim iargz As Complex

 absz = CPXABS(z)
 argz = CPXARG(z)

 '偏角を-π~πにとります

 If s = True Then

 argz = CPXARG(z, True)

 End If

 logz = CPX(Log(absz), 0)
 iargz = CPXCLC(CPX(0, 1), CPX(argz, 0), 3)

 CXLOG = CPXCLC(logz, iargz)

 End Function

 この関数を呼びだすときには、

CXLOG(z[,偏角の範囲])

と記述します。z には Complex型数値を指定してください。[偏角の範囲] に True または 1 を指定すると $-\pi\lt\mathrm{argz}\leq\pi$ の範囲で対数値を返します。False または 0 を指定すると $0\lt\mathrm{argz}\leq 2\pi$ の範囲で対数値を返します。省略した場合は False を指定したことになります。CXLOG関数の計算例を載せておきます。

 'logz の計算例

 Sub CXLOGtest()

 Dim z As Complex
 Dim logz As Complex

 z = CPX(1, 1)

 logz = CXLOG(z)

 Debug.Print logz.re & " + " & logz.im & "i"

 End Sub

 $1+i$ の自然対数 $\log (1+i)$ を計算します。実行すると

0.346573590279973 + 0.785398163397448i

という値が帰ります。
 

複素数のベキ関数

 複素数 $z,\:a$ について、累乗は
 
\[z^a=e^{a\log z}\]
と定義されています。たとえば $i^i$ は
 
\[i^i=e^{i\log i}=e^{i(1/2+k)\pi i}=e^{-(1/2+k)\pi}\]
というように計算できます。$\log z$ が無限多価関数なので、ベキ関数も無限多価関数です。
 

複素数のベキ関数を計算する CXPOWER関数

 複素数の累乗を計算する Function Macro です。

 '複素数のベキ乗 (C)Blog Cat

 Function CXPOWER(z As Complex, a As Complex, _
 Optional s As Boolean = False) As Complex

 Dim alogz As Complex

 If z.re = 0 And z.im = 0 Then

 CXPOWER = CPX(0, 0)

 Else

 alogz = CPXCLC(a, CXLOG(z), 3)

 If s = True Then

 alogz = CPXCLC(a, CXLOG(z, True), 3)

 End If

 CXPOWER = CEXP(alogz)

 End If

 End Function

 CXPOWER関数を呼びだすときには、

CXPOWER(z[,偏角の範囲])

と記述します。z には Complex型数値を指定します。[偏角の範囲] に True または 1 を指定すると $-\pi\lt\mathrm{argz}\leq\pi$ の範囲でベキを返します。False または 0 を指定すると $0\lt\mathrm{argz}\leq 2\pi$ の範囲でベキを返します。省略した場合は False を指定したことになります。下に CXPOWER関数の計算例を載せておきます。

 'z^a の計算例

 Sub CXPOWERtest()

 Dim z1 As Complex
 Dim ii As Complex

 z1 = CPX(0, 1)

 ii = CXPOWER(z1, z1)

 Debug.Print ii.re & " + " & ii.im & "i"

 End Sub

 実行すると $i^i$ を計算して

0.207879576350762 + 0i

という値を戻します。 ≫ VBA 数値計算

スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください