主要内容

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

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

R2026b

概述

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

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

  • 使用 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 对象特征的调试工具。doOptim 和 displayObj 这两个方法封装了 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.m 和 displayObj.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');

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

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

    • C#

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

      本示例的示例应用程序位于 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;
              }
      	  }
      }
      
    • Visual Basic

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

      此示例的示例应用程序位于 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
      

    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

另请参阅

主题