这个铁铬镍铁合金
内点
和信赖域反射
算法,以及fminunc
信赖域
算法可以解决Hessian稠密但结构化的问题。对于这些问题,铁铬镍铁合金
和fminunc
不计算H * Y和黑森H直接,因为H将内存密集型。相反,你必须提供铁铬镍铁合金
或fminunc
一个函数,给定一个矩阵Y以及有关H,计算W=H * Y.
在这个例子中,目标函数是非线性的,因此存在线性等式铁铬镍铁合金
使用。该描述适用于信任区域反射算法;的fminunc
信赖域
算法是相似的。关于内点算法,见HessianMultiplyFcn
选项海森乘函数.目标函数具有结构
哪里v是一个1000乘2的矩阵。黑森人F是稠密的,但是 是稀疏的。如果黑森人 是 然后H的黑森人F,是
避免使用时可能出现的内存过度使用H该示例直接提供了Hessian乘法函数,hmfleq1
.这个函数,当传递一个矩阵Y
,使用稀疏矩阵欣福
,对应于
,v
来计算Hessian矩阵乘积
W = H*Y = (Hinfo - V*V')*Y
在这个例子中,Hessian乘法函数需要
和v
来计算Hessian矩阵乘积。v
是一个常数,因此可以捕获v
在一个匿名函数句柄中。
然而,
不是一个常数,必须在当前计算x
.你可以通过计算来做到这一点
在目标函数和回归中
像欣福
在第三个输出参数。通过使用最佳选择
设定“黑森”
选择“开”
,铁铬镍铁合金
知道如何得到欣福
目标函数的值,并将其传递给Hessian乘法函数hmfleq1
.
通过的例子布朗诺夫
到铁铬镍铁合金
作为目标函数。这个brownvv.m
文件很长,不包括在这里。您可以使用该命令查看代码
类型brownvv
现在,定义一个函数hmfleq1
使用欣福
,计算为布朗诺夫
,v
,您可以在匿名函数的函数句柄中捕获它,以计算Hessian矩阵乘积W
哪里W = H*Y = (Hinfo - V*V')*Y
. 此函数必须具有以下形式:
W=hmfleq1(Hinfo,Y)
第一个参数必须与目标函数返回的第三个参数相同布朗诺夫
.海森乘法函数的第二个参数是矩阵Y
(W=H*Y
).
因为铁铬镍铁合金
期望第二个参数Y
用于形成Hessian矩阵积,Y
总是一个矩阵N
行N
是问题的维度数。列数Y
可能会有所不同。最后,您可以使用匿名函数的函数句柄来捕获V,因此V可以作为“hmfleqq”
.
函数W=hmfleq1(Hinfo,Y,V);%用于BROWNVV目标的HMFLEQ1 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
文件夹中。使用最佳选择
设定指定对象半径
选项真正的
并设定HessianMultiplyFcn
指向的函数句柄的选项hmfleq1
.调用铁铬镍铁合金
与目标函数布朗诺夫
和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,output,x]=runfleq1;
因为迭代显示是使用最佳选择
,此命令生成以下迭代显示:
一阶迭代f(x)的范数步进优化CG迭代0 2297.63 1.41e+03 1 1084.3903 578 1 2 1084.59 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 2 7 761.592 6.25 62.4 4 4 4 8 746.478 1.5625 163 0 9 546.578 3.125 84.1 2 10 274.311 6.25 26.9 2 6155.6193 11.652 12 12 12 55.25 293.26 296-6.49。25 78 1 15 -93.2772 1.5625 68 1 16 -207.204 3.125 86.5 1 17 -434.162 6.25 70.7 1 18 -681.359 6.25 43.7 2 19 -681.359 6.25 43.7 4 20 -698.041 1.5625 191 0 21 -723.959 3.125 256 7 22 -751.33 0.78125 154 3 23 -793.974 1.5625 24.4 3 24 -820.831 2.51937 6.11 3 25 -823.069 0.562132 2.87 3 26 -823.237 0.196753 0.486 3 27 -823.245 0.0621202 0.386 3 28 -823.246 0.0199951 0.11 6 29-823.246 0.00731333 0.0404 7 30-823.246 0.00505883 0.0185 8 31-823.246 0.00126471 0.002689 32-823.246 0.00149326 0.005219 33-823.246 0.000373314 0.00091 9可能的局部最小值。fmincon停止,因为相对于其初始值的功能值的最终变化小于功能公差值。
对于这种规模的问题,收敛速度很快,随着优化的进行,PCG迭代成本略有增加。在解处保持了等式约束的可行性。
问题=负载(“fleq1”);% Get V, Aeq, beq V = problem.V;Aeq = problem.Aeq;说真的= problem.beq;常模(Aeq*x-beq,inf
在这个例子中,铁铬镍铁合金
不能使用H
计算一个预条件,因为H
仅隐式存在。而不是H
,铁铬镍铁合金
使用欣福
,返回的第三个参数布朗诺夫
,来计算一个预调节器。欣福
是一个好的选择,因为它是相同的大小H
和接近H
在某种程度上。如果欣福
都不一样大小H
,铁铬镍铁合金
将根据算法确定的一些对角缩放矩阵计算预处理器。通常情况下,这不会表现得很好。