Summary
This document explains how to perform complex arithmetic in AWR Scripting (VB).
VB does not handle complex arithmetic by default so we have to write our own functions. This becomes much more intuitive if we also use the VB "Type" definition capability to create a new data type, "Complex". Below are functions defined for many different complex number operations including some matrix operations with complex numbers. In addition to the functions there is code that tests the functions. The functions include:
Addition of complex numers
Subtraction of complex numbers
Multiplication of complex numbers
Division of complex numbers
Complex absolute value
Complex inversion
Real of a complex number
Imaginary of a complex number
Complex Matrix Addition
Complex Matrix Subtraction
Complex Matrix Inversion
Code Snippets
Public Type Complex re As Double im As Double End Type ' Complex Number Addition function Function Sum(z1 As Complex, z2 As Complex) As Complex Dim z As Complex z.re = z1.re + z2.re z.im = z1.im + z2.im Sum = z End Function ' Complex Number Substraction function Function Dif(z1 As Complex, z2 As Complex) As Complex Dim z As Complex z.re = z1.re - z2.re z.im = z1.im - z2.im Dif = z End Function ' Complex Number Multiplication function Function Mul(sign As Integer, z1 As Complex, z2 As Complex) As Complex Dim z As Complex z.re = sign*(z1.re*z2.re - z1.im*z2.im) z.im = sign*(z1.re*z2.im + z2.re*z1.im) Mul = z End Function ' Complex Number Division function Function Div(z1 As Complex, z2 As Complex) As Complex Dim z As Complex Dim r As Double r = z2.re^2+z2.im^2 z.re = (z1.re*z2.re + z1.im*z2.im)/r z.im = (z2.re*z1.im - z1.re*z2.im)/r Div = z End Function ' Complex Number norm function Function Cabs(z1 As Complex) As Double Cabs = (z1.re*z1.re + z1.im*z1.im)^0.5 End Function ' Complex Number Inversion function Function Inv(z1 As Complex) As Complex Dim z As Complex Dim Ident As Complex Ident.re = 1 Ident.im = 0 z = Div(Ident, z1) Inv = z End Function ' Complex Real function Function Real(z1 As Complex) As Double Dim z As Complex Real = z.re End Function ' Complex Imag function Function Imag(z1 As Complex) As Double Dim z As Complex Imag = z.im End Function ' Complex Number Matrix Addition function Function MSum(m1() As Complex, m2() As Complex) As Complex() Dim n As Integer Dim i As Integer Dim j As Integer Dim M() As Complex n = UBound(m1,1) ReDim M(n,n) For i=1 To n For j=1 To n M(i,j).re = m1(i,j).re + m2(i,j).re M(i,j).im = m1(i,j).im + m2(i,j).im Debug.Print "" & M(i,j).re & " | " & M(i,j).im & "j" Next j Next i MSum=M End Function ' Complex Number Matrix Substraction function Function MDif(m1() As Complex, m2() As Complex) As Complex() Dim n As Integer Dim i As Integer Dim j As Integer Dim M() As Complex n = UBound(m1,1) ReDim M(n,n) For i=1 To n For j=1 To n M(i,j).re = m1(i,j).re - m2(i,j).re M(i,j).im = m1(i,j).im - m2(i,j).im Debug.Print "" & M(i,j).re & " | " & M(i,j).im & "j" Next j Next i MDif=M End Function ' Complex Number Matrix Inversion function Function MInv(m1() As Complex) As Complex() Dim n As Integer Dim i As Integer Dim j As Integer Dim M() As Complex n = UBound(m1,1) ReDim M(n,n) Dim det As Complex Dim Ident As Complex Ident.re=1 Ident.im=0 det = Dif(Mul(1,m1(1,1),m1(2,2)),Mul(1,m1(1,2),m1(2,1))) M(1,1) = Div(m1(2,2), det) M(1,2) = Div(Mul(-1,Ident,m1(1,2)),det) M(2,1) = Div(Mul(-1,Ident,m1(2,1)),det) M(2,2) = Div(m1(1,1), det) For i=1 To n For j=1 To n Debug.Print "" & Format(M(i,j).re, "Scientific") & " | " & Format(M(i,j).im, "Scientific") & "j" Next j Next i MInv=M End Function Sub Main() 'TEST OF THE FUNCTIONS Debug.Clear 'Complex Number Decleration Dim Result As Complex Dim z1 As Complex Dim z2 As Complex z1.re=1 z1.im=2 z2.re=1 z2.im=3 ' Test Sum of Complex Number Result = Sum(z1, z2) Debug.Print "Sum " & Result.re & " | " & Result.im & "j" ' Test Dif of Complex Number Result = Dif(z1, z2) Debug.Print "Dif " & Result.re & " | " & Result.im & "j" ' Test Mul of Complex Number Result = Mul(1, z1, z2) Debug.Print "Mul " & Result.re & " | " & Result.im & "j" ' Test Div of Complex Number Result = Div(z1, z2) Debug.Print "Div " & Result.re & " | " & Result.im & "j" ' Test Inv of Complex Number Result = Inv(z1) Debug.Print "Inv " & Result.re & " | " & Result.im & "j" ' Complex Number Matrix Declaration Dim SResult() As Complex Dim n1(2,2) As Complex Dim n2(2,2) As Complex n1(1,1).re=3 n1(1,1).im=2 n1(1,2).re=1 n1(1,2).im=2 n1(2,1).re=2 n1(2,1).im=1 n1(2,2).re=1 n1(2,2).im=3 n2(1,1).re=1 n2(1,1).im=1 n2(1,2).re=2 n2(1,2).im=2 n2(2,1).re=3 n2(2,1).im=3 n2(2,2).re=4 n2(2,2).im=4 ' Test Sum Matrix SResult = MSum(n1,n2) ' Test Inv Matrix SResult = MInv(n1) End Sub