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
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