Интеграция стандартных программ оптимизации MATLAB с целевыми функциями в Visual Basic

Пример оптимизации

Цель

Этот пример показывает как:

  • Используйте продукт MATLAB® Compiler SDK™, чтобы создать блок (OptimizeComp). Этот блок применяет стандартные программы оптимизации MATLAB к целевым функциям, реализованным, когда.NET возражает.

  • Доступ к компоненту в приложении.NET (OptimizeApp.vb). Затем используйте класс MWObjectArray, чтобы создать ссылку на объект.NET (BananaFunction.vb) и передача, которые возражают против компонента.

    Примечание

    Для получения информации об этих классах преобразования данных см. Справочник по библиотеке классов MWArray MATLAB, доступный в папке matlabroot\help\dotnetbuilder\MWArrayAPI, где matlabroot представляет вашу папку установки MATLAB

  • Создайте и запустите приложение.

Компонент OptimizeComp

Компонент (OptimizeComp) находит локальный минимум целевой функции и возвращает минимальное местоположение и значение. Компонент использует функцию оптимизации MATLAB fminsearch. Этот пример оптимизирует банановую функцию Розенброка, используемую в документации fminsearch.

Класс OptimizeComp.OptimizeClass выполняет неограниченную нелинейную оптимизацию на целевой функции, реализованной как объект.NET. Метод этого класса, doOptim, принимает начальное значение (СЕТЕВОЙ объект), который реализует целевую функцию и возвращает местоположение и значение локального минимума.

Второй метод, displayObj, является средством отладки, которое перечисляет характеристики объекта.NET. Эти два метода, doOptim и displayObj, инкапсулируют функции MATLAB. Код MATLAB для этих двух методов находится в doOptim.m и displayObj.m. Можно найти этот код в matlabroot\toolbox\dotnetbuilder\Examples\VSversion\NET\OptimizeExample\OptimizeVBApp.

Процедура

  1. Если вы уже не сделали так, скопируйте файлы для этого примера можно следующим образом:

    1. Скопируйте следующую папку, которая поставляется с MATLAB к вашей папке работы: matlabroot\toolbox\dotnetbuilder\Examples\VSversion\NET\OptimizeExample

    2. В подсказке команды MATLAB, cd к новой подпапке OptimizeExample в вашей папке работы.

  2. Если вы уже не сделали так, установил переменные окружения, которые требуются на машине разработки.

  3. Запишите код MATLAB, к которому вы хотите получить доступ. Этот пример использует doOptim.m и displayObj.m, который уже находится в вашей папке работы. Путем является matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample\OptimizeComp.

    Для ссылки код doOptim.m отображен здесь:

    function [x,fval] = doOptim(h, x0)
    mWrapper = @(x) h.evaluateFunction(x);
    
    directEval = h.evaluateFunction(x0)
    wrapperEval = mWrapper(x0)
    
    [x,fval] = fminsearch(mWrapper,x0)
    Для ссылки код displayObj.m отображен здесь:
    function className = displayObj(h)
    
    h
    className = class(h)
    whos('h')
    methods(h)

  4. Из галереи приложений MATLAB откройте приложение Library Compiler.

  5. Когда вы компилируете приложение.NET с помощью Library Compiler, используйте следующую информацию:

    Название проектаOptimizeComp
    ClassName OptimizeComp.OptimizeClass
    Файл, чтобы скомпилировать

    doOptim.m displayObj.m

  6. Запишите исходный код для класса (BananaFunction), который реализует объектную функцию, чтобы оптимизировать. Пример приложения для этого примера находится в matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample\OptimizeVBApp. Распечатка программ для BananaFunction.vb отображает следующий код:

    Imports System
    
    Namespace MathWorks.Examples.Optimize
    
        Class BananaFunction
    
    #Region "Methods"
            Public Sub BananaFunction()
            End Sub
    
            Public Function evaluateFunction(ByVal x As Double()) As Double
    
                Dim term1 As Double = 100 * Math.Pow((x(1) - Math.Pow(x(0), 
                                                                 2.0)), 2.0)
                Dim term2 As Double = Math.Pow((1 - x(0)), 2.0)
                Return term1 + term2
            End Function
    #End Region
    
        End Class
    End Namespace
    
    
    
    Класс реализует банановую функцию Розенброка, описанную в документации fminsearch.

  7. Настройте приложение с помощью Визуального Studio®.NET с помощью папки OptimizeVBApp, которая содержит файл проекта Visual Studio.NET для этого примера.

    1. Папка OptimizeVBApp содержит файл проекта Visual Studio.NET для этого примера. Откройте проект в Visual Studio.NET путем двойного клика по OptimizeVBApp.vbproj в Проводнике Windows®. Можно также открыть его с рабочего стола путем щелчка правой кнопкой по OptimizeVBApp.vbproj> Open Outside MATLAB.

    2. Добавьте ссылку на компонент MWArray, который является matlabroot\toolbox\dotnetbuilder\bin\architecture\framework_version\mwarray.dll.

    3. При необходимости добавьте (или зафиксируйте местоположение), ссылка на компонент OptimizeComp, который вы создали на предыдущем шаге. (Компонент, OptimizeComp.dll, находится в подпапке \OptimizeExample\OptimizeComp\x86\V2.0\Debug\distrib вашей рабочей области.)

Когда запущено успешно, программа отображает следующий вывод:

Using initial points= -1.2000 1


*****************************************************
**            Properties of .NET Object            **
*****************************************************

h =

  MathWorks.Examples.Optimize.BananaFunction handle w
      ith no properties.
  Package: MathWorks.Examples.Optimize




className =

MathWorks.Examples.Optimize.BananaFunction


  Name  Size   Bytes  Class          Attributes

  h     1x1    60   MathWorks.Examples.Optimize.BananaFunction



Methods for class MathWorks.Examples.Optimize.BananaFunction:

BananaFunction    addlistener       findprop          lt
Equals            delete            ge                ne
GetHashCode       eq                gt                notify
GetType           evaluateFunction  isvalid
ToString          findobj           le


**************** Finished displayObj ****************


*****************************************************
** Performing unconstrained nonlinear optimization **
*****************************************************

directEval =

   24.2000



wrapperEval =

   24.2000



x =

    1.0000    1.0000



fval =

  8.1777e-010


***************** Finished doOptim ******************


Location of minimum: 1.0000    1.0000
Function value at minimum: 8.1777e-010