将 MATLAB 优化程序与目标函数集成
概述
此示例向您说明如何创建一个 .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 函数位置 | |
| C# 代码位置 | |
| Visual Basic 代码位置 | |
| MWArray API 参考位置 | |
过程
将 MATLAB 附带的以下文件夹复制到您的工作文件夹:
matlabroot\toolbox\dotnetbuilder\Examples\VSVersion\NET\OptimizeExample在 MATLAB 命令提示符下,导航到工作文件夹中的新
OptimizeExample\OptimizeComp子文件夹。检查您想要访问的 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)
使用以下信息,使用 .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 应用程序中的说明。
确定是否使用 C# 还是 Visual Basic 来访问组件。
C#
如果您使用 C#,请为实现对象函数的类编写源代码以进行优化。
本示例的示例应用程序位于
OptimizeExample\OptimizeCSApp\BananaFunction.csVisual Basic
如果您使用的是 Visual Basic,请为实现对象函数的类编写源代码以进行优化。
此示例的示例应用程序位于
OptimizeExample\OptimizeVBApp\BananaFunction.vb中。
BananaFunction类实现了fminsearch文档中描述的 Rosenbrock banana 函数。使用 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 外部打开从桌面打开它。
添加对您的程序集文件
OptimizeComp.dll的引用。添加对
MWArrayAPI 的引用。如果您的系统上安装了 MATLAB matlabroot\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dll如果您的系统上安装了 MATLAB Runtime <MATLAB_RUNTIME_INSTALL_DIR>\toolbox\dotnetbuilder\bin\win64\<framework_version>\MWArray.dll在 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
