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