[TOC]
Imports System
Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Analysis
Namespace CenterSpace.NMath.Analysis.Examples.VisualBasic
' A .NET example in VB.NET showing how to use the multivariable minimizer.
Module MultiVariableMinimizationExample
Private Function df0(ByVal X As DoubleVector) As Double
Return 1.6 * Math.Pow(X(0), 3)
End Function
Private Function df1(ByVal X As DoubleVector) As Double
Return 0.1 * Math.Cos(X(1))
End Function
Private Function df2(ByVal X As DoubleVector) As Double
Return 10 * X(2)
End Function
Private Function df3(ByVal X As DoubleVector) As Double
Return 16 * Math.Pow(X(3), 3)
End Function
Private Function F(ByVal x As DoubleVector) As Double
Return 0.4 * Math.Pow(x(0), 4) + 0.1 * Math.Sin(x(1)) + 5 * x(2) * x(2) + 4 * Math.Pow(x(3), 4)
End Function
' A .NET example in VB.NET showing how to find a minimum of a multivariate function.
Sub Main()
' Create a multivariable function.
Dim D As NMathFunctions.DoubleVectorDoubleFunction = AddressOf F
Dim Func As New MultiVariableFunction(D)
' Start at ( 0, 0, 0, 0 ).
Dim StartPoint As New DoubleVector(0.0, 0.0, 0.0, 0.0)
' Create a DownhillSimplexMinimizer with the default error tolerance and maximum
' iterations.
Dim Simplex As New DownhillSimplexMinimizer
' Minimize the function.
Dim Min As DoubleVector = Simplex.Minimize(Func, StartPoint)
Console.WriteLine("DownhillSimplexMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString() & ".")
If (Simplex.ToleranceMet) Then
' Error is less than desired tolerance
Console.Write("Error of " & Simplex.Error & " is within tolerance of ")
Console.WriteLine(Simplex.Tolerance & ".")
Else
' Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
' Increase the maximum number of iterations from the default of 100 to 1000.
Simplex.MaxIterations = 1000
' Minimize the function.
Min = Simplex.Minimize(Func, StartPoint)
Console.WriteLine("DownhillSimplexMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString() & ".")
If (Simplex.ToleranceMet) Then
' Error is less than desired tolerance
Console.Write("Error of " & Simplex.Error & " is within tolerance of ")
Console.WriteLine(Simplex.Tolerance & ".")
Else
' Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
' Now try using Powell's Method.
' Create the minimizer with default error tolerance and default maximum iterations.
Dim Powell As New PowellMinimizer
' Perform the minimization.
Min = Powell.Minimize(Func, StartPoint)
Console.WriteLine("PowellMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString() & ".")
If (Powell.ToleranceMet) Then
' Error is less than desired tolerance
Console.Write("Error of " & Powell.Error & " is within tolerance of ")
Console.WriteLine(Powell.Tolerance & ".")
Else
' Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
' If the derivatives are known, then use one of the IMultiVariableDMinimizer
' classes such as ConjugateGradientMinimizer.
' Create an array of partial derivatives
Dim Partials(3) As MultiVariableFunction
Partials(0) = New MultiVariableFunction(New NMathFunctions.DoubleVectorDoubleFunction(AddressOf df0))
Partials(1) = New MultiVariableFunction(New NMathFunctions.DoubleVectorDoubleFunction(AddressOf df1))
Partials(2) = New MultiVariableFunction(New NMathFunctions.DoubleVectorDoubleFunction(AddressOf df2))
Partials(3) = New MultiVariableFunction(New NMathFunctions.DoubleVectorDoubleFunction(AddressOf df3))
' Create the minimizer with default tolerance and default maximum iterations.
Dim CG As New ConjugateGradientMinimizer
' Perform the minimization.
StartPoint = New DoubleVector(1.0, 2.0, 3.0, 4.0)
Min = CG.Minimize(Func, Partials, StartPoint)
Console.WriteLine("ConjugateGradientMinimizer found a minimum of " & Func.Evaluate(Min))
Console.WriteLine("at " & Min.ToString() & ".")
If (CG.ToleranceMet) Then
' Error is less than desired tolerance
Console.Write("Error of " & CG.Error & " is within tolerance of ")
Console.WriteLine(CG.Tolerance & ".")
Else
' Minimization ended because maximum iterations was reached
Console.WriteLine("Ended with maximum iterations.")
End If
Console.WriteLine()
Console.WriteLine()
Console.WriteLine("Press Enter Key")
Console.Read()
End Sub
End Module
End Namespace
[TOC]