输出函数,具体问题具体分析优化
这个例子展示了如何使用一个输出函数迭代的情节和存储历史一个非线性问题。这段历史包括评估点,解算器使用的搜索方向,产生点,在评估和目标函数值点。
solver-based方法的这个例子中,看到的输出函数优化工具箱。
情节函数有相同的语法作为输出函数,所以这个例子也适用于情节的功能。
solver-based方法和具体问题具体分析的方法,根据solver-based写输出函数的方法。在solver-based方法中,您使用一个向量变量,通常表示x
,而不是一个不同大小的优化变量的集合。所以写一个输出函数的具体问题具体分析的方法,你必须理解之间的对应关系和单一solver-based优化变量x
。优化变量之间的映射x
,使用varindex
。在这个例子中,与一个优化变量命名为避免混淆x
,使用“在“
作为向量变量名称。
问题描述
问题是最小化以下变量的函数x
和y
:
此外,这个问题有两个非线性约束:
具体问题具体分析设置
建立问题的具体问题具体分析的方法,定义优化变量和一个优化问题对象。
x = optimvar (“x”);y = optimvar (“y”);概率= optimproblem;
目标函数定义为一个表达式的优化变量。
f = exp (x) * (4 * x ^ 2 + y ^ 2 * 2 + 4 * x * y + 2 * y + 1);
包括目标函数概率
。
概率。目标= f;
包括非线性约束条件,建立优化约束表达式。
cons1 x * y = x + y - > = 1.5;cons2 = x * y > = -10;prob.Constraints。cons1 = cons1;prob.Constraints。cons2 = cons2;
因为这是一个非线性问题,必须包括一个初始点结构x0
。使用x0。x=–1
和x0。y=1
。
x0。x=- - - - - -1; x0.y = 1;
输出函数
的outfun
输出函数生成的点的历史记录fmincon
在迭代。输出函数也情节点并保持一个单独的搜索方向的历史sqp
算法。以前的搜索方向是一个矢量点到下一个点fmincon
尝试。在最后一步,输出函数在工作空间变量,保存历史和保存历史在每个迭代的目标函数值的步骤。
优化输出所需的语法的功能,看看输出函数和情节函数的语法。
一个输出函数接受一个变量作为输入向量。但目前的问题有两个变量。找到优化变量和输入变量之间的映射,使用varindex
。
idx = varindex(概率);idx.x
ans = 1
idx.y
ans = 2
映射显示x
变量1和y
是变量2。因此,如果输入变量命名在
,然后x = (1)
和y = (2)
。
类型outfun
函数停止= outfun (optimValues,状态,idx)持续的历史searchdir fhistory停止= false;开关状态情况下“init”等历史= [];fhistory = [];searchdir = [];案例的iter %连接当前点和目标函数%与历史价值。必须是一个行向量。fhistory = [fhistory;optimValues.fval];历史=[历史;(:)的]; % Ensure in is a row vector % Concatenate current search direction with % searchdir. searchdir = [searchdir;... optimValues.searchdirection(:)']; plot(in(idx.x),in(idx.y),'o'); % Label points with iteration number and add title. % Add .15 to idx.x to separate label from plotted 'o' text(in(idx.x)+.15,in(idx.y),... num2str(optimValues.iteration)); title('Sequence of Points Computed by fmincon'); case 'done' hold off assignin('base','optimhistory',history); assignin('base','searchdirhistory',searchdir); assignin('base','functionhistory',fhistory); otherwise end end
包括输出函数的优化设置OutputFcn
选择。同时,设置算法
选择使用“sqp”
而不是默认的算法“内点”
算法。通过idx
输出函数作为一个额外的参数输入。看到传递额外的参数。
outputfn = @ (optimValues,状态)outfun (optimValues,状态,idx);选择= optimoptions (“fmincon”,“算法”,“sqp”,“OutputFcn”,outputfn);
运行优化使用输出函数
运行优化,包括输出函数,通过使用“选项”
名称-值对的论点。
[溶胶,fval eflag、输出]=解决(x0,概率“选项”选择)
使用fmincon解决问题。
局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:x: -9.5474 y: 1.0474
fval = 0.0236
eflag = OptimalSolution
输出=结构体字段:迭代:10 funcCount: 22算法:“sqp”的信息:“局部最小值发现,满足约束....“constrviolation: 0 stepsize: 1.4785 e-07 lssteplength: 1 firstorderopt: 7.1930平台以及bestfeasible: [1 x1 struct] objectivederivative:“reverse-AD”constraintderivative:“封闭”解算器:“fmincon”
检查迭代的历史。的每一行optimhistory
矩阵表示一个点。过去的几个点很近,这也解释了为什么绘制序列显示了分叠覆数字8,9,10。
disp (“位置”);disp (optimhistory)
位置-1.0000 1.0000 -1.3679 1.2500 -1.6509 1.1813 -3.5870 2.0537 -4.4574 2.2895 -5.8015 1.5531 -7.6498 1.1225 -8.5223 1.0572 -9.5463 1.0464 -9.5474 1.0474 -9.5474 1.0474
检查searchdirhistory
和functionhistory
数组。
disp (的搜索方向);disp (searchdirhistory)
搜索方向0 0 -0.3679 0.2500 -0.2831 -0.0687 -1.9360 0.8725 -0.8704 0.2358 -1.3441 -0.7364 -2.0877 -0.6493 -0.8725 -0.0653 -1.0241 -0.0108 -0.0011 0.0010 0.0000 -0.0000
disp (的函数值);disp (functionhistory)
函数值1.8394 1.8513 1.7757 0.9839 0.6343 0.3250 0.0978 0.0517 0.0236 0.0236 0.0236
不支金宝app持的功能要求fcn2optimexpr
如果你的目标函数或非线性约束函数不是初等函数组成的,你必须把使用优化的函数表达式fcn2optimexpr
。看到将非线性函数优化表达式。对于本例,您将输入以下代码:
有趣= @ (x, y) exp (x) * (4 * x ^ 2 + y ^ 2 * 2 + 4 * x * y + 2 * y + 1);f = fcn2optimexpr(有趣,x, y);
支持的功能列表,请参阅金宝app金宝app支持操作优化变量和表达式。