Imports System Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic showing how to find a minimum of a univariate function. Module OneVariableMinimizationExample Private Function df(ByVal x As Double) As Double Return 8 * Math.Cos(x) + 6 * x - 5 End Function Private Function f(ByVal x As Double) As Double Return 8 * Math.Sin(x) + 3 * x * x - 5 * x End Function Sub Main() Create a one-variable function. Dim D As New Func(Of Double, Double)(AddressOf f) Dim Func As New OneVariableFunction(D) Use golden section search to find the minimum of the function in the interval -10000 to 10000. Dim Lower As Integer = -10000 Dim Upper As Integer = 10000 Create the minimizer with default tolerance and default maximum iterations. Dim Golden As New GoldenMinimizer Perform the minimization. Dim Min As Double = Golden.Minimize(Func, Lower, Upper) Console.WriteLine() Console.WriteLine("GoldenMinimizer found a minimum of " & Func.Evaluate(Min)) Console.WriteLine("at " & Min & " in " & Golden.Iterations & " iterations.") If (Golden.ToleranceMet) Then Error is less than desired tolerance Console.Write("Error of " & Golden.Error & " is within tolerance of ") Console.WriteLine(Golden.Tolerance & ".") Else Minimization ended because maximum iterations was reached Console.WriteLine("Ended with maximum iterations.") End If Console.WriteLine() Try Brents Method for better efficiency. Dim Brent As New BrentMinimizer Min = Brent.Minimize(Func, Lower, Upper) Console.WriteLine("BrentMinimizer found a minimum of " & Func.Evaluate(Min)) Console.WriteLine("at " & Min & " in " & Brent.Iterations & " iterations.") If (Brent.ToleranceMet) Then Error is less than desired tolerance Console.Write("Error of " & Brent.Error & " is within tolerance of ") Console.WriteLine(Brent.Tolerance & ".") Else Minimization ended because maximum iterations was reached Console.WriteLine("Ended with maximum iterations.") End If Console.WriteLine() If the derivative is known, we can utilize a better Brents algorithm. Create the derivative function. D = New Func(Of Double, Double)(AddressOf df) Dim Derivative As New OneVariableFunction(D) Instantiate a DBrentMinimizer. Dim DBRent As New DBrentMinimizer Min = DBRent.Minimize(Func, Derivative, Lower, Upper) Console.WriteLine("DBrentMinimizer found a minimum of " & Func.Evaluate(Min)) Console.WriteLine("at " & Min & " in " & DBRent.Iterations & " iterations.") If (DBRent.ToleranceMet) Then Error is less than desired tolerance Console.Write("Error of " & DBRent.Error & " is within tolerance of ") Console.WriteLine(DBRent.Tolerance & ".") Else Minimization ended because maximum iterations was reached Console.WriteLine("Ended with maximum iterations.") End If Console.WriteLine() Increase the tolerance to 0.1 DBRent.Tolerance = 0.1 Min = DBRent.Minimize(Func, Derivative, Lower, Upper) Console.WriteLine("DBrentMinimizer found a minimum of " & Func.Evaluate(Min)) Console.WriteLine("at " & Min & " in " & DBRent.Iterations & " iterations.") If (DBRent.ToleranceMet) Then Error is less than desired tolerance Console.Write("Error of " & DBRent.Error & " is within tolerance of ") Console.WriteLine(DBRent.Tolerance & ".") Else Minimization ended because maximum iterations was reached Console.WriteLine("Ended with maximum iterations.") End If Console.WriteLine() Decrease tolerance to 1e-13 and increase the interval. DBRent.Tolerance = 0.0000000000001 Min = DBRent.Minimize(Func, Derivative, Lower * 100, Upper * 100) Console.WriteLine("DBrentMinimizer found a minimum of " & Func.Evaluate(Min)) Console.WriteLine("at " & Min & " in " & DBRent.Iterations & " iterations.") If (DBRent.ToleranceMet) Then Console.Write("Error of " & DBRent.Error & " is within tolerance of ") Console.WriteLine(DBRent.Tolerance & ".") Else Console.WriteLine("Ended with maximum iterations.") End If Console.WriteLine() Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub End Module End Namespace← All NMath Code Examples