# VB Multi Variable Minimization Example

← 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

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.

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")