的fmincon
内点
和trust-region-reflective
算法,fminunc
信赖域
算法可以解决Hessian稠密但结构化的问题。对于这些问题,fmincon
和fminunc
不计算H * Y在黑森H直接,因为形成H将内存密集型。相反,你必须提供fmincon
或fminunc
有一个函数,给定一个矩阵Y和信息H,计算W=H * Y.
在这个例子中,目标函数是非线性的,并且存在线性等式fmincon
使用。该描述适用于信任区域反射算法;的fminunc
信赖域
算法是相似的。关于内点算法,见HessianMultiplyFcn
选项黑森乘法函数.目标函数具有结构
在哪里V是一个1000 × 2矩阵。的黑森f是稠密的,但是 是稀疏的。如果黑森人 是 ,然后H的黑森人f,是
以避免由于使用H直接地,这个例子提供了一个Hessian乘法函数,hmfleq1
.这个函数,当传递一个矩阵Y
,使用稀疏矩阵Hinfo
,对应于
,V
来计算Hessian矩阵乘积
W = H*Y = (Hinfo - V*V')*Y
在这个例子中,Hessian乘法函数需要
和V
来计算Hessian矩阵乘积。V
是常数,所以你可以捕捉V
在一个匿名函数句柄中。
然而,
不是一个常数,必须在当前计算x
.你可以通过计算来做到这一点
在目标函数和返回
作为Hinfo
在第三个输出参数。通过使用optimoptions
设置“海赛”
选项“上”
,fmincon
知道如何得到Hinfo
,并将其传递给Hessian乘法函数hmfleq1
.
通过的例子brownvv
来fmincon
作为目标函数。的brownvv.m
文件很长,不包括在这里。您可以使用该命令查看代码
类型brownvv
因为brownvv
计算梯度和目标函数,示例(步骤3)使用optimoptions
设置SpecifyObjectiveGradient
选项真正的
.
现在,定义一个函数hmfleq1
使用Hinfo
,计算为brownvv
,V
,您可以在一个匿名函数的函数句柄中捕获它,以计算Hessian矩阵乘积W
在哪里W = H*Y = (Hinfo - V*V')*Y
.这个函数必须有形式
W = hmfleq1 (Hinfo, Y)
第一个参数必须与目标函数返回的第三个参数相同brownvv
.海森乘法函数的第二个参数是矩阵Y
(W = H * Y
).
因为fmincon
期望第二个参数Y
用来形成海森矩阵乘积,Y
总是一个矩阵n
行n
是问题的维度数。列数Y
可能是不同的。最后,您可以使用匿名函数的函数句柄来捕获V,因此V可以作为第三个参数“hmfleqq”
.
函数W = hmfleq1(Hinfo,Y,V);用于BROWNVV目标的hessian矩阵积函数。% W = hmfleq1(Hinfo,Y,V)计算W = (Hinfo-V*V')*Y %其中Hinfo是由BROWNVV %计算的稀疏矩阵,V是一个2列矩阵。W = Hinfo*Y - V*(V'*Y);
请注意
这个函数hmfleq1
可在optimdemos
文件夹,hmfleq1.m
.
加载问题参数,V
,稀疏等式约束矩阵,Aeq
和说真的
,从fleq1.mat
,可在optimdemos
文件夹中。使用optimoptions
设置SpecifyObjectiveGradient
选项真正的
要设置HessianMultiplyFcn
选项指向的函数句柄hmfleq1
.调用fmincon
与目标函数brownvv
和V
作为附加参数:
runfleq1演示了FMINCON的'HessMult'选项和线性%等式。问题=负载(“fleq1”);% Get V, Aeq, beq V = problem.V;Aeq = problem.Aeq;说真的= problem.beq;n = 1000;%问题维度xstart = -ones(n,1);xstart (2:2: n, 1) = 1(长度(2:2:n), 1);% start point options = optimoptions(@fmincon,…)“算法”、“trust-region-reflective’,…… 'SpecifyObjectiveGradient',true, ... 'HessianMultiplyFcn',@(Hinfo,Y)hmfleq1(Hinfo,Y,V),... 'Display','iter',... 'OptimalityTolerance',1e-9,... 'FunctionTolerance',1e-9); [x,fval,exitflag,output] = fmincon(@(x)brownvv(x,V),xstart,[],[],Aeq,beq,[],[], ... [],options);
要运行上述代码,输入
(fval、exitflag、输出,x) = runfleq1;
因为迭代显示是使用optimoptions
,此命令生成以下迭代显示:
规范一阶迭代f (x)最优步CG-iterations 0 2297.63 1.41 e + 03 1 1084.59 1084.59 6.3903 578 1 2 100 578 3 3 1084.59 25 578 0 4 1084.59 - 6.25 578 0 5 1047.61 1.5625 240 0 6 761.592 3.125 62.4 2 7 8 746.478 1.5625 761.592 6.25 62.4 163 0 9 10 274.311 6.25 26.9 546.578 3.125 84.1 2 2 11 55.6193 - 11.6597 40 2 12 55.6193 25 40 3 130 14 -49.516 - 6.25 78 22.2964 6.25 26.3 -93.2772 - 1.5625 68 1 16 17 -434.162 6.25 70.7 -207.204 3.125 86.5 1 1 18 19 -681.359 6.25 43.7 -681.359 6.25 43.7 2 4 191 0 21日-723.959 - 3.125 -698.041 - 1.5625 256 7 22 -751.33 - 0.78125 154 3 23 24 -820.831 2.51937 6.11 -793.974 1.5625 24.4 3 3 25 26 -823.237 0.196753 0.486 -823.069 0.562132 2.87 3 3 278 31 -823.246 0.00126471 0.00268 932 -823.246 0.00149326 0.00521 9 33 -823.246 0.000373314 0.00091局部最小可能。Fmincon停止是因为函数值相对于初始值的最终变化小于函数容错值。
对于这种规模的问题,收敛速度很快,随着优化的进行,PCG迭代成本略有增加。在解处保持了等式约束的可行性。
问题=负载(“fleq1”);% Get V, Aeq, beq V = problem.V;Aeq = problem.Aeq;说真的= problem.beq;常模(Aeq*x-beq,inf
在这个例子中,fmincon
不能使用H
来计算预处理函数,因为H
只有存在隐式。而不是H
,fmincon
使用Hinfo
,则返回的第三个参数brownvv
,来计算一个预调节器。Hinfo
是一个好的选择,因为它是相同的大小H
和接近H
在某种程度上。如果Hinfo
都不一样大小H
,fmincon
将基于由算法确定的对角缩放矩阵来计算预处理器。通常情况下,这样做的效果不会很好。