← All NMath Code Examples
Imports System
Imports CenterSpace.NMath.Core
Namespace CenterSpace.NMath.Examples.VisualBasic
A .NET example in Visual Basic showing how to use the multivariable minimizer.
Module MultiVariableMinimizationExample
Private Function df0(ByVal X As DoubleVector) As Double
Return 1.6 * Math.Pow(X(0), 3)
End Function
Private Function df1(ByVal X As DoubleVector) As Double
Return 0.1 * Math.Cos(X(1))
End Function
Private Function df2(ByVal X As DoubleVector) As Double
Return 10 * X(2)
End Function
Private Function df3(ByVal X As DoubleVector) As Double
Return 16 * Math.Pow(X(3), 3)
End Function
Private Function F(ByVal x As DoubleVector) As Double
Return 0.4 * Math.Pow(x(0), 4) + 0.1 * Math.Sin(x(1)) + 5 * x(2) * x(2) + 4 * Math.Pow(x(3), 4)
End Function
Sub Main()
Create a multivariable function.
Dim D As Func(Of DoubleVector, Double) = AddressOf F
Dim Func As New MultiVariableFunction(D)
Start at ( 0, 0, 0, 0 ).
Dim StartPoint As New DoubleVector(0.0, 0.0, 0.0, 0.0)
Create a DownhillSimplexMinimizer with the default error tolerance and maximum
iterations.
Dim Simplex As New DownhillSimplexMinimizer
Minimize the function.
Dim Min As DoubleVector = Simplex.Minimize(Func, StartPoint)
Console.WriteLine()
Console.WriteLine("DownhillSimplexMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString("G7") & ".")
If (Simplex.ToleranceMet) Then
Error is less than desired tolerance
Console.Write("Error of " & Simplex.Error & " is within tolerance of ")
Console.WriteLine(Simplex.Tolerance & ".")
Else
Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
Increase the maximum number of iterations from the default of 100 to 1000.
Simplex.MaxIterations = 1000
Minimize the function.
Min = Simplex.Minimize(Func, StartPoint)
Console.WriteLine("DownhillSimplexMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString("G7") & ".")
If (Simplex.ToleranceMet) Then
Error is less than desired tolerance
Console.Write("Error of " & Simplex.Error & " is within tolerance of ")
Console.WriteLine(Simplex.Tolerance & ".")
Else
Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
Now try using Powells Method.
Create the minimizer with default error tolerance and default maximum iterations.
Dim Powell As New PowellMinimizer
Perform the minimization.
Min = Powell.Minimize(Func, StartPoint)
Console.WriteLine("PowellMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString("G7") & ".")
If (Powell.ToleranceMet) Then
Error is less than desired tolerance
Console.Write("Error of " & Powell.Error & " is within tolerance of ")
Console.WriteLine(Powell.Tolerance & ".")
Else
Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
If the derivatives are known, then use one of the IMultiVariableDMinimizer
classes such as ConjugateGradientMinimizer.
Create an array of partial derivatives
Dim Partials(3) As MultiVariableFunction
Partials(0) = New MultiVariableFunction(New Func(Of DoubleVector, Double)(AddressOf df0))
Partials(1) = New MultiVariableFunction(New Func(Of DoubleVector, Double)(AddressOf df1))
Partials(2) = New MultiVariableFunction(New Func(Of DoubleVector, Double)(AddressOf df2))
Partials(3) = New MultiVariableFunction(New Func(Of DoubleVector, Double)(AddressOf df3))
Create the minimizer with default tolerance and default maximum iterations.
Dim CG As New ConjugateGradientMinimizer
Perform the minimization.
StartPoint = New DoubleVector(1.0, 2.0, 3.0, 4.0)
Min = CG.Minimize(Func, Partials, StartPoint)
Console.WriteLine("ConjugateGradientMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString("G7") & ".")
If (CG.ToleranceMet) Then
Error is less than desired tolerance
Console.Write("Error of " & CG.Error & " is within tolerance of ")
Console.WriteLine(CG.Tolerance & ".")
Else
Minimization ended because maximum iterations was reached
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