Реализация класса комплексных чисел - VB

Узнай цену своей работы

Формулировка задачи:

Здраствуйте.. Очень нужна реализация класса комплексных чисел у Visual Basic. с этим языком программирования никогда раньше не сталкивалась (( буду очень признательна за помощь.

Решение задачи: «Реализация класса комплексных чисел»

textual
Листинг программы
Public Type Complex
    R As Double
    i As Double
End Type
 
Public Const PI = 3.14159265358979
Public Const E = 2.71828182845905
Private Const PI2 = PI / 2
 
'+=====================================================================================================================================+
'|                                                        Вещественные числа                                                           |
'+=====================================================================================================================================+
 
Public Function LogX(Value As Double, ByVal Base As Double) As Double                   ' Логарифм вещественного числа по основанию Х
    LogX = Log(Value) / Log(Base)
End Function
Public Function Log10(Value As Double) As Double                                        ' Десятичный логарифм вещественного числа
    Log10 = Log(Value) / 2.30258509299405
End Function
Public Function Log2(Value As Double) As Double                                         ' Двоичный логарифм вещественного числа
    Log2 = Log(Value) / 0.693147180559945
End Function
Public Function Ceil(Value As Double) As Double                                         ' Округление в большую сторону
    Ceil = -Int(-Value)
End Function
Public Function Floor(Value As Double) As Double                                        ' Округление в меньшую сторону (Int)
    Floor = Int(Value)
End Function
Public Function Sec(Value As Double) As Double                                          ' Секанс вещественного числа
    Sec = 1 / Cos(Value)
End Function
Public Function Csc(Value As Double) As Double                                          ' Косеканс вещественного числа
    Csc = 1 / Sin(Value)
End Function
Public Function Ctg(Value As Double) As Double                                          ' Котангенс вещественного числа
    Ctg = 1 / Tan(Value)
End Function
Public Function Asin(Value As Double) As Double                                         ' Арксинус вещественного числа
    If Value = -1 Then Asin = -PI2: Exit Function
    If Value = 1 Then Asin = PI2: Exit Function
    Asin = Atn(Value / Sqr(-Value * Value + 1))
End Function
Public Function Acos(Value As Double) As Double                                         ' Арккоснус вещественного числа
    If Value = -1 Then Acos = PI: Exit Function
    If Value = 1 Then Acos = 0: Exit Function
    Acos = Atn(-Value / Sqr(-Value * Value + 1)) + 1.5707963267949
End Function
Public Function Asec(Value As Double) As Double                                         ' Арксеканс вещественного числа
    Asec = 1.5707963267949 - Atn(Sgn(Value) / Sqr(Value * Value - 1))
End Function
Public Function Acsc(Value As Double) As Double                                         ' Арккосеканс вещественного числа
    Acsc = Atn(Sgn(Value) / Sqr(Value * Value - 1))
End Function
Public Function Atan2(ByVal Y As Double, ByVal x As Double) As Double 'Возвращает угол, тангенс которого равен отношению двух указанных чисел
    If Y > 0 Then
        If x >= Y Then
            Atan2 = Atn(Y / x)
        ElseIf x <= -Y Then
            Atan2 = Atn(Y / x) + PI
        Else
            Atan2 = PI / 2 - Atn(x / Y)
        End If
    Else
        If x >= -Y Then
            Atan2 = Atn(Y / x)
        ElseIf x <= Y Then
            Atan2 = Atn(Y / x) - PI
        Else
            Atan2 = -Atn(x / Y) - PI / 2
        End If
    End If
End Function
Public Function Actg(Value As Double) As Double                                         ' Арккотангенс вещественного числа
    Actg = 1.5707963267949 - Atn(Value)
End Function
Public Function Sinh(Value As Double) As Double                                         ' Гиперболический синус вещественного числа
    Sinh = (Exp(Value) - Exp(-Value)) / 2
End Function
Public Function Cosh(Value As Double) As Double                                         ' Гиперболический косинус вещественного числа
    Cosh = (Exp(Value) + Exp(-Value)) / 2
End Function
Public Function Tanh(Value As Double) As Double                                         ' Гиперболический тангенс вещественного числа
    Tanh = (Exp(2 * Value) - 1) / (Exp(2 * Value) + 1)
End Function
Public Function Ctgh(Value As Double) As Double                                         ' Гиперболический котангенс вещественного числа
    Ctgh = 1 / (Exp(2 * Value) + 1) / (Exp(2 * Value) - 1)
End Function
Public Function Sech(Value As Double) As Double                                         ' Гиперболический секанс вещественного числа
    Sech = 2 / (Exp(Value) + Exp(-Value))
End Function
Public Function Csch(Value As Double) As Double                                         ' Гиперболический косеканс вещественного числа
    Csch = 2 / (Exp(Value) - Exp(-Value))
End Function
Public Function Asinh(Value As Double) As Double                                        ' Гиперболический ареасинус вещественного числа
    Asinh = Log(Value + Sqr(Value * Value + 1))
End Function
Public Function Acosh(Value As Double) As Double                                        ' Гиперболический ареакосинус вещественного числа
    Acosh = Log(Value + Sqr(Value * Value - 1))
End Function
Public Function Atanh(Value As Double) As Double                                        ' Гиперболический ареатангенс вещественного числа
    Atanh = Log((1 + Value) / (1 - Value)) / 2
End Function
Public Function Actan(Value As Double) As Double                                        ' Гиперболический ареакотангенс вещественного числа
    Actan = Log((Value + 1) / (Value - 1)) / 2
End Function
Public Function Asech(Value As Double) As Double                                        ' Гиперболический ареасеканс вещественного числа
    Asech = Log((Sqr(-Value * Value + 1) + 1) / Value)
End Function
Public Function Acsch(Value As Double) As Double                                        ' Гиперболический ареакосеканс вещественного числа
    Acsch = Log((Sgn(Value) * Sqr(Value * Value + 1) + 1) / Value)
End Function
Public Function Max(ByVal Op1 As Double, ByVal Op2 As Double) As Double                 ' Возвращает максимальное из двух чисел
    Max = IIf(Op1 > Op2, Op1, Op2)
End Function
Public Function Min(ByVal Op1 As Double, ByVal Op2 As Double) As Double                 ' Возвращает минимальное из двух чисел
    Min = IIf(Op1 < Op2, Op1, Op2)
End Function
Public Function IEEERemainder(ByVal Op1 As Double, ByVal Op2 As Double) As Double       ' Возвращает остаток от деления одного указанного числа на другое указанное число.
    IEEERemainder = Op1 - (Op2 * Round(Op1 / Op2))
End Function
Public Function rMod(ByVal Op1 As Double, ByVal Op2 As Double) As Double                ' Возвращает остаток от деления одного указанного числа на другое указанное число.
    rMod = (Abs(Op1) - (Abs(Op2) * (Int(Abs(Op1) / Abs(Op2))))) * Sgn(Op1)
End Function
 
'+=====================================================================================================================================+
'|                                                         Комплексные числа                                                           |
'+=====================================================================================================================================+
Public Function cxOne() As Complex                                                      ' R=1,I=0
    cxOne.R = 1
End Function
Public Function cxImgOne() As Complex                                                   ' R=0,I=1
    cxOne.i = 1
End Function
Public Function cxZero() As Complex                                                     ' R=0,I=0
End Function
Public Function cxNew(ByVal Real As Double, ByVal Imaginary As Double) As Complex       ' Создание нового комплексного числа
    cxNew.R = Real: cxNew.i = Imaginary
End Function
Public Function cxPolar(ByVal Magnitude As Double, ByVal Phase As Double) As Complex    ' Создание комплексного числа по полярным координатам
    cxPolar.R = Magnitude * Cos(Phase): cxPolar.i = Magnitude * Sin(Phase)
End Function
Public Function cxNeg(Op As Complex) As Complex                                         ' Возвращает аддитивную инверсию указанного комплексного числа
    cxNeg.R = -Op.R: cxNeg.i = -Op.i
End Function
Public Function cxInv(Op As Complex) As Complex                                         ' Возвращает обратную величину комплексного числа
    Dim Ab2 As Double
    Ab2 = Op.R * Op.R + Op.i * Op.i
    cxInv.R = Op.R / Ab2: cxInv.i = -Op.i / Ab2
End Function
Public Function cxAdd(Op1 As Complex, Op2 As Complex) As Complex                        ' Сложение комплексных чисел
    cxAdd.R = Op1.R + Op2.R
    cxAdd.i = Op1.i + Op2.i
End Function
Public Function cxSub(Op1 As Complex, Op2 As Complex) As Complex                        ' Вычитание комплексных чисел
    cxSub.R = Op1.R - Op2.R
    cxSub.i = Op1.i - Op2.i
End Function
Public Function cxMul(Op1 As Complex, Op2 As Complex) As Complex                        ' Умножение комплексных чисел
    cxMul.R = Op1.R * Op2.R - Op1.i * Op2.i
    cxMul.i = Op1.R * Op2.i + Op1.i * Op2.R
End Function
Public Function cxDiv(Op1 As Complex, Op2 As Complex) As Complex                        ' Деление комплексных чисел
    Dim R2 As Double, i2 As Double
    R2 = Op2.R * Op2.R: i2 = Op2.i * Op2.i
    cxDiv.R = (Op1.R * Op2.R + Op1.i * Op2.i) / (R2 + i2)
    cxDiv.i = (Op1.i * Op2.R - Op1.R * Op2.i) / (R2 + i2)
End Function
Public Function cxDgr(Op As Complex, ByVal Degree As Long) As Complex                   ' Возведение в степень комплексного числа
    Dim Md As Double, Ar As Double
    Md = cxMod(Op): Ar = cxArg(Op): Md = Md ^ Degree: Ar = Ar * Degree
    cxDgr.R = Md * Cos(Ar): cxDgr.i = Md * Sin(Ar)
End Function
Public Function cxSqr(Op As Complex) As Complex                                         ' Квадратный корень комплексного числа
    Dim M As Double, A As Double
    M = Sqr(cxMod(Op)): A = cxArg(Op) / 2
    cxSqr.R = M * Cos(A): cxSqr.i = M * Sin(A)
End Function
Public Function cxMod(Op As Complex) As Double                                          ' Модуль комплексного числа
    Dim R2 As Double, i2 As Double
    R2 = Op.R * Op.R: i2 = Op.i * Op.i
    cxMod = Sqr(R2 + i2)
End Function
Public Function cxPhase(Op As Complex) As Double                                        ' Фаза комплексного числа
    cxPhase = Atan2(Op.i, Op.R)
End Function
Public Function cxArg(Op As Complex) As Double                                          ' Аргумент, эквивалентно фазе
    If Op.i = 0 Then
        If Op.R >= 0 Then cxArg = 0 Else cxArg = PI
    ElseIf Op.R = 0 Then
        If Op.i >= 0 Then cxArg = PI2 Else cxArg = -PI2
    Else
        If Op.R > 0 Then
            cxArg = Atn(Op.i / Op.R)
        ElseIf Op.R < 0 And Op.i > 0 Then
            cxArg = PI + Atn(Op.i / Op.R)
        ElseIf Op.R < 0 And Op.i < 0 Then
            cxArg = -PI + Atn(Op.i / Op.R)
        End If
    End If
End Function
Public Function cxExp(Op As Complex) As Complex                                         ' Возвращает число e, возведенное в степень, определяемую комплексным числом
    cxExp.R = Exp(Op.R) * Cos(Op.i): cxExp.i = Exp(Op.R) * Sin(Op.i)
End Function
Public Function cxAddReal(Op1 As Complex, Op2 As Double) As Complex                     ' Сложение вещественного и комплексного числа
    cxAddReal.R = Op1.R + Op2
    cxAddReal.i = Op1.i
End Function
Public Function cxSubReal(Op1 As Complex, Op2 As Double) As Complex                     ' Вычитание из комплексного числа вещественного
    cxSubReal.R = Op1.R - Op2
    cxSubReal.i = Op1.i
End Function
Public Function cxRealSub(Op1 As Double, Op2 As Complex) As Complex                     ' Вычитание из действительного числа комплексного
    cxRealSub.R = Op1 - Op2.R
    cxRealSub.i = -Op2.i
End Function
Public Function cxMulReal(Op1 As Complex, Op2 As Double) As Complex                     ' Умножение комплексного числа на вещественное
    cxMulReal.R = Op1.R * Op2
    cxMulReal.i = Op1.i * Op2
End Function
Public Function cxDivReal(Op1 As Complex, Op2 As Double) As Complex                     ' Деление комплексного числа на вещественное
    Dim R2 As Double
    R2 = Op2 * Op2
    cxDivReal.R = (Op1.R * Op2) / R2
    cxDivReal.i = (Op1.i * Op2) / R2
End Function
Public Function cxRealDiv(Op1 As Double, Op2 As Complex) As Complex                     ' Деление действительного числа на комплексное
    Dim R2 As Double, i2 As Double
    R2 = Op2.R * Op2.R: i2 = Op2.i * Op2.i
    cxRealDiv.R = (Op1 * Op2.R) / (R2 + i2)
    cxRealDiv.i = (-Op1 * Op2.i) / (R2 + i2)
End Function
Public Function cxAddImg(Op1 As Complex, Op2 As Double) As Complex                      ' Сложение комплексного числа и мнимого коэффициента
    cxAddImg.R = Op1.R
    cxAddImg.i = Op1.i + Op2
End Function
Public Function cxSubImg(Op1 As Complex, Op2 As Double) As Complex                      ' Вычитание из комплексного числа мнимого коэффициента
    cxSubImg.R = Op1.R
    cxSubImg.i = Op1.i - Op2
End Function
Public Function cxImgSub(Op1 As Double, Op2 As Complex) As Complex                      ' Вычитание из мнимого коэффициента комплексного
    cxImgSub.R = -Op2.R
    cxImgSub.i = Op1 - Op2.i
End Function
Public Function cxMulImg(Op1 As Complex, Op2 As Double) As Complex                      ' Умножение комплексного числа на мнимый коэффициент
    cxMulImg.R = -Op1.i * Op2
    cxMulImg.i = Op1.R * Op2
End Function
Public Function cxDivImg(Op1 As Complex, Op2 As Double) As Complex                      ' Деление комплексного числа на мнимый коэффициент
    Dim i2 As Double
    i2 = Op2 * Op2
    cxDivImg.R = (Op1.i * Op2) / i2
    cxDivImg.i = (-Op1.R * Op2) / i2
End Function
Public Function cxImgDiv(Op1 As Double, Op2 As Complex) As Complex                      ' Деление мнимого коэффициента на комплексное число
    Dim R2 As Double, i2 As Double
    R2 = Op2.R * Op2.R: i2 = Op2.i * Op2.i
    cxImgDiv.R = (Op1 * Op2.i) / (R2 + i2)
    cxImgDiv.i = (Op1 * Op2.R) / (R2 + i2)
End Function
Public Function cxEq(Op1 As Complex, Op2 As Complex, _
                Optional NumDigitsAfterDecimal As Long = -1) As Boolean                 ' True - если комплексные числа равны
    If NumDigitsAfterDecimal = -1 Then
        If Op1.R = Op2.R And Op1.i = Op2.i Then cxEq = True
    Else
        If Round(Op1.R, NumDigitsAfterDecimal) = Round(Op2.R, NumDigitsAfterDecimal) And _
           Round(Op1.i, NumDigitsAfterDecimal) = Round(Op2.i, NumDigitsAfterDecimal) Then cxEq = True
    End If
End Function
Public Function cxAbs(Op As Complex) As Double                                          ' Абсолютное значение комплексного числа
    If Op.i = 0 Then
        cxAbs = 0
    ElseIf Op.R > Op.i Then
        cxAbs = Sqr(1 + (Op.i * Op.i) / (Op.R * Op.R))
    ElseIf Op.R <= Op.i Then
        cxAbs = Sqr(1 + (Op.R * Op.R) / (Op.i * Op.i))
    End If
End Function
Public Function cxConj(Op As Complex) As Complex                                        ' Сопряжение комплексного числа
    cxConj.R = Op.R
    cxConj.i = -Op.i
End Function
Public Function cxLog(Op As Complex) As Complex                                         ' Натуральный логарифм комплексного числа
    Dim M As Double, A As Double
    M = cxMod(Op): A = cxArg(Op)
    cxLog.R = Log(M): cxLog.i = A
End Function
Public Function cxLogX(Op As Complex, Base As Double) As Complex                        ' Логарифм комплексного числа по основанию Х
    Dim M As Double, A As Double, Nc As Complex
    M = cxMod(Op): A = cxArg(Op): Nc.R = Log(Base)
    cxLogX.R = Log(M): cxLogX.i = A
    cxLogX = cxDiv(cxLogX, Nc)
End Function
Public Function cxSin(Op As Complex) As Complex                                         ' Синус комплексного числа
    cxSin.R = Sin(Op.R) * Cosh(Op.i): cxSin.i = Cos(Op.R) * Sinh(Op.i)
End Function
Public Function cxCos(Op As Complex) As Complex                                         ' Косинус комплексного числа
    cxCos.R = Cos(Op.R) * Cosh(Op.i): cxCos.i = -Sin(Op.R) * Sinh(Op.i)
End Function
Public Function cxTan(Op As Complex) As Complex                                         ' Тангенс комплексного числа
    Dim C2 As Double, S2 As Double
    C2 = Cos(Op.R): C2 = C2 * C2: S2 = Sinh(Op.i): S2 = S2 * S2
    cxTan.R = (Sin(Op.R) * Cos(Op.R)) / (C2 + S2)
    cxTan.i = (Sinh(Op.i) * Cosh(Op.i)) / (C2 + S2)
End Function
Public Function cxCtg(Op As Complex) As Complex                                         ' Котангенс комплексного числа
    Dim C2 As Double, S2 As Double
    C2 = Sin(Op.R): C2 = C2 * C2: S2 = Sinh(Op.i): S2 = S2 * S2
    cxCtg.R = (Sin(Op.R) * Cos(Op.R)) / (C2 + S2)
    cxCtg.i = -(Sinh(Op.i) * Cosh(Op.i)) / (C2 + S2)
End Function
Public Function cxSec(Op As Complex) As Complex                                         ' Секанс комплексного числа
    Dim C2 As Double, S2 As Double
    C2 = Cos(Op.R): C2 = C2 * C2: S2 = Sinh(Op.i): S2 = S2 * S2
    cxSec.R = (Cos(Op.R) * Cosh(Op.i)) / (C2 + S2)
    cxSec.i = -(Sin(Op.R) * Sinh(Op.i)) / (C2 + S2)
End Function
Public Function cxCsc(Op As Complex) As Complex                                         ' Косеканс комплексного числа
    Dim C2 As Double, S2 As Double
    C2 = Sin(Op.R): C2 = C2 * C2: S2 = Sinh(Op.i): S2 = S2 * S2
    cxCsc.R = (Sin(Op.R) * Cosh(Op.i)) / (C2 + S2)
    cxCsc.i = (Cos(Op.R) * Sinh(Op.i)) / (C2 + S2)
End Function
Public Function cxAsin(Op As Complex) As Complex                                        ' Арксинус комплексного числа
    cxAsin = cxMulImg(cxLog(cxAdd(cxMulImg(Op, 1), cxSqr(cxRealSub(1, cxMul(Op, Op))))), -1)
End Function
Public Function cxAcos(Op As Complex) As Complex                                        ' Арккосинус комплексного числа
    cxAcos = cxAddReal(cxMulImg(cxLog(cxAdd(cxMulImg(Op, 1), cxSqr(cxRealSub(1, cxMul(Op, Op))))), 1), PI2)
End Function
Public Function cxAtan(Op As Complex) As Complex                                        ' Арктангенс комплексного числа
    Dim Iz As Complex
    Iz = cxMulImg(Op, 1)
    cxAtan = cxMulImg(cxSub(cxLog(cxRealSub(1, Iz)), cxLog(cxAddReal(Iz, 1))), 0.5)
End Function
Public Function cxActg(Op As Complex) As Complex                                        ' Арккотангенс комплексного числа
    cxActg = cxMulImg(cxSub(cxLog(cxDiv(cxSubImg(Op, 1), Op)), cxLog(cxDiv(cxAddImg(Op, 1), Op))), 0.5)
End Function
Public Function cxAsec(Op As Complex) As Complex                                        ' Арксеканс комплексного числа
    cxAsec = cxAcos(cxDgr(Op, -1))
End Function
Public Function cxAcsc(Op As Complex) As Complex                                        ' Арккосеканс комплексного числа
    cxAcsc = cxAsin(cxDgr(Op, -1))
End Function
Public Function cxSinh(Op As Complex) As Complex                                        ' Гиперболический синус комплексного числа
    cxSinh = cxMulImg(cxSin(cxMulImg(Op, 1)), -1)
End Function
Public Function cxCosh(Op As Complex) As Complex                                        ' Гиперболический косинус комплексного числа
    cxCosh = cxCos(cxMulImg(Op, 1))
End Function
Public Function cxTanh(Op As Complex) As Complex                                        ' Гиперболический тангенс комплексного числа
    cxTanh = cxMulImg(cxTan(cxMulImg(Op, 1)), -1)
End Function
Public Function cxCtgh(Op As Complex) As Complex                                        ' Гиперболический котангенс комплексного числа
    cxCtgh = cxRealDiv(1, cxTanh(Op))
End Function
Public Function cxSech(Op As Complex) As Complex                                        ' Гиперболический секанс комплексного числа
    cxSech = cxRealDiv(1, cxCosh(Op))
End Function
Public Function cxCsch(Op As Complex) As Complex                                        ' Гиперболический косеканс комплексного числа
    cxCsch = cxRealDiv(1, cxSinh(Op))
End Function
Public Function cxAsinh(Op As Complex) As Complex                                       ' Гиперболический ареасинус комплексного числа
    cxAsinh = cxLog(cxAdd(Op, cxSqr(cxAddReal(cxMul(Op, Op), 1))))
End Function
Public Function cxAcosh(Op As Complex) As Complex                                       ' Гиперболический ареакосинус комплексного числа
    cxAcosh = cxLog(cxAdd(Op, cxMul(cxSqr(cxAddReal(Op, 1)), cxSqr(cxSubReal(Op, 1)))))
End Function
Public Function cxAtanh(Op As Complex) As Complex                                       ' Гиперболический ареатангенс комплексного числа
    cxAtanh = cxMulReal(cxLog(cxDiv(cxAddReal(Op, 1), cxRealSub(1, Op))), 0.5)
End Function
Public Function cxActgh(Op As Complex) As Complex                                       ' Гиперболический ареакотангенс комплексного числа
    cxActgh = cxMulReal(cxLog(cxDiv(cxAddReal(Op, 1), cxSubReal(Op, 1))), 0.5)
End Function
Public Function cxAsech(Op As Complex) As Complex                                       ' Гиперболический ареасеканс комплексного числа
    Dim Z As Complex
    Z = cxRealDiv(1, Op)
    cxAsech = cxLog(cxAdd(Z, cxSqr(cxAddReal(cxMul(Z, Z), 1))))
End Function
Public Function cxAcsch(Op As Complex) As Complex                                       ' Гиперболический ареакосеканс комплексного числа
    Dim Z As Complex
    Z = cxRealDiv(1, Op)
    cxAcsch = cxLog(cxAdd(Z, cxMul(cxSqr(cxAddReal(Z, 1)), cxSqr(cxSubReal(Z, 1)))))
End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы