主要内容

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

用于低内存的Hessian乘法函数

fmincon内点trust-region-reflective算法,fminunc信赖域算法可以解决Hessian稠密但结构化的问题。对于这些问题,fminconfminunc不计算H * Y在黑森H直接,因为形成H将内存密集型。相反,你必须提供fminconfminunc有一个函数,给定一个矩阵Y和信息H,计算WH * Y

在这个例子中,目标函数是非线性的,并且存在线性等式fmincon使用。该描述适用于信任区域反射算法;的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,使用稀疏矩阵Hinfo,对应于 H ,V来计算Hessian矩阵乘积

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

在这个例子中,Hessian乘法函数需要 H V来计算Hessian矩阵乘积。V是常数,所以你可以捕捉V在一个匿名函数句柄中。

然而, H 不是一个常数,必须在当前计算x.你可以通过计算来做到这一点 H 在目标函数和返回 H 作为Hinfo在第三个输出参数。通过使用optimoptions设置“海赛”选项“上”fmincon知道如何得到Hinfo,并将其传递给Hessian乘法函数hmfleq1

步骤1:写入文件brownvv。m,用于计算目标函数、梯度和Hessian稀疏部分。

通过的例子brownvvfmincon作为目标函数。的brownvv.m文件很长,不包括在这里。您可以使用该命令查看代码

类型brownvv

因为brownvv计算梯度和目标函数,示例(步骤3)使用optimoptions设置SpecifyObjectiveGradient选项真正的

第二步:写一个函数,计算给定矩阵Y的H的hessian矩阵乘积。下载188bet金宝搏

现在,定义一个函数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总是一个矩阵nn是问题的维度数。列数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

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

加载问题参数,V,稀疏等式约束矩阵,Aeq说真的,从fleq1.mat,可在optimdemos文件夹中。使用optimoptions设置SpecifyObjectiveGradient选项真正的要设置HessianMultiplyFcn选项指向的函数句柄hmfleq1.调用fmincon与目标函数brownvvV作为附加参数:

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只有存在隐式。而不是Hfmincon使用Hinfo,则返回的第三个参数brownvv,来计算一个预调节器。Hinfo是一个好的选择,因为它是相同的大小H和接近H在某种程度上。如果Hinfo都不一样大小Hfmincon将基于由算法确定的对角缩放矩阵来计算预处理器。通常情况下,这样做的效果不会很好。