主要内容

二次最小化密集,结构化的麻绳

利用结构化的麻绳

quadprogtrust-region-reflective方法可以解决大问题,黑森密集但结构化。对于这些问题,quadprog不计算H * Y在黑森H直接是trust-region-reflective稀疏问题H,因为形成H将内存密集型。相反,您必须提供的quadprog函数,给定一个矩阵Y和信息H,计算W=H * Y

在这个例子中,海赛矩阵H有结构H = B + *”在哪里B是一个稀疏的512 - 512对称矩阵,然后呢一个是512 - 10稀疏矩阵组成的密集的列的数量。为了避免过度的内存使用情况,处理可能发生的H直接原因H密集的,提供了一个示例黑森乘法函数,qpbox4mult。这个函数,当通过一个矩阵Y,使用稀疏矩阵一个B计算海赛矩阵产品W = H * Y = (B + *) * Y

在这个例子中,第一部分矩阵一个B需要提供给黑森乘法函数qpbox4mult。你可以将一个矩阵作为第一个参数传递quadprog传递到黑森乘法函数。你可以用一个嵌套函数提供第二个矩阵的值。

第二部分的示例显示了如何收紧TolPCG公差补偿一个近似预调节器,而不是一个确切的H矩阵。

步骤1:决定什么H的一部分传递给quadprog作为第一个参数。

要么一个B可以作为第一个参数传递给quadprog。选择的例子B第一个参数,因为这将导致更好的预调节器(见预处理)。

quadprog (B, f, []、[] [], [], l, u, xstart,选项)

第二步:编写一个函数来计算海赛矩阵产品H。下载188bet金宝搏

现在,定义一个函数runqpbox4

  • 包含一个嵌套函数qpbox4mult使用一个B计算海赛矩阵产品W,在那里W = H * Y = (B + *) * Y。嵌套函数必须有形式

    W = qpbox4mult (Hinfo Y…)

    前两个参数HinfoY是必需的。

  • 负载参数的问题qpbox4.mat

  • 使用optimoptions设置HessianMultiplyFcn选择一个函数处理指向qpbox4mult

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

嵌套函数的第一个参数qpbox4mult必须与第一个参数传递给quadprog,在这种情况下是矩阵B。

第二个参数qpbox4mult是矩阵Y(W = H * Y)。因为quadprog预计Y用于形成海赛矩阵产品,Y总是一个矩阵n行,n的维数问题。列的数量Y可能是不同的。这个函数qpbox4mult嵌套,矩阵的值一个来自于外部函数。软件包括优化工具箱™runqpbox4.m文件。

函数(fval、exitflag、输出,x) = runqpbox4 % runqpbox4演示QUADPROG HessianMultiplyFcn的选择范围。问题=负载(“qpbox4”);%得到xstart u l B, f xstart = problem.xstart;u = problem.u;l = problem.l;B = problem.B;一个=实例计算;f = problem.f;mtxmpy = @qpbox4mult;%函数处理qpbox4mult嵌套函数%选择算法和HessianMultiplyFcn选项选项= optimoptions (@quadprog、“算法”、“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、输出]= runqpbox4;

前面的代码运行。然后显示的值fval,exitflag,output.iterations,output.cgiterations

fval exitflag,输出。迭代,输出。cgiterations fval = -1.0538 e + 03 exitflag = 3 = 18岁= 30

18迭代共有30 PCG迭代后,函数值降低

fval fval = -1.0538 e + 003

和一阶最优性

输出。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演示QUADPROG HessianMultiplyFcn的选择范围。问题=负载(“qpbox4”);%得到xstart u l B, fxstart = problem.xstart;u = problem.u;l = problem.l;B = problem.B;一个=实例计算;f = problem.f;mtxmpy = @qpbox4mult;%函数处理qpbox4mult嵌套函数%选择算法,HessianMultiplyFcn选项,并覆盖TolPCG选项选择= optimoptions (@quadprog,“算法”,“trust-region-reflective”,“HessianMultiplyFcn”mtxmpy,“TolPCG”,0.01);通过H %通过B qpbox4mult论点。同时,将用于%计算为PCG预调节器。%后作为一个附加参数传递“选项”[x, fval exitflag、输出]= quadprog (B, f, []、[] [], [], l, u, xstart,选项);函数W = qpbox4mult (B, Y)% QPBOX4MULT海赛矩阵产品密集的结构化的麻绳。% W = qpbox4mult (B, Y)计算W = (B + *) * Y%的输入:% B -稀疏方阵(512 * 512)% Y -向量或矩阵乘以B +一个‘*。从外部函数runqpbox4prec %变量:%,稀疏矩阵与512行和列。%%输出:% W -产品(B + *) * Y。%%繁殖,避免形成一个*的,%是大型和密集W = B * Y + * (“* Y);结束结束

现在,输入

[fval、exitflag、输出]= runqpbox4prec;

前面的代码运行。18个迭代和50 PCG迭代后,函数值具有相同的价值五位有效数字

fval fval = -1.0538 e + 003

和一阶最优性本质上是相同的。

输出。firstorderopt ans = 0.0043

请注意

减少TolPCG太多可以大大增加PCG迭代的数量。

相关的话题