复数类的设计及其应用:复数类的设计

Author:水如烟  

摘要:尝试建立一个复数类,应用于复数运算、平面向量和平面坐标系的转换。 

复数类的设计

目的要求:

  1. 应方便输入习惯
  2. 应满足输出要求
  3. 应与实际数学运算过程的形式保持一致

关键:发挥复数两种表示方式的特点,注重复数几何表示与平面向量的结合。

知识:复数常用的表示形式有两种,一是定义式,即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

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

 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

 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


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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值