利用模式搜索对目标函数进行编码和最小化
这个例子展示了如何使用模式搜索创建和最小化目标函数。
目标函数
对于这个问题,最小化的目标函数是一个简单的二维变量函数x
.
simple_objective (x) = (4 - 2.1 * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x (1) * (2) + (4 + 4 * x (2) ^ 2) * x (2) ^ 2;
这个函数被称为“凸轮”,如L.C.W. Dixon和G.P. Szego[1]中所描述的那样。
编码目标函数
创建一个MATLAB®文件simple_objective.m
包含以下代码:
类型simple_objective
版权所有2004 The MathWorks, Inc. x1 = x(1);X2 = x(2);y = (4 - 2.1 * x1。^ 2 + x1。^ 4. / 3)。* x1。^ 2 + x1。* x2 + (4 + 4 * x2。^ 2)。* x2。^ 2;
求解器,比如patternsearch
接受单个输入x
,在那里x
问题中有多少变量就有多少元素。目标函数计算目标函数的标量值,并在其单个输出参数中返回它y
.
尽量减少使用patternsearch
将目标函数指定为函数句柄。
ObjectiveFunction = @simple_objective;
为求解器指定一个初始点。
X0 = [0.5 0.5];%起点
调用求解器,请求最优点x
和最优点的函数值fval
.
[x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
尽量减少使用额外参数
有时你的目标函数有额外的参数,在优化过程中充当常数。例如,在simple_objective
,您可能希望将常数4、2.1和4指定为变量参数,以创建一系列目标函数。
重写simple_objective
要获取三个额外参数(p1
,p2
,p3
),在优化过程中充当常量(它们不会作为最小化的一部分而变化)。实现目标函数的计算,MATLAB文件parameterized_objective.m
包含以下代码:
类型parameterized_objective
function y = parameterized_objective(x,p1,p2,p3) % parameterized_objective用于PATTERNSEARCH求解器的目标函数%版权所有2004 The MathWorks, Inc. x1 = x(1);X2 = x(2);y = (p1-p2 * x1。^ 2 + x1。^ 4. / 3)。* x1。^ 2 + x1。* x2 + (p3 + p3。* x2。^ 2)。* x2。^ 2;
patternsearch
只使用一个参数调用目标函数x
,但参数化目标函数有四个参数:x
,p1
,p2
,p3
.使用匿名函数捕获附加参数的值p1
,p2
,p3
.创建一个函数句柄ObjectiveFunction
到接受一个输入的匿名函数x
,但电话parameterized_objective
与x
,p1
,p2
,p3
.创建函数句柄时ObjectiveFunction
,变量p1
,p2
,p3
具有存储在匿名函数中的值。详细信息请参见传递额外参数.
P1 = 4;P2 = 2.1;P3 = 4;定义常数值ObjectiveFunction = @(x) parameterized_objective(x,p1,p2,p3);[x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
向量化目标函数
默认情况下,patternsearch
每次向目标函数传递一个点。有时,你可以加快求解器的速度vectorizing目标函数取一组点并返回一组函数值。
例如,求解器要在对目标函数的一次调用中计算5个点的集合,求解器在大小为5 × 2的矩阵上调用目标(其中2是变量的数量)。详细信息请参见向量化目标函数和约束函数.
去向parameterized_objective
,使用以下代码:
类型vectorized_objective
function y = vectorized_objective(x,p1,p2,p3) % vectorized_objective用于PATTERNSEARCH求解器的目标函数%版权所有2004-2018 The MathWorks, Inc. x1 = x(:,1);% x x2 = x(:,2)的第一列;Y = (p1 - p2.*x1。²+ x1。^4./3).*x1.^2 + x1.*x2 + (-p3 + p3.*x2.^2).*x2.^2;
这个目标函数的矢量化版本需要一个矩阵x
用任意数量的点(的行)x
)并返回一个列向量y
的行数是多少x
.
若要利用向量化目标函数,请设置UseVectorized
选项真正的
和UseCompletePoll
选项真正的
.patternsearch
需要这两个选项以向量化的方式进行计算。
选项= optimoptions(@patternsearch,“UseVectorized”,真的,“UseCompletePoll”,真正的);
指定目标函数并调用patternsearch
,包括选项
论点。使用抽搐/ toc
计算求解时间。
ObjectiveFunction = @(x) vectorized_objective(x,4,2.1,4);抽搐[x, fval] = patternsearch (x0 ObjectiveFunction ,[],[],[],[],[],[],[], 选项)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
toc
运行时间为0.027503秒。
计算非向量化的求解时间进行比较。
tic [x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
toc
运行时间为0.027502秒。
在这种情况下,向量化对求解时间没有显著影响。
参考文献
[1]迪克森,l.c.w, g.p。Szego (eds)。朝向全局优化2。北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978年。