使用约束最小化patternsearch
而且优化
实时编辑任务
这个例子展示了如何解决一个约束最小化问题使用优化Live Editor任务,它提供了一种可视化方法,以及命令行。
问题描述
这个问题涉及到在最小化非线性函数时使用线性和非线性约束patternsearch
.目标函数为
在哪里
H = [36 17 19 12 8 15;17 33 18 11 7 14;19 18 43 13 8 16;12 11 13 18 6 11;8 7 8 6 9 8;15 14 16 11 8 29];F = [20 15 21 18 29 24]';F = @(x)0.5*x'*H*x + F '*x;
线性约束是
在哪里
A = [-8 7 3 -4 9 0];B = 7;Aeq = [7 1 8 3 3 3;5 0 -5 1 -5 8;-2 -6 7 1 1 9;1 -1 2 -2 3 -3];Beq = [84 62 65 1]';
输入前面的代码部分,在继续之前将问题变量放入工作区。
解决使用patternsearch
在优化实时编辑任务
控件创建一个新的活动脚本新的实时脚本按钮。文件章节首页选项卡。
插入一个优化实时编辑器任务。单击插入TAB,然后在代码部分中,选择任务>优化.
指定问题类型
在指定问题类型部分的任务,单击目标>非线性按钮。
单击约束>线性不等式而且线性平等按钮。
选择Solver > patternsearch -模式搜索.
选择问题数据
中输入问题变量选择问题数据部分任务。若要指定目标函数,请选择目标函数>函数句柄并选择F.
将不等式约束设置为
一个
而且b
.将相等约束设置为Aeq
而且说真的
.要设置初始点,首先需要在任务上方创建一个新部分。为此,单击节休息按钮。插入选项卡。在任务上面的新部分中,为初始点输入以下代码。
X0 = [2 1 0 9 1 0]';
运行该部分到指定位置
x0
进入工作区。要运行该部分,请将光标放在该部分并按下按Ctrl + Enter或单击行号左侧的蓝色条纹条。在选择问题数据部分任务,设置
x0
作为起始点。指定求解器选项
因为这个问题是线性约束的,所以指定一个额外的求解器选项。扩大指定求解器选项部分的任务,然后单击添加按钮。设置问卷调查设置>问卷调查方式来
GSSPositiveBasis2N
.有关线性约束问题的GSS轮询方法的效率的更多信息,请参见比较投票选项的效率.设置显示选项
在显示进度部分的任务,选择最好的价值而且筛孔尺寸图功能。
你的设置是这样的:
运行求解器并检查结果
要运行求解器,请单击选项按钮⁝在任务窗口的右上方,并选择运行部分.
图显示在单独的图形窗口和任务输出区域中。
要获得解点和解处的目标函数值,请查看任务的顶部。
的
优化
活动编辑器任务在名为解决方案
并将目标函数值返回到名为objectiveValue
.通过在任务下面的部分中输入以下代码,然后运行该部分,或在MATLAB中输入代码,可以查看这些值®命令行。disp(解决方案)
8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812
disp (objectiveValue)
1.9195 e + 03
包含非线性约束
将以下非线性约束添加到问题中。
要包含这些约束,首先单击约束>非线性按钮。
在选择问题数据节,在约束中,选择局部函数然后点击新按钮。该函数出现在任务下面的新部分中。编辑结果代码以包含以下行。
函数测查[c] = double_ineq c (x) = (-1.5 + x (1) * (2) + x (1) - (2);-x(1)*x(2) - 10];Ceq = [];结束
在非线性约束部分,选择double_ineq.
非线性约束算法导致
patternsearch
做很多函数的求值。在指定求解器选项部分中,单击当前选项右侧的加号以显示其他选项。然后将最大函数求值极限增加到5e4。再次运行任务以重新运行优化。
查看解和目标函数值。
disp(解决方案)
7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457
disp (objectiveValue)
2.4018 e + 03
目标函数值大于无非线性约束时的目标函数值。前面的解在非线性约束下是不可行的。
由于非线性约束算法的改变,图中的迭代次数比以前少了很多patternsearch
算法包含另一个外循环来解决修改后的问题。外部循环减少了在每个主要迭代中对问题的修改。在这种情况下,算法只进行四次外部迭代。具体算法请参见非线性约束求解算法.
解决使用patternsearch
在命令行
要在命令行上解决原来的问题(只有线性约束),请执行以下代码。
X0 = [2 1 0 9 1 0]';选项= optimoptions(“patternsearch”,...“PollMethod”,“GSSPositiveBasis2N”,...“PlotFcn”, {“psplotbestf”,“psplotmeshsize”});Lb = [];Ub = [];Nonlcon = [];[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
优化终止:网格尺寸小于options.MeshTolerance。X = 8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812 fval = 1.9195e+03
patternsearch
控件中显示的第一对图优化Live Editor任务示例。
要包含非线性约束,请将以下代码保存到名为double_ineq.m
在MATLAB路径上。
函数测查[c] = double_ineq c (x) = (-1.5 + x (1) * (2) + x (1) - (2);-x(1)*x(2) - 10];Ceq = [];结束
为了允许求解器在非线性约束下运行完成,增加函数计算的允许数量。
选项。maxfunctionassessments = 5e4;
解决包含非线性约束的问题。
Nonlcon = @double_ineq;[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
优化终止:网格尺寸小于选项。MeshTolerance和约束违反小于options. constraintolerance。X = 7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457 fval = 2.4018e+03
patternsearch
方法中所示的第二对图优化Live Editor任务示例。
这两个优化Live Editor任务和命令行允许您制定和解决问题,它们给出相同的结果。命令行更加简化,但在选择求解器、设置问题和选择绘图函数等选项方面提供的帮助较少。您还可以使用优化,然后生成用于命令行使用的代码,如使用优化实时编辑器任务或求解器的约束非线性问题.