【VBA】複素数の定義と演算
VBA では複数のデータ型を1つにまとめるユーザー定義型 (構造体)を使うことができます(C言語における構造体と同じ概念です)。この記事では、このユーザー定義型変数によって複素数を処理する方法を解説します。
最初に宣言セクション(モジュールの冒頭部分)に、Typeステートメントを用いて「複素数型変数」を定義しておきます。
'[VBA]複素数型変数の定義
Type Complex
re As Double
im As Double
End Type
この記述によって、以降のマクロで Complex 型であると宣言された変数は、実部 (re) と虚部 (im) の2つの値をもつことになります。複素数
'[VBA]複素数の定義
Function CPX(a As Double, b As Double) As Complex
CPX.re = a
CPX.im = b
End Function
極形式
'[VBA]極形式による複素数の定義
Function CPX2(x As Double, Optional a As Double = 1) As Complex
CPX2.re = a * Cos(x)
CPX2.im = a * Sin(x)
End Function
以下に CPX関数と CPX2関数を呼びだして
'[VBA]2+3iと2exp(iπ/3)の定義
Sub CPX_TEST()
Dim z1 As Complex, z2 As Complex
Dim p As Double
p = 4 * Atn(1)
'z = 2 + 3iを定義
z1 = CPX(2, 3)
'z = 2exp(iπ/3)を定義
z2 = CPX2(p / 3, 2)
'2 + 3i の実部と虚部を表示
Debug.Print z1.re, z1.im
'2exp(iπ/3) の実部と虚部を表示
Debug.Print z2.re, z2.im
End Sub
CPX_TEST() を実行するとイミディエイトウィンドウに
共役複素数と絶対値(大きさ)
'VBA 共役複素数
Function CJG(z As Complex) As Complex
CJG.re = z.re
CJG.im = -z.im
End Function
'VBA 複素数の絶対値
Function CPXABS(z As Complex, _
Optional s As Boolean = True) As Double
CPXABS = z.re ^ 2 + z.im ^ 2
If s = True Then
CPXABS = Sqr(CPXABS)
End If
End Function
CPXABS関数を呼びだすときには
CPXABS(z[,演算の種類])
のように記述します。[演算の種類] はオプション引数で、True あるいは 1 を指定する(または省略する)と絶対値を計算します。False あるいは 0 を指定すると平方根をとらずに
'VBA 共役複素数と絶対値の計算例
Sub CJG_ABS_TEST()
Dim z1 As Complex
Dim cjgz1 As Complex
Dim absz1 As Double
'z1=3+5i
z1 = CPX(3, 5)
'z1の共役複素数
cjgz1 = CJG(z1)
'z1の絶対値
absz1 = CPXABS(z1)
Debug.Print cjgz1.re, cjgz1.im
Debug.Print absz1
End Sub
CJG_ABS_TEST() を実行すると
複素数の演算
複素数
'VBA 複素数の演算
Function CPXCLC(z1 As Complex, z2 As Complex, _
Optional s As Integer = 1) As Complex
Dim z As Complex
Dim k As Double
Select Case s
Case 1
z.re = z1.re + z2.re
z.im = z1.im + z2.im
Case 2
z.re = z1.re - z2.re
z.im = z1.im - z2.im
Case 3
z.re = z1.re * z2.re - z1.im * z2.im
z.im = z1.re * z2.im + z1.im * z2.re
Case Else
k = z2.re ^ 2 + z2.im ^ 2
z.re = (z1.re * z2.re + z1.im * z2.im) / k
z.im = (z1.im * z2.re - z1.re * z2.im) / k
End Select
CPXCLC = z
End Function
CPXCLC関数を呼びだすときには
CPXCLC(z1,z2[,演算の種類])
と記述します。3 つめの引数である演算の種類は
1:加算 2:減算 3:乗算 その他の数値:除算
となっています。省略すると加算します。以下に使用例を載せておきます。
'VBA 複素数の演算例
Sub CLC_TEST()
Dim z1 As Complex, z2 As Complex
Dim zsum As Complex, zsub As Complex
Dim zpdt As Complex, zdiv As Complex
z1 = CPX(5, 3)
z2 = CPX(2, 1)
'z1+z2
zsum = CPXCLC(z1, z2)
'z1-z2
zsub = CPXCLC(z1, z2, 2)
'z1*z2
zpdt = CPXCLC(z1, z2, 3)
'z1/z2
zdiv = CPXCLC(z1, z2, 4)
Debug.Print zsum.re, zsum.im
Debug.Print zsub.re, zsub.im
Debug.Print zpdt.re, zpdt.im
Debug.Print zdiv.re, zdiv.im
End Sub
CLC_TEST() を実行すると
複素数平面上の二点間距離
複素数
'VBA 複素数平面上の二点間距離
Function CPXD(z1 As Complex, z2 As Complex, _
Optional s As Boolean = True) As Double
CPXD = (z1.re - z2.re) ^ 2 + (z1.im - z2.im) ^ 2
If s = True Then
CPXD = Sqr(CPXD)
End If
End Function
CPXD 関数を使用するときは
CPXD(z1,z2[,演算の種類])
のように記述します。[演算の種類] はオプション引数で、True あるいは 1 を指定する(または省略する)と距離を計算します。False もしくは 0 を指定すると平方根をとらずに
'VBA 複素数平面上の二点間距離の計算例
Sub CPXD_TEST()
Dim z1 As Complex
Dim z2 As Complex
Dim cpxdz1 As Double
'z1=3+7i
z1 = CPX(3, 7)
'z2=1+2i
z2 = CPX(1, 2)
'|z1-z2|
cpxdz1 = CPXD(z1, z2)
Debug.Print cpxdz1
End Sub
CPXD_TEST() を実行すると
エクセルや数学に関するコメントをお寄せください
ワークシートの A 列に実数部、B 列に虚数部が入力されていると仮定します。たとえば、セル A1, B1, A2, B2 の値が 5, 3, 2, 7 だとして、(5+3i)+(2+7i) を計算する場合は以下のマクロを実行してください。
――――――――――
Sub test()
Dim z1 As Complex, z2 As Complex, z3 As Complex
z1 = CPX(Range(“A1”), Range(“B1”))
z2 = CPX(Range(“A2”), Range(“B2”))
z3 = CPXCLC(z1, z2, 1)
Debug.Print z3.re; z3.im
End Sub
――――――――――
実行すると、z3 の実数部 7 と虚数部 10 が出力されます。