# VB Trust Region 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 find find the minimization of a function
using the trust-region method.
Module TrustRegionMinimizationExample

Sub Main()

Console.WriteLine()
Minimization in this context means finding the solution that evaluates to the vector with the smallest
two norm (distance from origin).

TrustRegionMimizer provides the Minimize() method for minimizing a given function
encapsulated as a DoubleMultiVariableFunction, an abstract class for representing a multivariable function.
Dim F As New MyFunction

Choose a starting point
Dim Start As New DoubleVector(50.0, 30.0, -1000.0)

Create a minimizer with default tolerance and maximum iterations.
Dim Minimizer As New TrustRegionMinimizer()

Console.WriteLine()

Compute the solution and display the results.
Console.WriteLine("Minimize by implementing DoubleMultiVariableFunction..." & Environment.NewLine)
Dim Solution As DoubleVector = Minimizer.Minimize(F, Start)
Print(Minimizer, Start, Solution)

You can also wrap a function to minimize in a delegate, rather than extending DoubleMultiVariableFunction
Dim F2 As Func(Of DoubleVector, DoubleVector) = Function(x As DoubleVector)
Dim Y As New DoubleVector(4)
Y(0) = 5 * x(1) * x(1) + x(2) * x(2)
Y(1) = 4 * x(0) * x(0) - x(2) * x(2) + 45
Y(2) = x(0) * 3 * x(0) - x(1) * x(1) + 9
Y(3) = Y(0) + Y(1) + Y(2) * Y(2) - 43
Return Y
End Function

Console.WriteLine("Minimize using delegate..." & Environment.NewLine)
Dim yDim As Integer = 4
Solution = Minimizer.Minimize(F2, Start, yDim)
Print(Minimizer, Start, Solution)

Console.WriteLine("Minimize with bounds..." & Environment.NewLine)

Now add some constraints. Set a lower bound to (0, 0, 0) and an upper bound to (10, 10, 10)
Dim LowerBounds As New DoubleVector(3)
Dim UpperBounds As New DoubleVector(3, 10.0)

Minimize again, and display the result.
Solution = Minimizer.Minimize(F, Start, LowerBounds, UpperBounds)
Console.WriteLine("Lower bounds = " & LowerBounds.ToString())
Console.WriteLine("Upper bounds = " & UpperBounds.ToString())
Print(Minimizer, Start, Solution)

Console.WriteLine()
Console.WriteLine("Press Enter Key")

End Sub

The function to minimize
Private Function MyFunction(ByVal X As DoubleVector) As DoubleVector

Dim y As New DoubleVector(4)
y(0) = 5 * X(1) * X(1) + X(2) * X(2)
y(1) = 4 * X(0) * X(0) - X(2) * X(2) + 45
y(2) = X(0) * 3 * X(0) - X(1) * X(1) + 9
y(3) = y(0) + y(1) + y(2) * y(2) - 43
Return y

End Function

Private Sub Print(ByVal Minimizer As TrustRegionMinimizer, ByVal Start As DoubleVector, ByVal solution As DoubleVector)

Console.WriteLine("Start: {0}", Start)
Console.WriteLine("Initial Residual: {0}", Minimizer.InitialResidual)
Console.WriteLine("Solution: {0}", solution)
Console.WriteLine("Final Residual: {0}", Minimizer.FinalResidual)
Console.WriteLine("Iterations: {0}", Minimizer.Iterations)
Console.WriteLine("Stopping Criterion: {0}", Minimizer.StopCriterion)
Console.WriteLine()

End Sub

End Module

Encapsulate a function that has three input variables and four output variables
Class MyFunction : Inherits DoubleMultiVariableFunction

Public Sub New()

MyBase.New(3, 4)

End Sub

Public Overrides Sub Evaluate(ByVal X As DoubleVector, ByRef y As DoubleVector)

If (X.Length <> 3 Or y.Length <> 4) Then
Throw New InvalidArgumentException("bad length")
End If

y(0) = 5 * X(1) * X(1) + X(2) * X(2)
y(1) = 4 * X(0) * X(0) - X(2) * X(2) + 45
y(2) = X(0) * 3 * X(0) - X(1) * X(1) + 9
y(3) = y(0) + y(1) + y(2) * y(2) - 43

End Sub

End Class

End Namespace

```
← All NMath Code Examples
Top