这个示例展示了如何使用模式搜索创建和最小化目标函数。
对于这个问题,要最小化的目标函数是一个二维变量的简单函数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]所描述的,这个功能被称为“cam”。
创建一个MATLAB文件名为simple_objective.m
包含以下代码:
类型simple_objective
function y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有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 (x0 ObjectiveFunction)
优化终止:网格尺寸小于选项。网格公差。
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
函数y = parameterized_objective(x,p1,p2,p3) % parameterized_objective目标函数for PATTERNSEARCH solver % Copyright 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;定义常量值@(x) parameterized_objective(x,p1,p2,p3);[x, fval] = patternsearch (x0 ObjectiveFunction)
优化终止:网格尺寸小于选项。网格公差。
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目标函数% x x2的第一列= x(:,2);Y = (p1 - p2.*x1。^ 2 + 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
评估解决时间。
@(x) vectorized_objective(x,4,2.1,4);抽搐[x, fval] = patternsearch (x0 ObjectiveFunction ,[],[],[],[],[],[],[], 选项)
优化终止:网格尺寸小于选项。网格公差。
x =1×2-0.0898 - 0.7127
fval = -1.0316
toc
运行时间为0.027503秒。
评估非向量化解的时间以进行比较。
tic [x,fval] = parent_id (parent_id, parent_id) = parent_id (parent_id, parent_id)
优化终止:网格尺寸小于选项。网格公差。
x =1×2-0.0898 - 0.7127
fval = -1.0316
toc
运行时间为0.027502秒。
在这种情况下,向量化对解决方案的时间没有显著影响。
L. C. W.迪克森和G . p。Szego (eds)。面向全局优化北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978。