# VB Trust Region Minimization Example

← All NMath Code Examples

Imports System

Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Analysis

Namespace CenterSpace.NMath.Analysis.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
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