主要内容

二次最小化与密集,结构化黑森

利用一个结构化的黑森

quadprog信赖域反射法可以解决黑森密集但结构复杂的大问题。对于这些问题,quadprog不计算H * Y黑森人H直接,就像用稀疏的信任区域反射问题一样H,因为成形H会占用大量内存。相反,你必须提供quadprog用一个给定矩阵的函数Y以及关于H,计算WH * 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

  • 调用quadprogB作为第一个参数。

嵌套函数的第一个参数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;

运行上述代码。然后显示的值fvalexitflagoutput.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尺寸不一样吗Hquadprog根据由算法确定的对角线缩放矩阵计算预条件。通常情况下,这将不能很好地执行。

因为预处理条件比时更接近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迭代的次数。

相关的话题