二次最小化与密集,结构化黑森
利用一个结构化的黑森
的quadprog
信赖域反射法可以解决黑森密集但结构复杂的大问题。对于这些问题,quadprog
不计算H * Y黑森人H直接,就像用稀疏的信任区域反射问题一样H,因为成形H会占用大量内存。相反,你必须提供quadprog
用一个给定矩阵的函数Y以及关于H,计算W=H * Y.
在这个例子中,黑森矩阵H
有结构H = b + a * a '
在哪里B
是一个稀疏的512 × 512对称矩阵,和一个
是由若干密集列组成的512 × 10稀疏矩阵。避免过多的内存使用H
直接原因H
是稠密的,例中提供了一个Hessian乘函数,qpbox4mult
.当传递一个矩阵时,这个函数Y
,使用稀疏矩阵一个
而且B
来计算黑森矩阵乘积W = h * y = (b + a * a ')* y
.
在这个例子的第一部分,矩阵一个
而且B
需要提供给Hessian乘法函数qpbox4mult
.你可以把一个矩阵作为第一个参数传递给quadprog
,它被传递给黑森乘法函数。您可以使用嵌套函数来提供第二个矩阵的值。
示例的第二部分展示了如何收紧TolPCG
补偿近似预处理条件而不是精确预处理条件的公差H
矩阵。
第一步:决定H的哪一部分作为第一个参数传递给quadprog。
要么一个
或B
可以作为第一个参数传递给quadprog
.示例选择通过B
作为第一个参数,因为这将导致更好的预处理条件(参见预处理).
quadprog (B, f ,[],[],[],[], l, u, xstart选项)
步骤2:写一个函数来计算H的hessian矩阵乘积。下载188bet金宝搏
现在定义一个函数runqpbox4
那
包含一个嵌套函数
qpbox4mult
使用一个
而且B
来计算黑森矩阵乘积W
,在那里W = h * y = (b + a * a ')* y
.嵌套函数必须具有表单W = qpbox4mult(Hinfo,Y,…)
前两个论点
Hinfo
而且Y
是必需的。从加载问题参数
qpbox4.mat
.使用
optimoptions
设置HessianMultiplyFcn
函数句柄的选项qpbox4mult
.调用
quadprog
与B
作为第一个参数。
嵌套函数的第一个参数qpbox4mult
必须与传递给的第一个参数相同quadprog
在这个例子中就是矩阵B。
第二个参数qpbox4mult
是矩阵Y
(W = h * y
).因为quadprog
预计Y
用来形成黑森矩阵积,Y
总是一个矩阵n
行,n
是问题的维数。的列数Y
可能是不同的。这个函数qpbox4mult
是嵌套的,所以矩阵的值是多少一个
来自于外部函数。优化工具箱™软件包括runqpbox4.m
文件。
function [fval, exitflag, output, x] = runqpbox4 % runqpbox4演示了带有边界的QUADPROG的'HessianMultiplyFcn'选项。Problem = load('qpbox4');% Get xstart, u, l, B, A, f xstart = problem.xstart;U = problem.u;L = problem.l;B =问题;A =问题。F = problem.f;Mtxmpy = @qpbox4mult;选择算法和HessianMultiplyFcn选项选项= optimoptions(@quadprog,' algorithm ','trust-region-reflective','HessianMultiplyFcn',mtxmpy); % Pass B to qpbox4mult via the H argument. Also, B will be used in % computing a preconditioner for PCG. [x, fval, exitflag, output] = quadprog(B,f,[],[],[],[],l,u,xstart,options); function W = qpbox4mult(B,Y) %QPBOX4MULT Hessian matrix product with dense structured Hessian. % W = qpbox4mult(B,Y) computes W = (B + A*A')*Y where % INPUT: % B - sparse square matrix (512 by 512) % Y - vector (or matrix) to be multiplied by B + A'*A. % VARIABLES from outer function runqpbox4: % A - sparse matrix with 512 rows and 10 columns. % % OUTPUT: % W - The product (B + A*A')*Y. % % Order multiplies to avoid forming A*A', % which is large and dense W = B*Y + A*(A'*Y); end end
步骤3:用一个起点调用一个二次最小化例程。
中包含的二次最小化例程runqpbox4
,输入
[fval,exitflag,output] = runqpbox4;
运行上述代码。然后显示的值fval
,exitflag
,output.iterations
,output.cgiterations
.
fval exitflag,输出。迭代,输出。Cgiterations fval = -1.0538e+03 exitflag = 3 ans = 18 ans = 30
经过18次迭代,共30次PCG迭代,函数值降为
Fval Fval = -1.0538e+003
一阶最优是
输出。first storderopt ans = 0.0043
预处理
有时quadprog
不能使用H
计算一个前置条件,因为H
只隐式存在。相反,quadprog
使用B
,参数传入而不是H
,来计算一个前置条件。B
是一个很好的选择,因为它是一样的尺寸H
和接近H
在某种程度上。如果B
尺寸不一样吗H
,quadprog
根据由算法确定的对角线缩放矩阵计算预条件。通常情况下,这将不能很好地执行。
因为预处理条件比时更接近H
显式可用,调整TolPCG
参数设置为较小的值。这个示例与前面的示例相同,但是减少了TolPCG
从默认的0.1到0.01。
函数[fval, exitflag, output, x] = runqpbox4prec .%RUNQPBOX4PREC演示了有边界的QUADPROG的“HessianMultiplyFcn”选项。问题=负载(“qpbox4”);% Get xstart, u, l, B, A, fXstart = problem.xstart;U = problem.u;L = problem.l;B =问题;A =问题。F = problem.f;Mtxmpy = @qpbox4mult;qpbox4mult嵌套函数的句柄%选择算法,HessianMultiplyFcn选项,并覆盖TolPCG选项选项= optimoptions(@quadprog,“算法”,“trust-region-reflective”,...“HessianMultiplyFcn”mtxmpy,“TolPCG”, 0.01);通过参数H将B传递给qpbox4mult。B也会被用到计算PCG的预处理条件。% A作为“options”之后的附加参数传递。[x, fval exitflag,输出]= quadprog (B, f ,[],[],[],[], l, u, xstart选项);函数W = qpbox4mult(B,Y)黑森矩阵与致密结构黑森的乘积。% W = qpbox4mult(B,Y)计算W = (B + A*A')*Y其中%的输入:% B -稀疏方阵(512 × 512)% Y -向量(或矩阵)乘以B + A'*A。外部函数runqpbox4prec:% A -有512行10列的稀疏矩阵。%%输出:% W -乘积(B + A*A')*Y。%%顺序相乘以避免形成A*A',%它又大又密W = b * y + a *(a '* y);结束结束
现在,输入
[fval,exitflag,output] = runqpbox4prec;
运行上述代码。经过18次迭代和50次PCG迭代,函数值与5位有效数字相同
Fval Fval = -1.0538e+003
一阶最优性本质上是一样的。
输出。first storderopt ans = 0.0043
请注意
减少TolPCG
过多会大大增加PCG迭代的次数。