二次最小化,结构化的黑森
利用结构化的黑森州
这Quadprog
信任区域反射方法可以解决黑森密集但结构结构的大问题。对于这些问题,Quadprog
不计算h*y与黑森州H直接,就像稀疏的信任区域反射问题一样H,因为形成H将是记忆密集型的。相反,您必须提供Quadprog
具有给定矩阵的函数y和有关的信息H,计算w=h*y。
在此示例中,Hessian矩阵H
有结构h = b + a*a'
在哪里b
是一个稀疏的512 x-512对称矩阵,并且一个
是由许多密集柱组成的512 x-10稀疏矩阵。为了避免通过使用的过度记忆使用情况H
直接是因为H
是密集的,该示例提供了Hessian倍增功能,QPBox4Mult
。此功能,当通过矩阵时y
,使用稀疏的矩阵一个
和b
计算Hessian Matrix产品w = h*y =(b + a*a')*y
。
在本示例的第一部分中,矩阵一个
和b
需要提供到Hessian倍增功能QPBox4Mult
。您可以将一个矩阵作为第一个参数将Quadprog
,将传递给Hessian倍增功能。您可以使用嵌套函数来提供第二矩阵的值。
示例的第二部分显示了如何拧紧TOLPCG
公差以补偿近似预处理,而不是精确H
矩阵。
步骤1:确定将H的哪一部分传递给QuadProg作为第一个参数。
任何一个一个
或者b
可以作为第一个论点传递给Quadprog
。示例选择通过b
作为第一个论点,因为这会导致更好的预处理(请参阅预处理)。
quadprog(b,f,[],[],[],[],[],l,u,xstart,options)
步骤2:编写一个功能来计算H. Hessian-Matrix产品。下载188bet金宝搏
现在,定义一个函数runqpbox4
那
包含嵌套功能
QPBox4Mult
使用一个
和b
计算Hessian Matrix产品w
, 在哪里w = h*y =(b + a*a')*y
。嵌套功能必须具有表单w = qpbox4mult(hinfo,y,...)
前两个参数
Hinfo
和y
是必须的。从
qpbox4.mat
。用途
最佳选择
设置Hessianmultiplyfcn
函数处理指向的选项QPBox4Mult
。呼叫
Quadprog
和b
作为第一个论点。
嵌套功能的第一个参数QPBox4Mult
必须与第一个论点相同Quadprog
,在这种情况下是矩阵B。
第二个论点QPBox4Mult
是矩阵y
(的w = h*y
)。因为Quadprog
期望y
用于形成Hessian Matrix产品,y
总是一个矩阵n
行,哪里n
是问题中的维度数。列中的数量y
可以变化。功能QPBox4Mult
被嵌套以使矩阵的值一个
来自外部功能。优化工具箱™软件包括runqpbox4.m
文件。
函数[FVAL,EXITFLAG,输出,X] = RunQPbox4%RunQPbox4演示了具有界限的四元中的hessianmultiplyfcn'选项。问题= load('qpbox4');%获取Xstart,u,l,b,a,f xstart = argears.xstart;u = Quards.u;l = QUACDER.L;B = Quarder.B;a =问题f = Quards.f;mtxmpy = @qpbox4mult;qpbox4mult嵌套函数%选择算法和hessianmultiplyfcn选项= optimoptions(@quadprog,'algorithm','trust-region-refrofection','hessianmultiplyflyfcn',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,输出] = RunQPbox4;
运行前面的代码。然后显示FVAL
,,,,出口
,,,,output.iterations
, 和输出
。
FVAL,EXITFLAG,output.Iteriations,output.Cgiterations fval = -1.0538e+03 ExitFlag = 3 Ans = 18 Ans = 30
在18次迭代(总共30个PCG迭代)之后,该功能值降低到
FVAL FVAL = -1.0538E+003
一阶最优性是
output.firstorderopt ans = 0.0043
预处理
有时Quadprog
不能用H
计算预处理,因为H
只有隐式存在。反而,Quadprog
用途b
,论点通过而不是H
,计算预处理。b
是一个不错的选择,因为它的大小与H
和近似H
在某种程度上。如果b
与H
,,,,Quadprog
将根据根据算法确定的一些对角度缩放矩阵来计算预处理。通常,这不会表现不佳。
因为预处理比H
明确可用,调整TOLPCG
可能需要参数到较小的值。此示例与上一个示例相同,但减少了TOLPCG
从默认为0.1到0.01。
功能[FVAL,EXITFLAG,输出,X] = RunQPbox4Prec%runqpbox4prec演示了具有界限的四元中的“ hessianmultiplyfcn”选项。问题=负载('qpbox4');%获得XSTART,U,L,B,A,FXstart = Quards.xstart;u = Quards.u;l = QUACDER.L;B = Quarder.B;a =问题f = Quards.f;mtxmpy = @qpbox4mult;%函数处理qpbox4mult嵌套功能%选择算法,HessianMultiplyFCN选项,并覆盖TOLPCG选项options = optimoptions(@quadprog,'算法',,,,“信任区域反射”,,,,...'Hessianmultiplyfcn',mtxmpy,'tolpcg',0.01);%通过h参数将b传递给qpbox4mult。另外,b将在%计算PCG的预处理。%a作为“选项”之后的附加参数传递[x,fval,exitflag,output] = quadprog(b,f,[],[],[],[],[],[l,u,u,xstart,options);功能w = qpbox4mult(b,y)%QPBox4Mult Hessian矩阵产品,具有密度结构化Hessian。%w = qpbox4mult(b,y)计算w =(b + a*a')*y在其中% 输入:%b-稀疏方形矩阵(512 x 512)%y -vector(或矩阵)将乘以b + a'*a。来自外部函数runqpbox4prec的%变量:%A-稀疏矩阵,带有512行和10列。%% 输出:%W-产品(B + A*A')*y。%%订单乘以乘以避免形成A*a',百分比大且密集w = b*y + a*(a'*y);结尾结尾
现在,输入
[FVAL,EXITFLAG,输出] = RunQPBox4Prec;
运行前面的代码。在18次迭代和50个PCG迭代之后,该函数值具有与5个有效数字相同的值
FVAL FVAL = -1.0538E+003
一阶最优性基本相同。
output.firstorderopt ans = 0.0043
笔记
减少TOLPCG
太多可以大大增加PCG迭代的数量。