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")
      Console.Read()

    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