Author:水如煙
摘要:嘗試建立一個複數類,應用於複數運算、平面向量和平面座標系的轉換。
複數類的設計
目的要求:
- 應方便輸入習慣
- 應滿足輸出要求
- 應與實際數學運算過程的形式保持一致
關鍵:發揮複數兩種表示方式的特點,注重複數幾何表示與平面向量的結合。
知識:複數常用的表示形式有兩種,一是定義式,即z=a+bi,其中a爲實部b爲虛部,二是指數式,即z=rExp(θi),其中r爲模θ爲輻角,兩者通過z=a+bi=r(cosθ+isinθ)來轉換. 在複數運算中,加減用定義式方便,乘除用指數式快捷,在開n次方求n次冪時,更是需要指數式.
注:在代碼的註釋中,定義式我稱爲實虛表示,而指數式稱爲模輻表示。
困惑處:如何判斷一個向量是零向量,相應有如何判斷兩個向量相等。
以下爲代碼(VB.NET,MVS2005):
在VB.NET論壇中也有相應的代碼,地址:好久沒寫代碼了,寫個複數類試試看
01、文件Complex.AngleUnitType.vb,角度單位
Namespace LzmTW.uMath
Partial Class Complex
''' <summary>
''' 角度單位
''' </summary>
''' <remarks></remarks>
Public Enum AngleUnitType
''' <summary>
''' 弧度
''' </summary>
[Default]
''' <summary>
''' 度
''' </summary>
Degree
''' <summary>
''' PI單位弧度
''' </summary>
PI
End Enum
End Class
End Namespace
Partial Class Complex
''' <summary>
''' 角度單位
''' </summary>
''' <remarks></remarks>
Public Enum AngleUnitType
''' <summary>
''' 弧度
''' </summary>
[Default]
''' <summary>
''' 度
''' </summary>
Degree
''' <summary>
''' PI單位弧度
''' </summary>
PI
End Enum
End Class
End Namespace
02、文件Complex.FormatType.vb,輸出形式
Namespace LzmTW.uMath
Partial Class Complex
''' <summary>
''' 表示形式
''' </summary>
''' <remarks></remarks>
Public Enum FormatType
''' <summary>
''' 代數定義,如 1 + 1i
''' </summary>
''' <remarks></remarks>
Normal
''' <summary>
''' 座標標準定義,如 (1,1)
''' </summary>
''' <remarks></remarks>
CoordinateNormal
''' <summary>
''' 座標模輻定義,弧度,如 (2,0.9)
''' </summary>
''' <remarks></remarks>
CoordinateDefault
''' <summary>
''' 座標模輻定義,PI單位弧度,如 (2,0.5π)
''' </summary>
''' <remarks></remarks>
CoordinatePI
''' <summary>
''' 座標模輻定義,度,如 (2,45°)
''' </summary>
''' <remarks></remarks>
CoordinateDegree
''' <summary>
''' 三角,弧度,如 2(cos(0.9) + isin(0.9))
''' </summary>
''' <remarks></remarks>
TriangleDefault
''' <summary>
''' 三角,PI單位弧度,如 2(cos(0.5π) + isin(0.5π))
''' </summary>
''' <remarks></remarks>
TrianglePI
''' <summary>
''' 三角,度,如 2(cos(45°) + isin(45°))
''' </summary>
''' <remarks></remarks>
TriangleDegree
''' <summary>
''' 指數,弧度,如 2Exp(0.9i)
''' </summary>
''' <remarks></remarks>
ExponentDefault
''' <summary>
''' 指數,PI單位弧度,如 2Exp(0.5πi)
''' </summary>
''' <remarks></remarks>
ExponentPI
''' <summary>
''' 指數,度,如 2Exp(45°i)
''' </summary>
''' <remarks></remarks>
ExponentDegree
End Enum
End Class
End Namespace
Partial Class Complex
''' <summary>
''' 表示形式
''' </summary>
''' <remarks></remarks>
Public Enum FormatType
''' <summary>
''' 代數定義,如 1 + 1i
''' </summary>
''' <remarks></remarks>
Normal
''' <summary>
''' 座標標準定義,如 (1,1)
''' </summary>
''' <remarks></remarks>
CoordinateNormal
''' <summary>
''' 座標模輻定義,弧度,如 (2,0.9)
''' </summary>
''' <remarks></remarks>
CoordinateDefault
''' <summary>
''' 座標模輻定義,PI單位弧度,如 (2,0.5π)
''' </summary>
''' <remarks></remarks>
CoordinatePI
''' <summary>
''' 座標模輻定義,度,如 (2,45°)
''' </summary>
''' <remarks></remarks>
CoordinateDegree
''' <summary>
''' 三角,弧度,如 2(cos(0.9) + isin(0.9))
''' </summary>
''' <remarks></remarks>
TriangleDefault
''' <summary>
''' 三角,PI單位弧度,如 2(cos(0.5π) + isin(0.5π))
''' </summary>
''' <remarks></remarks>
TrianglePI
''' <summary>
''' 三角,度,如 2(cos(45°) + isin(45°))
''' </summary>
''' <remarks></remarks>
TriangleDegree
''' <summary>
''' 指數,弧度,如 2Exp(0.9i)
''' </summary>
''' <remarks></remarks>
ExponentDefault
''' <summary>
''' 指數,PI單位弧度,如 2Exp(0.5πi)
''' </summary>
''' <remarks></remarks>
ExponentPI
''' <summary>
''' 指數,度,如 2Exp(45°i)
''' </summary>
''' <remarks></remarks>
ExponentDegree
End Enum
End Class
End Namespace
03、文件Complex.Const.vb,常數定義
Namespace LzmTW.uMath
Partial Class Complex
''' <summary>
''' π
''' </summary>
''' <remarks></remarks>
Public Const d_PI As Double = Math.PI
''' <summary>
''' 2π
''' </summary>
''' <remarks></remarks>
Public Const d_2PI As Double = Math.PI * 2
''' <summary>
''' π/2
''' </summary>
''' <remarks></remarks>
Public Const d_PIHalf As Double = Math.PI / 2
''' <summary>
''' 1°
''' </summary>
''' <remarks></remarks>
Public Const d_Degree As Double = Math.PI / 180
''' <summary>
''' e
''' </summary>
''' <remarks></remarks>
Public Const d_E As Double = Math.E
''' <summary>
''' π字符
''' </summary>
''' <remarks></remarks>
Public Const c_PI As String = "π"
''' <summary>
''' e字符
''' </summary>
''' <remarks></remarks>
Public Const c_E As String = "exp"
''' <summary>
''' °字符
''' </summary>
''' <remarks></remarks>
Public Const c_Degree As String = "°"
''' <summary>
''' i,虛單位字符
''' </summary>
''' <remarks></remarks>
Public Const c_ImaginaryUnit As String = "i"
End Class
End Namespace
Partial Class Complex
''' <summary>
''' π
''' </summary>
''' <remarks></remarks>
Public Const d_PI As Double = Math.PI
''' <summary>
''' 2π
''' </summary>
''' <remarks></remarks>
Public Const d_2PI As Double = Math.PI * 2
''' <summary>
''' π/2
''' </summary>
''' <remarks></remarks>
Public Const d_PIHalf As Double = Math.PI / 2
''' <summary>
''' 1°
''' </summary>
''' <remarks></remarks>
Public Const d_Degree As Double = Math.PI / 180
''' <summary>
''' e
''' </summary>
''' <remarks></remarks>
Public Const d_E As Double = Math.E
''' <summary>
''' π字符
''' </summary>
''' <remarks></remarks>
Public Const c_PI As String = "π"
''' <summary>
''' e字符
''' </summary>
''' <remarks></remarks>
Public Const c_E As String = "exp"
''' <summary>
''' °字符
''' </summary>
''' <remarks></remarks>
Public Const c_Degree As String = "°"
''' <summary>
''' i,虛單位字符
''' </summary>
''' <remarks></remarks>
Public Const c_ImaginaryUnit As String = "i"
End Class
End Namespace
04、文件Complex.Define.vb,全局性重要參數函數定義
Namespace LzmTW.uMath
Partial Class Complex
''' <summary>
''' 可認可的最大誤差
''' </summary>
''' <remarks>此參數非常重要。兩複數是否相等,判斷一個向量是否是零向量,皆參考它決定</remarks>
Private Shared gAbsoluteZero As Double = 0.000000000000001 'PI是16位有效小數
''' <summary>
''' 最小認可誤差,小於等於此值可視爲零
''' </summary>
Public Shared Property AbsoluteZero() As Double
Get
Return gAbsoluteZero
End Get
Set(ByVal value As Double)
gAbsoluteZero = value
End Set
End Property
''' <summary>
''' 判斷數值可否作爲零處理
''' </summary>
Public Shared Function IsEqualsAbsoluteZero(ByVal value As Double) As Boolean
Return Math.Abs(value) <= gAbsoluteZero
End Function
End Class
End Namespace
Partial Class Complex
''' <summary>
''' 可認可的最大誤差
''' </summary>
''' <remarks>此參數非常重要。兩複數是否相等,判斷一個向量是否是零向量,皆參考它決定</remarks>
Private Shared gAbsoluteZero As Double = 0.000000000000001 'PI是16位有效小數
''' <summary>
''' 最小認可誤差,小於等於此值可視爲零
''' </summary>
Public Shared Property AbsoluteZero() As Double
Get
Return gAbsoluteZero
End Get
Set(ByVal value As Double)
gAbsoluteZero = value
End Set
End Property
''' <summary>
''' 判斷數值可否作爲零處理
''' </summary>
Public Shared Function IsEqualsAbsoluteZero(ByVal value As Double) As Boolean
Return Math.Abs(value) <= gAbsoluteZero
End Function
End Class
End Namespace
05、文件Complex.ComplexBase.vb,處理複數兩種方式的共用類
Namespace LzmTW.uMath
Partial Class Complex
Private MustInherit Class ComplexBase
Protected gIsZeroVector As Boolean '定義是否爲零向量。
Protected gMaster As Double '實部或模
Protected gSecondary As Double '虛部或輻角
Protected gArg As Double '如是用模輻表示,此爲輻角主值。如是實虛表示則不必處理此變量。
Private gRoundDigits As Integer = -1 '輸出小數有效位。在0至15之間。如是負數,則不取捨
Private Shared gGlobalRoundDigits As Integer = -1 '意義同上,只是它是全局性的。
''' <summary>
''' 顯示數據時輸出有效小數位,如小於零則不作取捨
''' </summary>
Public Property RoundDigits() As Integer
Get
Return gRoundDigits
End Get
Set(ByVal value As Integer)
If value > 15 Then
gRoundDigits = 15
Else
gRoundDigits = value
End If
End Set
End Property
''' <summary>
''' 意義同RoundDigits.如此值大於等於零,參考此值;如小於零,則參考RoundDigits值。
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Property GlobalRoundDigits() As Integer
Get
Return gGlobalRoundDigits
End Get
Set(ByVal value As Integer)
If value > 15 Then
gGlobalRoundDigits = 15
Else
gGlobalRoundDigits = value
End If
End Set
End Property
Sub New()
Me.InternalLoadData(0, 0)
End Sub
Sub New(ByVal master As Double, ByVal secondary As Double)
'使用(模,輻角)表示時,模不能爲負值
Me.InternalDoBeforeLoad(master, secondary)
Me.InternalLoadData(master, secondary)
End Sub
Protected Sub InternalLoadData(ByVal master As Double, ByVal secondary As Double)
Me.gMaster = master
Me.gSecondary = secondary
'使用(模,輻角)表示時,在此處理輻角主值
InternalDoAfterLoad()
Me.CheckIsZeroVector()
End Sub
Private Sub CheckIsZeroVector()
Me.gIsZeroVector = InternalCheckIsZeroVector()
If Me.gIsZeroVector Then InternalDoIfIsZeroVector()
End Sub
#Region "有必要重載部分"
''' <summary>
''' 可以重載實現加載數據前的處理
''' </summary>
Protected Overridable Sub InternalDoBeforeLoad(ByVal master As Double, ByVal secondary As Double)
End Sub
''' <summary>
''' 可以重載實現加載數據後的處理
''' </summary>
Protected Overridable Sub InternalDoAfterLoad()
End Sub
''' <summary>
''' 可以重載當爲零向量時的處理
''' </summary>
''' <remarks></remarks>
Protected Overridable Sub InternalDoIfIsZeroVector()
End Sub
''' <summary>
''' 判斷是否爲零向量
''' </summary>
Protected MustOverride Function InternalCheckIsZeroVector() As Boolean
Overridable Sub Add(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Subtract(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Multy(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Divide(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
#End Region
#Region "數據輸出顯示處理"
Public Overloads Function ToString(ByVal format As FormatType) As String
If Me.gIsZeroVector Then Return "0"
Select Case format
Case FormatType.Normal
Return String.Concat(Me.RoundStringReal(gMaster), Me.RoundStringSign(gMaster, gSecondary), Me.RoundStringImaginary(gSecondary))
Case FormatType.CoordinateNormal
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gSecondary))
Case FormatType.CoordinateDefault
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg))
Case FormatType.CoordinatePI
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.PI))
Case FormatType.CoordinateDegree
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.Degree))
Case FormatType.TriangleDefault
Return RoundStringOther(True, AngleUnitType.Default)
Case FormatType.TrianglePI
Return RoundStringOther(True, AngleUnitType.PI)
Case FormatType.TriangleDegree
Return RoundStringOther(True, AngleUnitType.Degree)
Case FormatType.ExponentDefault
Return RoundStringOther(False, AngleUnitType.Default)
Case FormatType.ExponentPI
Return RoundStringOther(False, AngleUnitType.PI)
Case FormatType.ExponentDegree
Return RoundStringOther(False, AngleUnitType.Degree)
End Select
Return "format is invalid."
End Function
'實虛表示與以弧度單位的模輻表示,其處理過程一樣。
'因此,可以借用AngleUnitType.Default來處理實虛部分。
Private Function RoundString(ByVal value As Double, Optional ByVal toUnit As AngleUnitType = AngleUnitType.Default) As String
Return AngleConvertStringFromDefault(value, toUnit, GetDigits)
End Function
Private Function RoundStringReal(ByVal value As Double) As String
value = Complex.Round(value, GetDigits)
If value = 0 Then Return String.Empty
Return value.ToString
End Function
Private Function RoundStringSign(ByVal real As Double, ByVal imaginary As Double) As String
real = Complex.Round(real, GetDigits)
imaginary = Complex.Round(imaginary, GetDigits)
If real = 0 Then
Select Case Math.Sign(imaginary)
Case 0, 1
Return String.Empty
Case -1
Return "-"
End Select
Else
Select Case Math.Sign(imaginary)
Case 0
Return String.Empty
Case 1
Return " + "
Case -1
Return " - "
End Select
End If
Return Nothing
End Function
Private Function RoundStringImaginary(ByVal value As Double) As String
value = Math.Abs(Complex.Round(value, GetDigits))
If value = 0 Then Return String.Empty
If value = 1 OrElse value = -1 Then Return Complex.c_ImaginaryUnit
Return String.Concat(value, Complex.c_ImaginaryUnit)
End Function
Private Function RoundStringOther(ByVal isTriangle As Boolean, ByVal unit As AngleUnitType) As String
Dim mModulus As Double = Complex.Round(gMaster, GetDigits)
Dim mArg As Double = Complex.Round(gArg, GetDigits)
If isTriangle Then
If mModulus = 1 Then Return String.Format("cos({0}) + {1}sin({0})", RoundString(mArg, unit), Complex.c_ImaginaryUnit)
Return String.Format("{2}(cos({0}) + {1}sin({0}))", RoundString(mArg, unit), Complex.c_ImaginaryUnit, mModulus)
Else
If mModulus = 1 Then Return String.Format("{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E)
Return String.Format("{3}{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E, mModulus)
End If
Return Nothing
End Function
Private Function GetDigits() As Integer
If gGlobalRoundDigits < 0 Then Return gRoundDigits
Return gGlobalRoundDigits
End Function
#End Region
End Class
End Class
End Namespace
Partial Class Complex
Private MustInherit Class ComplexBase
Protected gIsZeroVector As Boolean '定義是否爲零向量。
Protected gMaster As Double '實部或模
Protected gSecondary As Double '虛部或輻角
Protected gArg As Double '如是用模輻表示,此爲輻角主值。如是實虛表示則不必處理此變量。
Private gRoundDigits As Integer = -1 '輸出小數有效位。在0至15之間。如是負數,則不取捨
Private Shared gGlobalRoundDigits As Integer = -1 '意義同上,只是它是全局性的。
''' <summary>
''' 顯示數據時輸出有效小數位,如小於零則不作取捨
''' </summary>
Public Property RoundDigits() As Integer
Get
Return gRoundDigits
End Get
Set(ByVal value As Integer)
If value > 15 Then
gRoundDigits = 15
Else
gRoundDigits = value
End If
End Set
End Property
''' <summary>
''' 意義同RoundDigits.如此值大於等於零,參考此值;如小於零,則參考RoundDigits值。
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Property GlobalRoundDigits() As Integer
Get
Return gGlobalRoundDigits
End Get
Set(ByVal value As Integer)
If value > 15 Then
gGlobalRoundDigits = 15
Else
gGlobalRoundDigits = value
End If
End Set
End Property
Sub New()
Me.InternalLoadData(0, 0)
End Sub
Sub New(ByVal master As Double, ByVal secondary As Double)
'使用(模,輻角)表示時,模不能爲負值
Me.InternalDoBeforeLoad(master, secondary)
Me.InternalLoadData(master, secondary)
End Sub
Protected Sub InternalLoadData(ByVal master As Double, ByVal secondary As Double)
Me.gMaster = master
Me.gSecondary = secondary
'使用(模,輻角)表示時,在此處理輻角主值
InternalDoAfterLoad()
Me.CheckIsZeroVector()
End Sub
Private Sub CheckIsZeroVector()
Me.gIsZeroVector = InternalCheckIsZeroVector()
If Me.gIsZeroVector Then InternalDoIfIsZeroVector()
End Sub
#Region "有必要重載部分"
''' <summary>
''' 可以重載實現加載數據前的處理
''' </summary>
Protected Overridable Sub InternalDoBeforeLoad(ByVal master As Double, ByVal secondary As Double)
End Sub
''' <summary>
''' 可以重載實現加載數據後的處理
''' </summary>
Protected Overridable Sub InternalDoAfterLoad()
End Sub
''' <summary>
''' 可以重載當爲零向量時的處理
''' </summary>
''' <remarks></remarks>
Protected Overridable Sub InternalDoIfIsZeroVector()
End Sub
''' <summary>
''' 判斷是否爲零向量
''' </summary>
Protected MustOverride Function InternalCheckIsZeroVector() As Boolean
Overridable Sub Add(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Subtract(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Multy(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
Overridable Sub Divide(ByVal value As Object)
Me.CheckIsZeroVector()
End Sub
#End Region
#Region "數據輸出顯示處理"
Public Overloads Function ToString(ByVal format As FormatType) As String
If Me.gIsZeroVector Then Return "0"
Select Case format
Case FormatType.Normal
Return String.Concat(Me.RoundStringReal(gMaster), Me.RoundStringSign(gMaster, gSecondary), Me.RoundStringImaginary(gSecondary))
Case FormatType.CoordinateNormal
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gSecondary))
Case FormatType.CoordinateDefault
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg))
Case FormatType.CoordinatePI
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.PI))
Case FormatType.CoordinateDegree
Return String.Format("({0},{1})", RoundString(gMaster), RoundString(gArg, AngleUnitType.Degree))
Case FormatType.TriangleDefault
Return RoundStringOther(True, AngleUnitType.Default)
Case FormatType.TrianglePI
Return RoundStringOther(True, AngleUnitType.PI)
Case FormatType.TriangleDegree
Return RoundStringOther(True, AngleUnitType.Degree)
Case FormatType.ExponentDefault
Return RoundStringOther(False, AngleUnitType.Default)
Case FormatType.ExponentPI
Return RoundStringOther(False, AngleUnitType.PI)
Case FormatType.ExponentDegree
Return RoundStringOther(False, AngleUnitType.Degree)
End Select
Return "format is invalid."
End Function
'實虛表示與以弧度單位的模輻表示,其處理過程一樣。
'因此,可以借用AngleUnitType.Default來處理實虛部分。
Private Function RoundString(ByVal value As Double, Optional ByVal toUnit As AngleUnitType = AngleUnitType.Default) As String
Return AngleConvertStringFromDefault(value, toUnit, GetDigits)
End Function
Private Function RoundStringReal(ByVal value As Double) As String
value = Complex.Round(value, GetDigits)
If value = 0 Then Return String.Empty
Return value.ToString
End Function
Private Function RoundStringSign(ByVal real As Double, ByVal imaginary As Double) As String
real = Complex.Round(real, GetDigits)
imaginary = Complex.Round(imaginary, GetDigits)
If real = 0 Then
Select Case Math.Sign(imaginary)
Case 0, 1
Return String.Empty
Case -1
Return "-"
End Select
Else
Select Case Math.Sign(imaginary)
Case 0
Return String.Empty
Case 1
Return " + "
Case -1
Return " - "
End Select
End If
Return Nothing
End Function
Private Function RoundStringImaginary(ByVal value As Double) As String
value = Math.Abs(Complex.Round(value, GetDigits))
If value = 0 Then Return String.Empty
If value = 1 OrElse value = -1 Then Return Complex.c_ImaginaryUnit
Return String.Concat(value, Complex.c_ImaginaryUnit)
End Function
Private Function RoundStringOther(ByVal isTriangle As Boolean, ByVal unit As AngleUnitType) As String
Dim mModulus As Double = Complex.Round(gMaster, GetDigits)
Dim mArg As Double = Complex.Round(gArg, GetDigits)
If isTriangle Then
If mModulus = 1 Then Return String.Format("cos({0}) + {1}sin({0})", RoundString(mArg, unit), Complex.c_ImaginaryUnit)
Return String.Format("{2}(cos({0}) + {1}sin({0}))", RoundString(mArg, unit), Complex.c_ImaginaryUnit, mModulus)
Else
If mModulus = 1 Then Return String.Format("{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E)
Return String.Format("{3}{2}({0}{1})", RoundString(mArg, unit), Complex.c_ImaginaryUnit, Complex.c_E, mModulus)
End If
Return Nothing
End Function
Private Function GetDigits() As Integer
If gGlobalRoundDigits < 0 Then Return gRoundDigits
Return gGlobalRoundDigits
End Function
#End Region
End Class
End Class
End Namespace
06、文件Complex.Complex1.vb,實現複數的實虛表示
Namespace LzmTW.uMath
Partial Class Complex
Private Class Complex1
Inherits ComplexBase
Sub New()
MyBase.New()
End Sub
Sub New(ByVal real As Double)
MyBase.New(real, 0)
End Sub
Sub New(ByVal real As Double, ByVal imaginary As Double)
MyBase.New(real, imaginary)
End Sub
''' <summary>
''' 實部
''' </summary>
Public ReadOnly Property Real() As Double
Get
Return Me.gMaster
End Get
End Property
''' <summary>
''' 虛部
''' </summary>
Public ReadOnly Property Imaginary() As Double
Get
Return Me.gSecondary
End Get
End Property
#Region "重載部分"
Protected Overrides Function InternalCheckIsZeroVector() As Boolean
Return Complex.IsEqualsAbsoluteZero(gMaster) AndAlso Complex.IsEqualsAbsoluteZero(gSecondary)
End Function
Public Overrides Sub Add(ByVal value As Object)
With CType(value, Complex1)
Me.gMaster += .gMaster
Me.gSecondary += .gSecondary
End With
MyBase.Add(value)
End Sub
Public Overrides Sub Divide(ByVal value As Object)
With CType(value, Complex1)
Dim tmp As Double = .gMaster * .gMaster + .gSecondary * .gSecondary
Dim mReal As Double = (Me.gMaster * .gMaster + Me.gSecondary * .gSecondary) / tmp
Dim mImaginary As Double = (Me.gSecondary * .gMaster - Me.gMaster * .gSecondary) / tmp
Me.gMaster = mReal
Me.gSecondary = mImaginary
End With
MyBase.Divide(value)
End Sub
Public Overrides Sub Multy(ByVal value As Object)
With CType(value, Complex1)
Dim tmpReal As Double = Me.gMaster * .gMaster - Me.gSecondary * .gSecondary
Dim tmpImaginary As Double = Me.gSecondary * .gMaster + Me.gMaster * .gSecondary
Me.gMaster = tmpReal
Me.gSecondary = tmpImaginary
End With
MyBase.Multy(value)
End Sub
Public Overrides Sub Subtract(ByVal value As Object)
With CType(value, Complex1)
Me.gMaster -= .gMaster
Me.gSecondary -= .gSecondary
End With
MyBase.Subtract(value)
End Sub
#End Region
#Region "擴展部分"
Public Function ToComplex2() As Complex2
Dim mModulus As Double = Math.Sqrt(Me.Real * Me.Real + Me.Imaginary * Me.Imaginary)
Dim mArgument As Double = Math.Atan2(Me.Imaginary, Me.Real)
Return New Complex2(mModulus, mArgument)
End Function
#End Region
End Class
End Class
End Namespace
Partial Class Complex
Private Class Complex1
Inherits ComplexBase
Sub New()
MyBase.New()
End Sub
Sub New(ByVal real As Double)
MyBase.New(real, 0)
End Sub
Sub New(ByVal real As Double, ByVal imaginary As Double)
MyBase.New(real, imaginary)
End Sub
''' <summary>
''' 實部
''' </summary>
Public ReadOnly Property Real() As Double
Get
Return Me.gMaster
End Get
End Property
''' <summary>
''' 虛部
''' </summary>
Public ReadOnly Property Imaginary() As Double
Get
Return Me.gSecondary
End Get
End Property
#Region "重載部分"
Protected Overrides Function InternalCheckIsZeroVector() As Boolean
Return Complex.IsEqualsAbsoluteZero(gMaster) AndAlso Complex.IsEqualsAbsoluteZero(gSecondary)
End Function
Public Overrides Sub Add(ByVal value As Object)
With CType(value, Complex1)
Me.gMaster += .gMaster
Me.gSecondary += .gSecondary
End With
MyBase.Add(value)
End Sub
Public Overrides Sub Divide(ByVal value As Object)
With CType(value, Complex1)
Dim tmp As Double = .gMaster * .gMaster + .gSecondary * .gSecondary
Dim mReal As Double = (Me.gMaster * .gMaster + Me.gSecondary * .gSecondary) / tmp
Dim mImaginary As Double = (Me.gSecondary * .gMaster - Me.gMaster * .gSecondary) / tmp
Me.gMaster = mReal
Me.gSecondary = mImaginary
End With
MyBase.Divide(value)
End Sub
Public Overrides Sub Multy(ByVal value As Object)
With CType(value, Complex1)
Dim tmpReal As Double = Me.gMaster * .gMaster - Me.gSecondary * .gSecondary
Dim tmpImaginary As Double = Me.gSecondary * .gMaster + Me.gMaster * .gSecondary
Me.gMaster = tmpReal
Me.gSecondary = tmpImaginary
End With
MyBase.Multy(value)
End Sub
Public Overrides Sub Subtract(ByVal value As Object)
With CType(value, Complex1)
Me.gMaster -= .gMaster
Me.gSecondary -= .gSecondary
End With
MyBase.Subtract(value)
End Sub
#End Region
#Region "擴展部分"
Public Function ToComplex2() As Complex2
Dim mModulus As Double = Math.Sqrt(Me.Real * Me.Real + Me.Imaginary * Me.Imaginary)
Dim mArgument As Double = Math.Atan2(Me.Imaginary, Me.Real)
Return New Complex2(mModulus, mArgument)
End Function
#End Region
End Class
End Class
End Namespace
07、文件Complex.Complex2.vb,實現複數的模輻表示
Namespace LzmTW.uMath
Partial Class Complex
Private Class Complex2
Inherits ComplexBase
Public ReadOnly Property Modulus() As Double '模
Get
Return Me.gMaster
End Get
End Property
Public ReadOnly Property Argument() As Double '輻角
Get
Return Me.gSecondary
End Get
End Property
Public ReadOnly Property Arg() As Double '輻角主值
Get
Return gArg
End Get
End Property
Sub New()
MyBase.new()
End Sub
Sub New(ByVal modulus As Double, ByVal argument As Double)
MyBase.New(modulus, argument)
End Sub
Sub New(ByVal modulus As Double, ByVal argument As Double, ByVal unitType As AngleUnitType)
MyBase.New(modulus, Complex.radian(argument, unitType))
End Sub
Private Sub UpdateArg()
gArg = Complex.GetArgZ(Me.gSecondary)
End Sub
#Region "重載部分"
Protected Overrides Function InternalCheckIsZeroVector() As Boolean
Return Complex.IsEqualsAbsoluteZero(gMaster)
End Function
Protected Overrides Sub internalDoBeforeLoad(ByVal master As Double, ByVal secondary As Double)
If master < 0 Then
Throw New Exception("模無效,不能爲負")
End If
End Sub
Protected Overrides Sub internalDoAfterLoad()
Me.UpdateArg()
End Sub
Public Overrides Sub Add(ByVal value As Object)
Dim mComplex1 As Complex1 = Me.ToComplex1
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1
mComplex1.Add(mComplex11)
With mComplex1.ToComplex2
Me.InternalLoadData(.Modulus, .Argument)
End With
End Sub
Public Overrides Sub Divide(ByVal value As Object)
With CType(value, Complex2)
Dim mModulus As Double = Me.Modulus / .Modulus
Dim mArgument As Double = Me.Argument - .Argument
Me.InternalLoadData(mModulus, mArgument)
End With
End Sub
Public Overrides Sub Multy(ByVal value As Object)
With CType(value, Complex2)
Dim mModulus As Double = Me.Modulus * .Modulus
Dim mArgument As Double = Me.Argument + .Argument
Me.InternalLoadData(mModulus, mArgument)
End With
End Sub
Public Overrides Sub Subtract(ByVal value As Object)
Dim mComplex1 As Complex1 = Me.ToComplex1
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1
mComplex1.Subtract(mComplex11)
With mComplex1.ToComplex2
Me.InternalLoadData(.Modulus, .Argument)
End With
End Sub
#End Region
#Region "擴展部分"
Public Function ToComplex1() As Complex1
Dim mReal As Double = Me.Modulus * cos(Me.Argument)
Dim mImaginary As Double = Me.Modulus * sin(Me.Argument)
Return New Complex1(mReal, mImaginary)
End Function
Public Sub Pow(ByVal n As Integer)
Dim mModulus As Double = Math.Pow(Me.Modulus, n)
Dim mArgument As Double = Me.Argument * n
Me.InternalLoadData(mModulus, mArgument)
End Sub
Public Function antPow(ByVal n As Integer) As Complex2()
Dim mModulus As Double = Math.Pow(Me.Modulus, 1 / n)
Dim mArray(n - 1) As Complex2
For i As Integer = 0 To n - 1
mArray(i) = New Complex2(mModulus, (Me.Arg + i * Complex.d_2PI) / n)
Next
Return mArray
End Function
Public Sub Reverse(ByVal radian As Double)
Me.gSecondary += radian
Me.UpdateArg()
End Sub
#End Region
Public ReadOnly Property IsZeroVector() As Boolean
Get
Return Me.gIsZeroVector
End Get
End Property
End Class
End Class
End Namespace
Partial Class Complex
Private Class Complex2
Inherits ComplexBase
Public ReadOnly Property Modulus() As Double '模
Get
Return Me.gMaster
End Get
End Property
Public ReadOnly Property Argument() As Double '輻角
Get
Return Me.gSecondary
End Get
End Property
Public ReadOnly Property Arg() As Double '輻角主值
Get
Return gArg
End Get
End Property
Sub New()
MyBase.new()
End Sub
Sub New(ByVal modulus As Double, ByVal argument As Double)
MyBase.New(modulus, argument)
End Sub
Sub New(ByVal modulus As Double, ByVal argument As Double, ByVal unitType As AngleUnitType)
MyBase.New(modulus, Complex.radian(argument, unitType))
End Sub
Private Sub UpdateArg()
gArg = Complex.GetArgZ(Me.gSecondary)
End Sub
#Region "重載部分"
Protected Overrides Function InternalCheckIsZeroVector() As Boolean
Return Complex.IsEqualsAbsoluteZero(gMaster)
End Function
Protected Overrides Sub internalDoBeforeLoad(ByVal master As Double, ByVal secondary As Double)
If master < 0 Then
Throw New Exception("模無效,不能爲負")
End If
End Sub
Protected Overrides Sub internalDoAfterLoad()
Me.UpdateArg()
End Sub
Public Overrides Sub Add(ByVal value As Object)
Dim mComplex1 As Complex1 = Me.ToComplex1
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1
mComplex1.Add(mComplex11)
With mComplex1.ToComplex2
Me.InternalLoadData(.Modulus, .Argument)
End With
End Sub
Public Overrides Sub Divide(ByVal value As Object)
With CType(value, Complex2)
Dim mModulus As Double = Me.Modulus / .Modulus
Dim mArgument As Double = Me.Argument - .Argument
Me.InternalLoadData(mModulus, mArgument)
End With
End Sub
Public Overrides Sub Multy(ByVal value As Object)
With CType(value, Complex2)
Dim mModulus As Double = Me.Modulus * .Modulus
Dim mArgument As Double = Me.Argument + .Argument
Me.InternalLoadData(mModulus, mArgument)
End With
End Sub
Public Overrides Sub Subtract(ByVal value As Object)
Dim mComplex1 As Complex1 = Me.ToComplex1
Dim mComplex11 As Complex1 = CType(value, Complex2).ToComplex1
mComplex1.Subtract(mComplex11)
With mComplex1.ToComplex2
Me.InternalLoadData(.Modulus, .Argument)
End With
End Sub
#End Region
#Region "擴展部分"
Public Function ToComplex1() As Complex1
Dim mReal As Double = Me.Modulus * cos(Me.Argument)
Dim mImaginary As Double = Me.Modulus * sin(Me.Argument)
Return New Complex1(mReal, mImaginary)
End Function
Public Sub Pow(ByVal n As Integer)
Dim mModulus As Double = Math.Pow(Me.Modulus, n)
Dim mArgument As Double = Me.Argument * n
Me.InternalLoadData(mModulus, mArgument)
End Sub
Public Function antPow(ByVal n As Integer) As Complex2()
Dim mModulus As Double = Math.Pow(Me.Modulus, 1 / n)
Dim mArray(n - 1) As Complex2
For i As Integer = 0 To n - 1
mArray(i) = New Complex2(mModulus, (Me.Arg + i * Complex.d_2PI) / n)
Next
Return mArray
End Function
Public Sub Reverse(ByVal radian As Double)
Me.gSecondary += radian
Me.UpdateArg()
End Sub
#End Region
Public ReadOnly Property IsZeroVector() As Boolean
Get
Return Me.gIsZeroVector
End Get
End Property
End Class
End Class
End Namespace
08、文件Complex.vb,複數類的構造和基本屬性
Namespace LzmTW.uMath
Public Class Complex
Private gComplex1 As Complex1
Private gComplex2 As Complex2
''' <summary>
''' 實部
''' </summary>
Public ReadOnly Property Real() As Double
Get
Return Me.gComplex1.Real
End Get
End Property
''' <summary>
''' 虛部
''' </summary>
Public ReadOnly Property Imaginary() As Double
Get
Return Me.gComplex1.Imaginary
End Get
End Property
''' <summary>
''' 模
''' </summary>
Public ReadOnly Property Modulus() As Double
Get
Return Me.gComplex2.Modulus
End Get
End Property
''' <summary>
''' 輻角,弧度
''' </summary>
Public ReadOnly Property Argument() As Double
Get
Return Me.gComplex2.Argument
End Get
End Property
''' <summary>
''' 輻角主值,弧度
''' </summary>
Public ReadOnly Property Arg() As Double
Get
Return Me.gComplex2.Arg
End Get
End Property
''' <summary>
''' 輸出有效小數位數。置爲-1則不作處理
''' </summary>
Public WriteOnly Property RoundDigits() As Integer
Set(ByVal value As Integer)
Me.gComplex1.RoundDigits = value
Me.gComplex2.RoundDigits = value
End Set
End Property
''' <summary>
''' 輸出有效小數位數,全局性有效。置爲-1則無效,以RoundDigits爲準。
''' </summary>
Public Shared WriteOnly Property GlobalRoundDigits() As Integer
Set(ByVal value As Integer)
ComplexBase.GlobalRoundDigits = value
End Set
End Property
''' <summary>
''' 共軛複數
''' </summary>
Public ReadOnly Property Conjugate() As Complex
Get
Return New Complex(Me.Real, -Me.Imaginary)
End Get
End Property
''' <summary>
''' 倒數
''' </summary>
Public ReadOnly Property Reciprocal() As Complex
Get
Return 1 / Me
End Get
End Property
Sub New()
gComplex1 = New Complex1
Me.UpdateComplex2()
End Sub
Sub New(ByVal real As Double)
gComplex1 = New Complex1(real, 0)
Me.UpdateComplex2()
End Sub
Sub New(ByVal realOrModulus As Double, ByVal imaginaryOrArgument As Double, Optional ByVal byModulus As Boolean = False)
If byModulus Then
gComplex2 = New Complex2(realOrModulus, imaginaryOrArgument)
Me.UpdateComplex1()
Else
gComplex1 = New Complex1(realOrModulus, imaginaryOrArgument)
Me.UpdateComplex2()
End If
End Sub
Private Sub UpdateComplex2()
gComplex2 = gComplex1.ToComplex2
End Sub
Private Sub UpdateComplex1()
gComplex1 = gComplex2.ToComplex1
End Sub
Public Shared Function Create(ByVal value As Double) As Complex
Return New Complex(value)
End Function
Public Shared Function Create( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return New Complex(realOrModulus, imaginaryOrArgument, byModulus)
End Function
Public Shared Function CreateByModulus( _
ByVal modulus As Double, _
ByVal argument As Double, _
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
) As Complex
Return New Complex(modulus, radian(argument, unitType), True)
End Function
Public Function Clone() As Complex
Return New Complex(Me.Real, Me.Imaginary)
End Function
''' <summary>
''' 虛數單位,實部爲0,虛部爲1
''' </summary>
Public Shared ReadOnly Property iUnitComplex() As Complex
Get
Return New Complex(0, 1)
End Get
End Property
''' <summary>
''' 實虛部皆爲0
''' </summary>
Public Shared ReadOnly Property ZeroComplex() As Complex
Get
Return New Complex(0, 0)
End Get
End Property
''' <summary>
''' 實虛部皆爲1
''' </summary>
Public Shared ReadOnly Property OneComplex() As Complex
Get
Return New Complex(1, 1)
End Get
End Property
''' <summary>
''' 是否爲零向量
''' </summary>
''' <remarks>在引入向量概念時使用</remarks>
Friend ReadOnly Property InternalIsZeroVector() As Boolean
Get
Return gComplex2.IsZeroVector
End Get
End Property
End Class
End Namespace
Public Class Complex
Private gComplex1 As Complex1
Private gComplex2 As Complex2
''' <summary>
''' 實部
''' </summary>
Public ReadOnly Property Real() As Double
Get
Return Me.gComplex1.Real
End Get
End Property
''' <summary>
''' 虛部
''' </summary>
Public ReadOnly Property Imaginary() As Double
Get
Return Me.gComplex1.Imaginary
End Get
End Property
''' <summary>
''' 模
''' </summary>
Public ReadOnly Property Modulus() As Double
Get
Return Me.gComplex2.Modulus
End Get
End Property
''' <summary>
''' 輻角,弧度
''' </summary>
Public ReadOnly Property Argument() As Double
Get
Return Me.gComplex2.Argument
End Get
End Property
''' <summary>
''' 輻角主值,弧度
''' </summary>
Public ReadOnly Property Arg() As Double
Get
Return Me.gComplex2.Arg
End Get
End Property
''' <summary>
''' 輸出有效小數位數。置爲-1則不作處理
''' </summary>
Public WriteOnly Property RoundDigits() As Integer
Set(ByVal value As Integer)
Me.gComplex1.RoundDigits = value
Me.gComplex2.RoundDigits = value
End Set
End Property
''' <summary>
''' 輸出有效小數位數,全局性有效。置爲-1則無效,以RoundDigits爲準。
''' </summary>
Public Shared WriteOnly Property GlobalRoundDigits() As Integer
Set(ByVal value As Integer)
ComplexBase.GlobalRoundDigits = value
End Set
End Property
''' <summary>
''' 共軛複數
''' </summary>
Public ReadOnly Property Conjugate() As Complex
Get
Return New Complex(Me.Real, -Me.Imaginary)
End Get
End Property
''' <summary>
''' 倒數
''' </summary>
Public ReadOnly Property Reciprocal() As Complex
Get
Return 1 / Me
End Get
End Property
Sub New()
gComplex1 = New Complex1
Me.UpdateComplex2()
End Sub
Sub New(ByVal real As Double)
gComplex1 = New Complex1(real, 0)
Me.UpdateComplex2()
End Sub
Sub New(ByVal realOrModulus As Double, ByVal imaginaryOrArgument As Double, Optional ByVal byModulus As Boolean = False)
If byModulus Then
gComplex2 = New Complex2(realOrModulus, imaginaryOrArgument)
Me.UpdateComplex1()
Else
gComplex1 = New Complex1(realOrModulus, imaginaryOrArgument)
Me.UpdateComplex2()
End If
End Sub
Private Sub UpdateComplex2()
gComplex2 = gComplex1.ToComplex2
End Sub
Private Sub UpdateComplex1()
gComplex1 = gComplex2.ToComplex1
End Sub
Public Shared Function Create(ByVal value As Double) As Complex
Return New Complex(value)
End Function
Public Shared Function Create( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return New Complex(realOrModulus, imaginaryOrArgument, byModulus)
End Function
Public Shared Function CreateByModulus( _
ByVal modulus As Double, _
ByVal argument As Double, _
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
) As Complex
Return New Complex(modulus, radian(argument, unitType), True)
End Function
Public Function Clone() As Complex
Return New Complex(Me.Real, Me.Imaginary)
End Function
''' <summary>
''' 虛數單位,實部爲0,虛部爲1
''' </summary>
Public Shared ReadOnly Property iUnitComplex() As Complex
Get
Return New Complex(0, 1)
End Get
End Property
''' <summary>
''' 實虛部皆爲0
''' </summary>
Public Shared ReadOnly Property ZeroComplex() As Complex
Get
Return New Complex(0, 0)
End Get
End Property
''' <summary>
''' 實虛部皆爲1
''' </summary>
Public Shared ReadOnly Property OneComplex() As Complex
Get
Return New Complex(1, 1)
End Get
End Property
''' <summary>
''' 是否爲零向量
''' </summary>
''' <remarks>在引入向量概念時使用</remarks>
Friend ReadOnly Property InternalIsZeroVector() As Boolean
Get
Return gComplex2.IsZeroVector
End Get
End Property
End Class
End Namespace
09、文件Complex.Operate.vb,複數類的運算操作
Namespace LzmTW.uMath
Partial Class Complex
#Region "加法"
Public Function Add(ByVal other As Complex) As Complex
Me.gComplex1.Add(other.gComplex1)
Me.UpdateComplex2()
Return Me
End Function
Public Function Add(ByVal value As Double) As Complex
Return Me.Add(Create(value))
End Function
Public Function Add( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return Me.Add(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Add(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Add(z2)
Return z3
End Function
Public Shared Operator +(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Add(z1, z2)
End Operator
#End Region
#Region "減法"
Public Function Subtract(ByVal other As Complex) As Complex
Me.gComplex1.Subtract(other.gComplex1)
Me.UpdateComplex2()
Return Me
End Function
Public Function Subtract(ByVal value As Double) As Complex
Return Me.Subtract(Create(value))
End Function
Public Function Subtract( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return Me.Subtract(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Subtract(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Subtract(z2)
Return z3
End Function
Public Shared Operator -(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Subtract(z1, z2)
End Operator
#End Region
#Region "剩法"
Public Function Multy(ByVal other As Complex, Optional ByVal byModulus As Boolean = True) As Complex
If byModulus Then
Me.gComplex2.Multy(other.gComplex2)
Me.UpdateComplex1()
Else
Me.gComplex1.Multy(other.gComplex1)
Me.UpdateComplex2()
End If
Return Me
End Function
Public Function Multy(ByVal value As Double) As Complex
Return Me.Multy(Create(value))
End Function
Public Function Multy( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = True _
) As Complex
Return Me.Multy(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Multy(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Multy(z2)
Return z3
End Function
Public Shared Operator *(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Multy(z1, z2)
End Operator
#End Region
#Region "除法"
Public Function Divide(ByVal other As Complex, Optional ByVal byModulus As Boolean = True) As Complex
If byModulus Then
Me.gComplex2.Divide(other.gComplex2)
Me.UpdateComplex1()
Else
Me.gComplex1.Divide(other.gComplex1)
Me.UpdateComplex2()
End If
Return Me
End Function
Public Function Divide(ByVal value As Double) As Complex
Return Me.Divide(Create(value))
End Function
Public Function Divide( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = True _
) As Complex
Return Me.Divide(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Divide(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Divide(z2)
Return z3
End Function
Public Shared Operator /(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Divide(z1, z2)
End Operator
#End Region
#Region "n次冪"
Public Function Pow(ByVal n As Integer) As Complex
Me.gComplex2.Pow(n)
Me.UpdateComplex1()
Return Me
End Function
Public Shared Function Pow(ByVal z As Complex, ByVal n As Integer) As Complex
Dim z3 As Complex = z.Clone
z3.Pow(n)
Return z3
End Function
Public Function Pow2() As Complex
Me.Pow(2)
Return Me
End Function
#End Region
#Region "實數二次開方"
Public Shared Function Sqrt(ByVal value As Double) As Complex()
If value < 0 Then
Dim mImaginary As Double = Math.Sqrt(-value)
Return New Complex() {New Complex(0, mImaginary), New Complex(0, -mImaginary)}
Else
Return New Complex() {New Complex(Math.Sqrt(value), 0)}
End If
End Function
#End Region
#Region "n次開方"
Public Function antPow(ByVal n As Integer) As Complex()
Dim tmpArray() As Complex2 = Me.gComplex2.antPow(n)
Dim mArray(n - 1) As Complex
For i As Integer = 0 To n - 1
With tmpArray(i)
mArray(i) = New Complex(.Modulus, .Argument, True)
End With
Next
Return mArray
End Function
Public Shared Function antPow(ByVal z As Complex, ByVal n As Integer) As Complex()
Dim z3 As Complex = z.Clone
Return z3.antPow(n)
End Function
#End Region
#Region "兩複數是否相等"
Public Shared Operator <>(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean
If Complex.IsEqualsAbsoluteZero(z1.Real - z2.Real) Then
Return Not Complex.IsEqualsAbsoluteZero(z1.Imaginary - z2.Imaginary)
End If
Return True
End Operator
Public Shared Operator =(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean
Return Not (z1 <> z2)
End Operator
#End Region
''' <summary>
''' 逆旋
''' </summary>
Public Function Reverse(ByVal value As Double, Optional ByVal unitType As AngleUnitType = AngleUnitType.Default) As Complex
Me.gComplex2.Reverse(Complex.radian(value, unitType))
Me.UpdateComplex1()
Return Me
End Function
Public Shared Function Reverse( _
ByVal z As Complex, _
ByVal value As Double, _
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
) As Complex
Return z.Clone.Reverse(value, unitType)
End Function
'反轉,即逆轉180°
Public Function Rollback() As Complex
Me.Reverse(Complex.d_PI)
Return Me
End Function
'-z,表示z反轉後的新實例
Public Shared Operator -(ByVal z As Complex) As Complex
Return z.Clone.Rollback
End Operator
End Class
End Namespace
Partial Class Complex
#Region "加法"
Public Function Add(ByVal other As Complex) As Complex
Me.gComplex1.Add(other.gComplex1)
Me.UpdateComplex2()
Return Me
End Function
Public Function Add(ByVal value As Double) As Complex
Return Me.Add(Create(value))
End Function
Public Function Add( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return Me.Add(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Add(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Add(z2)
Return z3
End Function
Public Shared Operator +(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Add(z1, z2)
End Operator
#End Region
#Region "減法"
Public Function Subtract(ByVal other As Complex) As Complex
Me.gComplex1.Subtract(other.gComplex1)
Me.UpdateComplex2()
Return Me
End Function
Public Function Subtract(ByVal value As Double) As Complex
Return Me.Subtract(Create(value))
End Function
Public Function Subtract( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = False _
) As Complex
Return Me.Subtract(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Subtract(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Subtract(z2)
Return z3
End Function
Public Shared Operator -(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Subtract(z1, z2)
End Operator
#End Region
#Region "剩法"
Public Function Multy(ByVal other As Complex, Optional ByVal byModulus As Boolean = True) As Complex
If byModulus Then
Me.gComplex2.Multy(other.gComplex2)
Me.UpdateComplex1()
Else
Me.gComplex1.Multy(other.gComplex1)
Me.UpdateComplex2()
End If
Return Me
End Function
Public Function Multy(ByVal value As Double) As Complex
Return Me.Multy(Create(value))
End Function
Public Function Multy( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = True _
) As Complex
Return Me.Multy(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Multy(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Multy(z2)
Return z3
End Function
Public Shared Operator *(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Multy(z1, z2)
End Operator
#End Region
#Region "除法"
Public Function Divide(ByVal other As Complex, Optional ByVal byModulus As Boolean = True) As Complex
If byModulus Then
Me.gComplex2.Divide(other.gComplex2)
Me.UpdateComplex1()
Else
Me.gComplex1.Divide(other.gComplex1)
Me.UpdateComplex2()
End If
Return Me
End Function
Public Function Divide(ByVal value As Double) As Complex
Return Me.Divide(Create(value))
End Function
Public Function Divide( _
ByVal realOrModulus As Double, _
ByVal imaginaryOrArgument As Double, _
Optional ByVal byModulus As Boolean = True _
) As Complex
Return Me.Divide(Create(realOrModulus, imaginaryOrArgument, byModulus))
End Function
Public Shared Function Divide(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Dim z3 As Complex = z1.Clone
z3.Divide(z2)
Return z3
End Function
Public Shared Operator /(ByVal z1 As Complex, ByVal z2 As Complex) As Complex
Return Divide(z1, z2)
End Operator
#End Region
#Region "n次冪"
Public Function Pow(ByVal n As Integer) As Complex
Me.gComplex2.Pow(n)
Me.UpdateComplex1()
Return Me
End Function
Public Shared Function Pow(ByVal z As Complex, ByVal n As Integer) As Complex
Dim z3 As Complex = z.Clone
z3.Pow(n)
Return z3
End Function
Public Function Pow2() As Complex
Me.Pow(2)
Return Me
End Function
#End Region
#Region "實數二次開方"
Public Shared Function Sqrt(ByVal value As Double) As Complex()
If value < 0 Then
Dim mImaginary As Double = Math.Sqrt(-value)
Return New Complex() {New Complex(0, mImaginary), New Complex(0, -mImaginary)}
Else
Return New Complex() {New Complex(Math.Sqrt(value), 0)}
End If
End Function
#End Region
#Region "n次開方"
Public Function antPow(ByVal n As Integer) As Complex()
Dim tmpArray() As Complex2 = Me.gComplex2.antPow(n)
Dim mArray(n - 1) As Complex
For i As Integer = 0 To n - 1
With tmpArray(i)
mArray(i) = New Complex(.Modulus, .Argument, True)
End With
Next
Return mArray
End Function
Public Shared Function antPow(ByVal z As Complex, ByVal n As Integer) As Complex()
Dim z3 As Complex = z.Clone
Return z3.antPow(n)
End Function
#End Region
#Region "兩複數是否相等"
Public Shared Operator <>(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean
If Complex.IsEqualsAbsoluteZero(z1.Real - z2.Real) Then
Return Not Complex.IsEqualsAbsoluteZero(z1.Imaginary - z2.Imaginary)
End If
Return True
End Operator
Public Shared Operator =(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean
Return Not (z1 <> z2)
End Operator
#End Region
''' <summary>
''' 逆旋
''' </summary>
Public Function Reverse(ByVal value As Double, Optional ByVal unitType As AngleUnitType = AngleUnitType.Default) As Complex
Me.gComplex2.Reverse(Complex.radian(value, unitType))
Me.UpdateComplex1()
Return Me
End Function
Public Shared Function Reverse( _
ByVal z As Complex, _
ByVal value As Double, _
Optional ByVal unitType As AngleUnitType = AngleUnitType.Default _
) As Complex
Return z.Clone.Reverse(value, unitType)
End Function
'反轉,即逆轉180°
Public Function Rollback() As Complex
Me.Reverse(Complex.d_PI)
Return Me
End Function
'-z,表示z反轉後的新實例
Public Shared Operator -(ByVal z As Complex) As Complex
Return z.Clone.Rollback
End Operator
End Class
End Namespace
10、文件Complex.Methods.vb,複數類的輔助方法
Namespace LzmTW.uMath
'通用函數
Partial Class Complex
Public Shared Function radian(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return AngleConvertToDefault(value, fromUnit)
End Function
Public Shared Function cos(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return Math.Cos(radian(value, fromUnit))
End Function
Public Shared Function sin(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return Math.Sin(radian(value, fromUnit))
End Function
Public Shared Function DivRem(ByVal a As Double, ByVal b As Double) As Double
Dim mNum As Double = Math.Floor(a / b)
Return a - b * mNum
'Return Math.IEEERemainder(a, b)
End Function
'取輻角主值,在[0,2pi)
Public Shared Function GetArgZ(ByVal argument As Double) As Double
Return Complex.DivRem(argument, Complex.d_2PI)
End Function
#Region "角度轉換"
Public Shared Function AngleConvertToDefault(ByVal value As Double, ByVal fromUnit As AngleUnitType) As Double
Return AngleConvert(value, fromUnit, AngleUnitType.Default)
End Function
Public Shared Function AngleConvertFromDefault(ByVal value As Double, ByVal toUnit As AngleUnitType) As Double
Return AngleConvert(value, AngleUnitType.Default, toUnit)
End Function
Public Shared Function Round(ByVal value As Double, ByVal digits As Integer) As Double
If Complex.IsEqualsAbsoluteZero(value) Then Return 0
If Math.Sign(digits) = -1 Then Return value
If digits > 15 Then digits = 15
Return Math.Round(value, digits)
End Function
Public Shared Function AngleConvertStringFromDefault( _
ByVal value As Double, _
ByVal toUnit As AngleUnitType, _
Optional ByVal roundDigits As Integer = -1 _
) As String
Dim mValue As Double = Round(AngleConvertFromDefault(value, toUnit), roundDigits)
Select Case toUnit
Case AngleUnitType.Degree
Return mValue.ToString & c_Degree
Case AngleUnitType.PI
Return mValue.ToString & c_PI
Case AngleUnitType.Default
Return mValue.ToString
End Select
Return "toUnit is invliad."
End Function
Public Shared Function AngleConvert( _
ByVal value As Double, _
ByVal fromUnit As AngleUnitType, _
ByVal toUnit As AngleUnitType _
) As Double
Return ((value * UnitsPerRadian(toUnit)) / UnitsPerRadian(fromUnit))
End Function
''' <summary>
''' 單位轉換
''' </summary>
Private Shared Function UnitsPerRadian(ByVal unit As AngleUnitType) As Double
Select Case unit
Case AngleUnitType.Default
Return 1
Case AngleUnitType.PI
Return 1 / Complex.d_PI
Case AngleUnitType.Degree
Return 1 / Complex.d_Degree
End Select
Return Double.NaN
End Function
#End Region
End Class
End Namespace
'通用函數
Partial Class Complex
Public Shared Function radian(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return AngleConvertToDefault(value, fromUnit)
End Function
Public Shared Function cos(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return Math.Cos(radian(value, fromUnit))
End Function
Public Shared Function sin(ByVal value As Double, Optional ByVal fromUnit As AngleUnitType = AngleUnitType.Default) As Double
Return Math.Sin(radian(value, fromUnit))
End Function
Public Shared Function DivRem(ByVal a As Double, ByVal b As Double) As Double
Dim mNum As Double = Math.Floor(a / b)
Return a - b * mNum
'Return Math.IEEERemainder(a, b)
End Function
'取輻角主值,在[0,2pi)
Public Shared Function GetArgZ(ByVal argument As Double) As Double
Return Complex.DivRem(argument, Complex.d_2PI)
End Function
#Region "角度轉換"
Public Shared Function AngleConvertToDefault(ByVal value As Double, ByVal fromUnit As AngleUnitType) As Double
Return AngleConvert(value, fromUnit, AngleUnitType.Default)
End Function
Public Shared Function AngleConvertFromDefault(ByVal value As Double, ByVal toUnit As AngleUnitType) As Double
Return AngleConvert(value, AngleUnitType.Default, toUnit)
End Function
Public Shared Function Round(ByVal value As Double, ByVal digits As Integer) As Double
If Complex.IsEqualsAbsoluteZero(value) Then Return 0
If Math.Sign(digits) = -1 Then Return value
If digits > 15 Then digits = 15
Return Math.Round(value, digits)
End Function
Public Shared Function AngleConvertStringFromDefault( _
ByVal value As Double, _
ByVal toUnit As AngleUnitType, _
Optional ByVal roundDigits As Integer = -1 _
) As String
Dim mValue As Double = Round(AngleConvertFromDefault(value, toUnit), roundDigits)
Select Case toUnit
Case AngleUnitType.Degree
Return mValue.ToString & c_Degree
Case AngleUnitType.PI
Return mValue.ToString & c_PI
Case AngleUnitType.Default
Return mValue.ToString
End Select
Return "toUnit is invliad."
End Function
Public Shared Function AngleConvert( _
ByVal value As Double, _
ByVal fromUnit As AngleUnitType, _
ByVal toUnit As AngleUnitType _
) As Double
Return ((value * UnitsPerRadian(toUnit)) / UnitsPerRadian(fromUnit))
End Function
''' <summary>
''' 單位轉換
''' </summary>
Private Shared Function UnitsPerRadian(ByVal unit As AngleUnitType) As Double
Select Case unit
Case AngleUnitType.Default
Return 1
Case AngleUnitType.PI
Return 1 / Complex.d_PI
Case AngleUnitType.Degree
Return 1 / Complex.d_Degree
End Select
Return Double.NaN
End Function
#End Region
End Class
End Namespace
11、文件Complex.ToString.vb,複數類的輸出類型
Namespace LzmTW.uMath
Partial Class Complex
Public Overrides Function ToString() As String
Return ToString(FormatType.Normal)
End Function
Public Overloads Function ToString(ByVal format As FormatType) As String
Select Case format
Case FormatType.Normal
Return Me.gComplex1.ToString(FormatType.Normal)
Case FormatType.CoordinateNormal
Return Me.gComplex1.ToString(FormatType.CoordinateNormal)
Case FormatType.CoordinateDefault
Return Me.gComplex2.ToString(FormatType.CoordinateDefault)
Case FormatType.CoordinatePI
Return Me.gComplex2.ToString(FormatType.CoordinatePI)
Case FormatType.CoordinateDegree
Return Me.gComplex2.ToString(FormatType.CoordinateDegree)
Case FormatType.TriangleDefault
Return Me.gComplex2.ToString(FormatType.TriangleDefault)
Case FormatType.TrianglePI
Return Me.gComplex2.ToString(FormatType.TrianglePI)
Case FormatType.TriangleDegree
Return Me.gComplex2.ToString(FormatType.TriangleDegree)
Case FormatType.ExponentDefault
Return Me.gComplex2.ToString(FormatType.ExponentDefault)
Case FormatType.ExponentPI
Return Me.gComplex2.ToString(FormatType.ExponentPI)
Case FormatType.ExponentDegree
Return Me.gComplex2.ToString(FormatType.ExponentDegree)
End Select
Return "format is invalid."
End Function
End Class
End Namespace
Partial Class Complex
Public Overrides Function ToString() As String
Return ToString(FormatType.Normal)
End Function
Public Overloads Function ToString(ByVal format As FormatType) As String
Select Case format
Case FormatType.Normal
Return Me.gComplex1.ToString(FormatType.Normal)
Case FormatType.CoordinateNormal
Return Me.gComplex1.ToString(FormatType.CoordinateNormal)
Case FormatType.CoordinateDefault
Return Me.gComplex2.ToString(FormatType.CoordinateDefault)
Case FormatType.CoordinatePI
Return Me.gComplex2.ToString(FormatType.CoordinatePI)
Case FormatType.CoordinateDegree
Return Me.gComplex2.ToString(FormatType.CoordinateDegree)
Case FormatType.TriangleDefault
Return Me.gComplex2.ToString(FormatType.TriangleDefault)
Case FormatType.TrianglePI
Return Me.gComplex2.ToString(FormatType.TrianglePI)
Case FormatType.TriangleDegree
Return Me.gComplex2.ToString(FormatType.TriangleDegree)
Case FormatType.ExponentDefault
Return Me.gComplex2.ToString(FormatType.ExponentDefault)
Case FormatType.ExponentPI
Return Me.gComplex2.ToString(FormatType.ExponentPI)
Case FormatType.ExponentDegree
Return Me.gComplex2.ToString(FormatType.ExponentDegree)
End Select
Return "format is invalid."
End Function
End Class
End Namespace
以下爲該複數類的應用示例:
Imports LzmTW.uMath
Imports LzmTW.uMath.Complex
Public Class Test
'sqrt(3)-i 的三次方等於 -8i
Public Sub Do1()
Dim z1 As New Complex(Math.Sqrt(3), +11)
Dim result As Complex
PrintOut(z1, 2)
result = Pow(z1, 3)
PrintOut(result, 2)
result = z1 * z1 * z1
PrintOut(result, 2)
PrintOut(z1, 2)
PrintOut(Complex.OneComplex, 2)
PrintOut(Complex.ZeroComplex, 2)
PrintOut(Complex.iUnitComplex, 2)
End Sub
'(1—2i)(3+4i)(11+2i)=125
Public Sub Do2()
Dim z1 As New Complex(1, -2)
Dim z2 As New Complex(3, 4)
Dim z3 As New Complex(11, 2)
Dim result As Complex = z1 * z2 * z3
PrintOut(result, 2)
result = z1.Clone
result.Multy(z2)
result.Multy(z3)
PrintOut(result, 2)
result = z1.Clone
result.Multy(z2, True)
result.Multy(z3, True)
PrintOut(result, 2)
End Sub
'(1+2i)÷(3—4i)=-0.2+0.4i
Public Sub Do3()
Dim z1 As New Complex(1, 2)
Dim z2 As New Complex(3, -4)
Dim result As Complex = z1 / z2
PrintOut(result, 2)
result = z1.Clone
result.Divide(z2)
PrintOut(result, 2)
result = z1.Clone
result.Divide(z2, True)
PrintOut(result, 2)
End Sub
Public Sub do4()
Dim z1 As New Complex(3, 4)
Dim z2 As Complex = z1.Conjugate
Dim result As Complex = z1 * z2
Console.WriteLine(result)
End Sub
Public Sub Do5()
Dim z1 As New Complex(3, 4, True)
Dim result As Complex = z1.Clone
For i As Integer = 0 To 98
result.Multy(z1)
Next
PrintOut(result, 2)
result = z1.Clone
For i As Integer = 0 To 98
result.Multy(z1, True)
Next
PrintOut(result, 2)
result = z1.Clone
result.Pow(100)
PrintOut(result, 2)
End Sub
Public Sub Do6()
Dim z1 As New Complex(3, 4, True)
Console.WriteLine(z1 = z1.Conjugate)
Console.WriteLine(z1 = z1.Conjugate.Conjugate)
End Sub
Public Sub Do7()
For Each z As Complex In Create(0, -8).antPow(3)
z.RoundDigits = 2
Console.WriteLine(z.ToString(FormatType.ExponentPI))
Next
End Sub
'z1=1+i,求z=(z1平方-3z1+6)/(1+z1)的輻角主值.結果爲z=1-i
Public Sub Do8()
Dim z1 As New Complex(1, 1)
Dim result As Complex
result = (z1 * z1 - 3 * z1 + 6) / (1 + z1)
result.RoundDigits = 2
Console.WriteLine(result)
End Sub
'已知複數z=cos20°+ ising20°,求|z-z2+z3-z4+z5-z6+z7-z8+z9-z10|.
'式中zn表示z的n次方,如z8表示z的8次方。
'答案爲1。
Public Sub Do9()
Dim z As Complex
z = CreateByModulus(1, 20, AngleUnitType.Degree)
Dim result As Complex
'方法一。用指數運算
result = z - Pow(z, 2) _
+ Pow(z, 3) - Pow(z, 4) _
+ Pow(z, 5) - Pow(z, 6) _
+ Pow(z, 7) - Pow(z, 8) _
+ Pow(z, 9) - Pow(z, 10)
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.TriangleDefault))
Console.WriteLine(result.ToString(FormatType.TriangleDegree))
Console.WriteLine(result.ToString(FormatType.TrianglePI))
Console.WriteLine(result.Modulus)
'方法二。標準運算
Dim tmp As Complex
tmp = z.Clone
tmp.Multy(z) '2
result = z - tmp
tmp.Multy(z) '3
result += tmp
tmp.Multy(z) '4
result -= tmp
tmp.Multy(z) '5
result += tmp
tmp.Multy(z) '6
result -= tmp
tmp.Multy(z) '7
result += tmp
tmp.Multy(z) '8
result -= tmp
tmp.Multy(z) '9
result += tmp
tmp.Multy(z) '10
result -= tmp
Console.WriteLine()
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.TriangleDefault))
Console.WriteLine(result.ToString(FormatType.TriangleDegree))
Console.WriteLine(result.ToString(FormatType.TrianglePI))
Console.WriteLine(result.Modulus)
End Sub
'已知z=cos(pi/3) + isin(pi/3)
'求|z + 2Z2 + 3Z3 + ... + 12Z12|
'式中zn表示z的n次方,如3z3表示z的3次方再乘3。
'答案爲12
Public Sub Do10()
Dim z As Complex
z = CreateByModulus(1, 1 / 3, AngleUnitType.PI)
Dim result As Complex = ZeroComplex
'方法一。指數運算
For i As Integer = 1 To 12
result += i * Pow(z, i)
Next
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.ExponentDefault))
Console.WriteLine(result.ToString(FormatType.ExponentPI))
Console.WriteLine(result.ToString(FormatType.ExponentDegree))
Console.WriteLine(result.Modulus)
'方法二。標準運算
result = z.Clone
Dim tmp As Complex = z.Clone
For i As Integer = 2 To 12
tmp.Multy(z)
result.Add(i * tmp)
Next
Console.WriteLine()
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.ExponentDefault))
Console.WriteLine(result.ToString(FormatType.ExponentPI))
Console.WriteLine(result.ToString(FormatType.ExponentDegree))
Console.WriteLine(result.Modulus)
End Sub
'已知(1 + i) z4 = i
'求z
'式中z4表示z的4次方。
'答案爲
'z1=A(cos(1/16pi) + i sin(1/16pi))
'z2=A(cos(9/16pi) + i sin(9/16pi))
'z3=A(cos(17/16pi) + i sin(17/16pi))
'z4=A(cos(25/16pi) + i sin(25/16pi))
'其中A爲2的8次開方分之一
Public Sub Do11()
Dim m1 As Double = 1 / Math.Pow(2, 1 / 8)
Console.WriteLine(CreateByModulus(m1, 1 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 9 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 17 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 25 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Dim z As New Complex(1, 1)
Dim result As Complex() = antPow(iUnitComplex / z, 4)
Console.WriteLine()
For Each c As Complex In result
Console.WriteLine(c.ToString(FormatType.TrianglePI))
Next
End Sub
'已知z=1+i
'求(z2-3z+6)/(z+1)的輻角主值
'答案爲得7/4pi
Public Sub Do12()
Console.WriteLine(7 / 4)
Console.WriteLine()
Dim z As Complex = OneComplex
Dim result As Complex
result = (z * z - 3 * z + 6) / (1 + z)
Console.WriteLine(result.ToString(FormatType.ExponentPI))
End Sub
'化複數 -1/2(sin(1/3pi)+icos(1/3pi))爲代數形式和三解形式
'答案爲-3的開方/4-1/4i;1/2(cos(7/6pi)+isin(7/6pi))
Public Sub Do13()
Dim tmp As New Complex(1 / 2, 7 / 6 * d_PI, True)
Console.WriteLine(tmp.ToString)
Console.WriteLine(tmp.ToString(FormatType.TrianglePI))
Console.WriteLine()
Dim a As Double = -1 / 2 * sin(1 / 3, AngleUnitType.PI)
Dim b As Double = -1 / 2 * cos(1 / 3, AngleUnitType.PI)
Dim z As New Complex(a, b)
Console.WriteLine(z.ToString)
Console.WriteLine(z.ToString(FormatType.TrianglePI))
End Sub
Public Sub PrintOut(ByVal z As Complex, ByVal digits As Integer)
Console.WriteLine()
z.RoundDigits = digits
Console.WriteLine(z.ToString(FormatType.Normal))
Console.WriteLine(z.ToString(FormatType.CoordinateNormal))
Console.WriteLine(z.ToString(FormatType.CoordinateDefault))
Console.WriteLine(z.ToString(FormatType.CoordinatePI))
Console.WriteLine(z.ToString(FormatType.CoordinateDegree))
Console.WriteLine(z.ToString(FormatType.TriangleDefault))
Console.WriteLine(z.ToString(FormatType.TrianglePI))
Console.WriteLine(z.ToString(FormatType.TriangleDegree))
Console.WriteLine(z.ToString(FormatType.ExponentDefault))
Console.WriteLine(z.ToString(FormatType.ExponentPI))
Console.WriteLine(z.ToString(FormatType.ExponentDegree))
End Sub
End Class
Imports LzmTW.uMath.Complex
Public Class Test
'sqrt(3)-i 的三次方等於 -8i
Public Sub Do1()
Dim z1 As New Complex(Math.Sqrt(3), +11)
Dim result As Complex
PrintOut(z1, 2)
result = Pow(z1, 3)
PrintOut(result, 2)
result = z1 * z1 * z1
PrintOut(result, 2)
PrintOut(z1, 2)
PrintOut(Complex.OneComplex, 2)
PrintOut(Complex.ZeroComplex, 2)
PrintOut(Complex.iUnitComplex, 2)
End Sub
'(1—2i)(3+4i)(11+2i)=125
Public Sub Do2()
Dim z1 As New Complex(1, -2)
Dim z2 As New Complex(3, 4)
Dim z3 As New Complex(11, 2)
Dim result As Complex = z1 * z2 * z3
PrintOut(result, 2)
result = z1.Clone
result.Multy(z2)
result.Multy(z3)
PrintOut(result, 2)
result = z1.Clone
result.Multy(z2, True)
result.Multy(z3, True)
PrintOut(result, 2)
End Sub
'(1+2i)÷(3—4i)=-0.2+0.4i
Public Sub Do3()
Dim z1 As New Complex(1, 2)
Dim z2 As New Complex(3, -4)
Dim result As Complex = z1 / z2
PrintOut(result, 2)
result = z1.Clone
result.Divide(z2)
PrintOut(result, 2)
result = z1.Clone
result.Divide(z2, True)
PrintOut(result, 2)
End Sub
Public Sub do4()
Dim z1 As New Complex(3, 4)
Dim z2 As Complex = z1.Conjugate
Dim result As Complex = z1 * z2
Console.WriteLine(result)
End Sub
Public Sub Do5()
Dim z1 As New Complex(3, 4, True)
Dim result As Complex = z1.Clone
For i As Integer = 0 To 98
result.Multy(z1)
Next
PrintOut(result, 2)
result = z1.Clone
For i As Integer = 0 To 98
result.Multy(z1, True)
Next
PrintOut(result, 2)
result = z1.Clone
result.Pow(100)
PrintOut(result, 2)
End Sub
Public Sub Do6()
Dim z1 As New Complex(3, 4, True)
Console.WriteLine(z1 = z1.Conjugate)
Console.WriteLine(z1 = z1.Conjugate.Conjugate)
End Sub
Public Sub Do7()
For Each z As Complex In Create(0, -8).antPow(3)
z.RoundDigits = 2
Console.WriteLine(z.ToString(FormatType.ExponentPI))
Next
End Sub
'z1=1+i,求z=(z1平方-3z1+6)/(1+z1)的輻角主值.結果爲z=1-i
Public Sub Do8()
Dim z1 As New Complex(1, 1)
Dim result As Complex
result = (z1 * z1 - 3 * z1 + 6) / (1 + z1)
result.RoundDigits = 2
Console.WriteLine(result)
End Sub
'已知複數z=cos20°+ ising20°,求|z-z2+z3-z4+z5-z6+z7-z8+z9-z10|.
'式中zn表示z的n次方,如z8表示z的8次方。
'答案爲1。
Public Sub Do9()
Dim z As Complex
z = CreateByModulus(1, 20, AngleUnitType.Degree)
Dim result As Complex
'方法一。用指數運算
result = z - Pow(z, 2) _
+ Pow(z, 3) - Pow(z, 4) _
+ Pow(z, 5) - Pow(z, 6) _
+ Pow(z, 7) - Pow(z, 8) _
+ Pow(z, 9) - Pow(z, 10)
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.TriangleDefault))
Console.WriteLine(result.ToString(FormatType.TriangleDegree))
Console.WriteLine(result.ToString(FormatType.TrianglePI))
Console.WriteLine(result.Modulus)
'方法二。標準運算
Dim tmp As Complex
tmp = z.Clone
tmp.Multy(z) '2
result = z - tmp
tmp.Multy(z) '3
result += tmp
tmp.Multy(z) '4
result -= tmp
tmp.Multy(z) '5
result += tmp
tmp.Multy(z) '6
result -= tmp
tmp.Multy(z) '7
result += tmp
tmp.Multy(z) '8
result -= tmp
tmp.Multy(z) '9
result += tmp
tmp.Multy(z) '10
result -= tmp
Console.WriteLine()
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.TriangleDefault))
Console.WriteLine(result.ToString(FormatType.TriangleDegree))
Console.WriteLine(result.ToString(FormatType.TrianglePI))
Console.WriteLine(result.Modulus)
End Sub
'已知z=cos(pi/3) + isin(pi/3)
'求|z + 2Z2 + 3Z3 + ... + 12Z12|
'式中zn表示z的n次方,如3z3表示z的3次方再乘3。
'答案爲12
Public Sub Do10()
Dim z As Complex
z = CreateByModulus(1, 1 / 3, AngleUnitType.PI)
Dim result As Complex = ZeroComplex
'方法一。指數運算
For i As Integer = 1 To 12
result += i * Pow(z, i)
Next
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.ExponentDefault))
Console.WriteLine(result.ToString(FormatType.ExponentPI))
Console.WriteLine(result.ToString(FormatType.ExponentDegree))
Console.WriteLine(result.Modulus)
'方法二。標準運算
result = z.Clone
Dim tmp As Complex = z.Clone
For i As Integer = 2 To 12
tmp.Multy(z)
result.Add(i * tmp)
Next
Console.WriteLine()
Console.WriteLine(result)
Console.WriteLine(result.ToString(FormatType.ExponentDefault))
Console.WriteLine(result.ToString(FormatType.ExponentPI))
Console.WriteLine(result.ToString(FormatType.ExponentDegree))
Console.WriteLine(result.Modulus)
End Sub
'已知(1 + i) z4 = i
'求z
'式中z4表示z的4次方。
'答案爲
'z1=A(cos(1/16pi) + i sin(1/16pi))
'z2=A(cos(9/16pi) + i sin(9/16pi))
'z3=A(cos(17/16pi) + i sin(17/16pi))
'z4=A(cos(25/16pi) + i sin(25/16pi))
'其中A爲2的8次開方分之一
Public Sub Do11()
Dim m1 As Double = 1 / Math.Pow(2, 1 / 8)
Console.WriteLine(CreateByModulus(m1, 1 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 9 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 17 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Console.WriteLine(CreateByModulus(m1, 25 / 16, AngleUnitType.PI).ToString(FormatType.TrianglePI))
Dim z As New Complex(1, 1)
Dim result As Complex() = antPow(iUnitComplex / z, 4)
Console.WriteLine()
For Each c As Complex In result
Console.WriteLine(c.ToString(FormatType.TrianglePI))
Next
End Sub
'已知z=1+i
'求(z2-3z+6)/(z+1)的輻角主值
'答案爲得7/4pi
Public Sub Do12()
Console.WriteLine(7 / 4)
Console.WriteLine()
Dim z As Complex = OneComplex
Dim result As Complex
result = (z * z - 3 * z + 6) / (1 + z)
Console.WriteLine(result.ToString(FormatType.ExponentPI))
End Sub
'化複數 -1/2(sin(1/3pi)+icos(1/3pi))爲代數形式和三解形式
'答案爲-3的開方/4-1/4i;1/2(cos(7/6pi)+isin(7/6pi))
Public Sub Do13()
Dim tmp As New Complex(1 / 2, 7 / 6 * d_PI, True)
Console.WriteLine(tmp.ToString)
Console.WriteLine(tmp.ToString(FormatType.TrianglePI))
Console.WriteLine()
Dim a As Double = -1 / 2 * sin(1 / 3, AngleUnitType.PI)
Dim b As Double = -1 / 2 * cos(1 / 3, AngleUnitType.PI)
Dim z As New Complex(a, b)
Console.WriteLine(z.ToString)
Console.WriteLine(z.ToString(FormatType.TrianglePI))
End Sub
Public Sub PrintOut(ByVal z As Complex, ByVal digits As Integer)
Console.WriteLine()
z.RoundDigits = digits
Console.WriteLine(z.ToString(FormatType.Normal))
Console.WriteLine(z.ToString(FormatType.CoordinateNormal))
Console.WriteLine(z.ToString(FormatType.CoordinateDefault))
Console.WriteLine(z.ToString(FormatType.CoordinatePI))
Console.WriteLine(z.ToString(FormatType.CoordinateDegree))
Console.WriteLine(z.ToString(FormatType.TriangleDefault))
Console.WriteLine(z.ToString(FormatType.TrianglePI))
Console.WriteLine(z.ToString(FormatType.TriangleDegree))
Console.WriteLine(z.ToString(FormatType.ExponentDefault))
Console.WriteLine(z.ToString(FormatType.ExponentPI))
Console.WriteLine(z.ToString(FormatType.ExponentDegree))
End Sub
End Class