Sub GetLambda(Re As Double) As Double
Dim y As Double 'f(x) = 0
Dim x0 As Double = 1 'initial approach
Dim x1 As Double
Dim dx As Double 'derivative function
Dim Precision As Double = 0.0001
Dim Check As Boolean = False
Do While Check = False
y = 2 * x0 * Logarithm(Re * Sqrt(x0) - 0.8, cE) - 1
dx = 2 * Logarithm(Re * Sqrt(x0) - 0.8, cE) + 2 * x0 * Re * 1 / 2 * Power(x0, - 1 / 2) / (Re * Sqrt(x0) - 0.8)
x1 = x0 - y / dx
If Abs(x1 - x0) < Precision Then
Return x1
Else
x0 = x1
End If
Loop
End Sub
Dim lamda As Double
Dim res As Double
Dim p As Double
For lamda = 3.6 To 10 Step 0.0001
p = Sqrt(lamda)
res = 1/p - 2*Logarithm(p-0.8,cE)
Log("lamda = " & lamda & " res = " & res)
If Abs(res) <= 0.00001 Then Exit
Next
...
lamda = 4.29630000000342 res = 8.778585356983282E-5
lamda = 4.29640000000342 res = 4.426572195592726E-5
lamda = 4.2965000000034195 res = 7.469458777054072E-7
Dim greek() As Int = Array As Int(0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF)
Log(Chr(greek(10)) & " = " & NumberFormat2(lamda, 0, 4, 4, False))
Dim greek As String = "αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
Dim english As String = "abgdezhziklmvxoprstufcywABGDEZHIKLMVXOPRSTUFCYW"
Log(greek.charAt(english.IndexOf("l")) & " = " & NumberFormat2(lamda, 1, 4, 4, False))
Private Sub GetLambda(Reynolds As Double) As Double
Private y As Double 'f(x) = 0
Private x0 As Double = 0.0473 'initial approach
Private x1 As Double
Private dx As Double 'derivative function
Private Precision As Double = 0.0001
Private LowerBound As Double = 1E-8
Private MaxIterations As Int = 100
Private Check As Boolean = False
Do While Check = False
Private count = 1 As Int
' Let x0 , x1 = Sqrt(Lambda) , simplify iteration formula
y = 2 * x0 * Logarithm(Reynolds * x0 - 0.8, 10) - 1
dx = 2 * Logarithm(Reynolds * x0 - 0.8, 10) + 2 * x0 * Reynolds / ((Reynolds * x0 - 0.8) * Logarithm(10 , cE))
x1 = x0 - y / dx
If ( Abs(x1 - x0) < Precision Or y = LowerBound ) Then
Verify = True
Return x1
Else
x0 = x1
End If
If ( dx = 0 Or count > MaxIterations) Then
Verify = False
Return x1
End If
count=count+1
Loop
End Sub
La , Verify = GetLambda(Re)
Private Sub GetLambda(Reynolds As Double) As Double
Private y As Double 'f(x) = 0
Private x0 As Double = 0.0276 'initial approach
Private x1 As Double
Private dx As Double 'derivative function
Private Precision As Double = 0.0001
Private LowerBound As Double = 1E-8
Private MaxIterations As Int = 100
Private Check As Boolean = False
Do While Check = False
Private count = 1 As Int
y = 2 * x0 * Logarithm(Reynolds * Sqrt(x0) - 0.8, 10) - 1
dx = 2 * Logarithm(Reynolds * Sqrt(x0) - 0.8, 10) + Sqrt(x0) * Reynolds / ((Reynolds * Sqrt(x0) - 0.8) * Logarithm(10 , cE))
x1 = x0 - y / dx
If ( Abs(x1 - x0) < Precision Or y = LowerBound ) Then
Verify = True
Return x1 , Verify
Else
x0 = x1
End If
If ( dx = 0 Or count > MaxIterations) Then
Verify = False
Return x1 , Verify
End If
count=count+1
Loop
End Sub
Another alternative which I think is more flexible and better in some situations is to use an object ...Return multiple values as an array.
Type result (item1 as int, item2 as double)
. . .
Sub Calculate(arg1 as double) As result
Dim r as result
. . .
r.item1 = firstValue
. . .
r.item2 = secondValue
. . .
return r
End Sub