主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MATLAB 优化程序与目标函数集成

概述

此示例向您说明如何创建一个 .NET 应用程序,使用 MATLAB® 优化函数 fminsearchMWObjectArray 类来查找目标函数的局部最小值。

在此示例中,您执行以下步骤:

  • 使用 MATLAB Compiler SDK™ 产品创建一个程序集 (OptimizeComp)。该程序集将 MATLAB 优化程序应用于作为 .NET 对象实现的目标函数。

  • 在 C# 应用程序 (OptimizeApp.cs) 或 Visual Basic® 应用程序 (OptimizeApp.vb) 中访问该组件。

  • 使用 MWObjectArray 类通过 C# (BananaFunction.cs) 或 Visual Basic (BananaFunction.vb) 创建对 .NET 对象的引用,并将该对象传递给组件。

  • 使用 Visual Studio® .NET 开发环境构建并运行应用程序。

OptimizeComp 应用程序

OptimizeComp 应用程序找到目标函数的局部最小值并返回最小位置和值。该组件使用 MATLAB 优化函数 fminsearch。此示例优化了 fminsearch 文档中使用的 Rosenbrock banana 函数。

OptimizeComp.OptimizeClass 类对作为 .NET 对象实现的目标函数执行无约束非线性优化。此类的方法 doOptim 接受实现目标函数的初始值(NET 对象),并返回局部最小值的位置和值。

第二种方法 displayObj 是一个列出 .NET 对象特征的调试工具。doOptimdisplayObj 这两个方法封装了 MATLAB 函数。

文件

MATLAB 函数doOptim.m
displayObj.m
MATLAB 函数位置matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample\OptimizeComp
C# 代码位置matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample\OptimizeCSApp\BananaFunction.cs
Visual Basic 代码位置matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample\OptimizeVBApp\BananaFunction.vb
MWArray API 参考位置matlabroot\help\dotnetbuilder\MWArrayAPI

过程

  1. 将 MATLAB 附带的以下文件夹复制到您的工作文件夹:
    matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample

    在 MATLAB 命令提示符下,导航到工作文件夹中的新 OptimizeExample\OptimizeComp 子文件夹。

  2. 检查您想要访问的 MATLAB 代码。此示例使用 doOptim.mdisplayObj.m

    function [x,fval] = doOptim(h, x0)
    mWrapper = @(x) h.evaluateFunction(x);
    
    directEval = h.evaluateFunction(x0)
    wrapperEval = mWrapper(x0)
    
    [x,fval] = fminsearch(mWrapper,x0)
    function className = displayObj(h)
    
    h
    className = class(h)
    whos('h')
    methods(h)

  3. 使用以下信息,使用 .NET 程序集编译器compiler.build.dotNETAssembly 构建 .NET 组件:

    字段
    库名称OptimizeComp
    类名OptimizeComp.OptimizeClass
    要编译的文件doOptim.m
    displayObj.m

    例如,如果您使用的是 compiler.build.dotNETAssembly,请输入:

    buildResults = compiler.build.dotNETAssembly(["doOptim.m","displayObj.m"], ...
    'AssemblyName','OptimizeComp', ...
    'ClassName','OptimizeComp.OptimizeClass');

    有关详细信息,请参阅生成 .NET 程序集并编译 .NET 应用程序中的说明。

  4. 确定是否使用 C# 还是 Visual Basic 来访问组件。

    • C#

      如果您使用 C#,请为实现对象函数的类编写源代码以进行优化。

      本示例的示例应用程序位于 OptimizeExample\OptimizeCSApp\BananaFunction.cs

       BananaFunction.cs

    • Visual Basic

      如果您使用的是 Visual Basic,请为实现对象函数的类编写源代码以进行优化。

      此示例的示例应用程序位于 OptimizeExample\OptimizeVBApp\BananaFunction.vb 中。

       BananaFunction.vb

    BananaFunction 类实现了 fminsearch 文档中描述的 Rosenbrock banana 函数。

  5. 使用 Visual Studio 打开与您的应用程序语言相对应的 .NET 工程文件。

    • C#

      如果您使用的是 C#,则 OptimizeCSApp 文件夹包含此示例的 Visual Studio .NET 工程文件。在 Windows® 资源管理器中双击 OptimizeCSApp.csproj 在 Visual Studio .NET 中打开该工程。您也可以通过右键点击 OptimizeCSApp.csproj 并选择在 MATLAB 外部打开从桌面打开它。

    • Visual Basic

      如果您使用的是 Visual Basic,则 OptimizeVBApp 文件夹包含此示例的 Visual Studio .NET 工程文件。在 Windows 资源管理器中双击 OptimizeVBApp.vbproj 在 Visual Studio .NET 中打开该工程。您也可以通过右键点击 OptimizeVBApp.vbproj 并选择在 MATLAB 外部打开从桌面打开它。

  6. 添加对您的程序集文件 OptimizeComp.dll 的引用。

  7. 添加对 MWArray API 的引用。

    如果您的系统上安装了 MATLABmatlabroot\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dll
    如果您的系统上安装了 MATLAB Runtime<MATLAB_RUNTIME_INSTALL_DIR>\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dll

  8. 在 Visual Studio .NET 中构建并运行 OptimizeApp 应用程序。

该程序显示以下输出:

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

另请参阅

主题