VBA Code

ME Study
0

 Laguerre Method- Function:

Public Function LaguerreMethod() As Variant

    Dim temp() As Variant
    
    Dim MaxIter As Integer
    Dim Tol As Double
    Dim x_k As Double
    Dim n As Double
    
    Dim px As Double, px1 As Double, px2 As Double
    Dim G As Double, H As Double, a As Double
    Dim radicand As Double, denom1 As Double, denom2 As Double, chosen_denom As Double
    
    Dim NumIter As Integer

    x_k = InputBox("Enter initial guess (x0): ")
    Tol = InputBox("Enter tolerance (for step size 'a'): ")
    MaxIter = InputBox("Enter maximum number of iterations: ")
    
    n = 3
    
    ReDim temp(1 To MaxIter + 1, 1 To 3)
    
    NumIter = 0
    
    temp(1, 1) = "Iteration"
    temp(1, 2) = "Step Size (a)"
    temp(1, 3) = "Root (x_k)"

    Do While NumIter < MaxIter
        
 
        px = x_k ^ 3 - 6 * x_k ^ 2 + 11 * x_k - 6
        px1 = 3 * x_k ^ 2 - 12 * x_k + 11
        px2 = 6 * x_k - 12
        

        If Abs(px) < 0.000000000001 Then
            Exit Do
        End If
        
        G = px1 / px
        
        H = G ^ 2 - (px2 / px)
        
        radicand = (n - 1) * (n * H - G ^ 2)
        
        If radicand < 0 Then radicand = Abs(radicand)
        
        denom1 = G + Sqr(radicand)
        denom2 = G - Sqr(radicand)
        

        If Abs(denom1) > Abs(denom2) Then
            chosen_denom = denom1
        Else
            chosen_denom = denom2
        End If
        

        a = n / chosen_denom
        
        x_k = x_k - a
        
        NumIter = NumIter + 1
        
        temp(NumIter + 1, 1) = NumIter
        temp(NumIter + 1, 2) = Abs(a)
        temp(NumIter + 1, 3) = x_k
  
        If Abs(a) < Tol Then
            Exit Do
        End If
        
    Loop
    
    LaguerreMethod = temp

End Function



Durand Kerner Method-Command Button:

Private Type Complex
    r As Double
    i As Double
End Type

Private Sub DurandKerner_Click()
    ActiveSheet.Cells.Clear

    Dim MaxIter As Integer, NumIter As Integer
    Dim MaxErr As Double, err As Double
    Dim p As Complex, q As Complex, r_root As Complex
    Dim p_new As Complex, q_new As Complex, r_new As Complex
    Dim num As Complex, den As Complex, delta As Complex
    Dim err_p As Double, err_q As Double, err_r As Double

    p.r = 1: p.i = 0
    q.r = 0.4: q.i = 0.9
    r_root.r = -0.65: r_root.i = 0.72

    MaxErr = InputBox("Enter maximum error")
    Cells(1, 1).Value = "Maximum error "
    Cells(1, 2).Value = MaxErr
    
    MaxIter = InputBox("Enter maximum number of iterations")
    Cells(2, 1).Value = "Maximum number of iterations "
    Cells(2, 2).Value = MaxIter
    
    Cells(4, 1).Value = "Iter No"
    Cells(4, 2).Value = "p"
    Cells(4, 3).Value = "q"
    Cells(4, 4).Value = "r"
    Cells(4, 5).Value = "Error"
    
    err = MaxErr + 0.001
    NumIter = 0
    
    Do While ((NumIter < MaxIter) And (err > MaxErr))
        num = F(p)
        den = CMul(CSub(p, q), CSub(p, r_root))
        delta = CDiv(num, den)
        p_new = CSub(p, delta)
        err_p = CAbs(delta)
        
        num = F(q)
        den = CMul(CSub(q, p_new), CSub(q, r_root))
        delta = CDiv(num, den)
        q_new = CSub(q, delta)
        err_q = CAbs(delta)
        
        num = F(r_root)
        den = CMul(CSub(r_root, p_new), CSub(r_root, q_new))
        delta = CDiv(num, den)
        r_new = CSub(r_root, delta)
        err_r = CAbs(delta)
        
        err = err_p
        If err_q > err Then err = err_q
        If err_r > err Then err = err_r
        
        NumIter = NumIter + 1
        Cells(NumIter + 4, 1).Value = NumIter
        Cells(NumIter + 4, 2).Value = Round(p_new.r, 4) & IIf(p_new.i >= 0, "+", "") & Round(p_new.i, 4) & "i"
        Cells(NumIter + 4, 3).Value = Round(q_new.r, 4) & IIf(q_new.i >= 0, "+", "") & Round(q_new.i, 4) & "i"
        Cells(NumIter + 4, 4).Value = Round(r_new.r, 4) & IIf(r_new.i >= 0, "+", "") & Round(r_new.i, 4) & "i"
        Cells(NumIter + 4, 5).Value = err
        
        p = p_new
        q = q_new
        r_root = r_new
    Loop
End Sub

Private Function F(x As Complex) As Complex
    Dim x2 As Complex, x3 As Complex
    x2 = CMul(x, x)
    x3 = CMul(x2, x)
    F.r = x3.r - 3 * x2.r + 3 * x.r - 5
    F.i = x3.i - 3 * x2.i + 3 * x.i
End Function

Private Function CSub(a As Complex, b As Complex) As Complex
    CSub.r = a.r - b.r: CSub.i = a.i - b.i
End Function

Private Function CMul(a As Complex, b As Complex) As Complex
    CMul.r = a.r * b.r - a.i * b.i
    CMul.i = a.r * b.i + a.i * b.r
End Function

Private Function CDiv(a As Complex, b As Complex) As Complex
    Dim d As Double
    d = b.r * b.r + b.i * b.i
    CDiv.r = (a.r * b.r + a.i * b.i) / d
    CDiv.i = (a.i * b.r - a.r * b.i) / d
End Function

Private Function CAbs(a As Complex) As Double
    CAbs = Sqr(a.r * a.r + a.i * a.i)
End Function

Private Sub CommandButton1_Click()

End Sub

Post a Comment

0Comments
Post a Comment (0)