主要内容

稠密结构Hessian线性等式的极小化

低记忆的Hessian乘法函数

这个铁铬镍铁合金内点信赖域反射算法,以及fminunc信赖域算法可以解决Hessian稠密但结构化的问题。对于这些问题,铁铬镍铁合金fminunc不计算H * Y和黑森H直接,因为H将内存密集型。相反,你必须提供铁铬镍铁合金fminunc一个函数,给定一个矩阵Y以及有关H,计算W=H * Y

在这个例子中,目标函数是非线性的,因此存在线性等式铁铬镍铁合金使用。该描述适用于信任区域反射算法;的fminunc信赖域算法是相似的。关于内点算法,见HessianMultiplyFcn选项海森乘函数.目标函数具有结构

F ( x ) = F ^ ( x ) 1. 2. x T v v T x ,

哪里v是一个1000乘2的矩阵。黑森人F是稠密的,但是 F ^ 是稀疏的。如果黑森人 F ^ H ^ 然后H的黑森人F,是

H = H ^ v v T

避免使用时可能出现的内存过度使用H该示例直接提供了Hessian乘法函数,hmfleq1.这个函数,当传递一个矩阵Y,使用稀疏矩阵欣福,对应于 H ^ ,v来计算Hessian矩阵乘积

W = H*Y = (Hinfo - V*V')*Y

在这个例子中,Hessian乘法函数需要 H ^ v来计算Hessian矩阵乘积。v是一个常数,因此可以捕获v在一个匿名函数句柄中。

然而, H ^ 不是一个常数,必须在当前计算x.你可以通过计算来做到这一点 H ^ 在目标函数和回归中 H ^ 欣福在第三个输出参数。通过使用最佳选择设定“黑森”选择“开”,铁铬镍铁合金知道如何得到欣福目标函数的值,并将其传递给Hessian乘法函数hmfleq1

步骤1:编写一个brownvv.m文件,用于计算目标函数、梯度和Hessian曲线的稀疏部分。

通过的例子布朗诺夫铁铬镍铁合金作为目标函数。这个brownvv.m文件很长,不包括在这里。您可以使用该命令查看代码

类型brownvv

因为布朗诺夫计算梯度以及目标函数,示例如下(步骤3)使用最佳选择设定指定对象半径选项真正的

步骤2:在给定矩阵Y的情况下,编写一个函数来计算H的Hessian矩阵积。s manbetx 845

现在,定义一个函数hmfleq1使用欣福,计算为布朗诺夫,v,您可以在匿名函数的函数句柄中捕获它,以计算Hessian矩阵乘积W哪里W = H*Y = (Hinfo - V*V')*Y. 此函数必须具有以下形式:

W=hmfleq1(Hinfo,Y)

第一个参数必须与目标函数返回的第三个参数相同布朗诺夫.海森乘法函数的第二个参数是矩阵Y(W=H*Y).

因为铁铬镍铁合金期望第二个参数Y用于形成Hessian矩阵积,Y总是一个矩阵NN是问题的维度数。列数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

步骤3:调用一个具有起点和线性等式约束的非线性最小化程序。

加载问题参数,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,铁铬镍铁合金将根据算法确定的一些对角缩放矩阵计算预处理器。通常情况下,这不会表现得很好。