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