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