exponenta event banner

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

Цель

В этом примере показано, как:

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

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

    Примечание

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

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

Комплектующий

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

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

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

Процедура

  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 откройте приложение Компилятор библиотеки.

  5. При компиляции приложения .NET с помощью компилятора библиотеки используйте следующую информацию:

    Название проектаOptimizeComp
    Имя классаOptimizeComp.OptimizeClass
    Файл для компиляцииdoOptim.m
    displayObj.m

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

    using System;
    
    namespace MathWorks.Examples.Optimize
    {
      public class BananaFunction 
        {
    	    public BananaFunction() {}
    
    	    public double evaluateFunction(double[] x)
    	      {
    		      double term1= 100*Math.Pow((x[1]-Math.Pow(x[0],2.0)),2.0); 
    		      double term2=  Math.Pow((1-x[0]),2.0);
    		      return term1+term2;
            }
    	  }
    }
    
    Класс реализует функцию банана Розенброк, описанную в fminsearch документация.

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

    1. . Откройте проект в Visual Studio .NET, дважды щелкнув OptimizeCSApp.csproj в Проводнике Windows ®. Его также можно открыть с рабочего стола, щелкнув правой кнопкой мыши по команде «Открыть вне 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 
             with 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