主要内容

稠密的结构化Hessian的二次极小化

利用结构化的黑森人

quadprog信任区域反射法可以解决海森密度大但结构复杂的大问题。对于这些问题,quadprog不计算H * Y在黑森H直接地,就像它对稀疏的信任区域反射问题所做的那样H,因为形成H将内存密集型。相反,你必须提供quadprog有一个函数,给定一个矩阵Y和信息H,计算WH * Y

在这个例子中,Hessian矩阵H有结构H = b + a * a '在哪里B稀疏512 × 512对称矩阵,和一个是一个512 × 10的稀疏矩阵,由许多密集的列组成。以避免由于使用H直接原因H是稠密的,这个例子提供了一个Hessian乘法函数,qpbox4mult.这个函数,当传递一个矩阵Y,使用稀疏矩阵一个B来计算Hessian矩阵乘积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选项)

第二步:写一个函数,计算H的hessian矩阵乘积。s manbetx 845

现在,定义一个函数runqpbox4

  • 包含嵌套函数qpbox4mult使用一个B来计算Hessian矩阵乘积W,在那里W = h * y = (b + a * a ')* 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文件。

function [fval, exitflag, output, x] = runqpbox4 % runqpbox4演示了QUADPROG的'HessianMultiplyFcn'选项。问题=负载(“qpbox4”);% Get xstart, u, l, B, A, f xstart = problem.xstart;u = problem.u;l = problem.l;B = problem.B;一个=实例计算;f = problem.f;mtxmpy = @qpbox4mult;% select algorithm and the HessianMultiplyFcn option options = optimoptions(@quadprog,' algorithm ','信任区域-反射','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;

运行上述代码。然后显示的值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

一阶最优性是

输出。第一步= 0.0043

预处理

有时quadprog不能使用H来计算预处理函数,因为H只有存在隐式。相反,quadprog使用B,而不是传入的参数H,来计算一个预调节器。B是一个好的选择,因为它是相同的大小H和接近H在某种程度上。如果B都不一样大小Hquadprog将基于由算法确定的对角缩放矩阵来计算预处理器。通常情况下,这样做的效果不会很好。

因为前置条件比when更接近H是否可明确调整TolPCG参数设置为稍小的值。这个示例与前面的示例相同,但有所减少TolPCG从默认的0.1到0.01。

函数[fval, exitflag, output, x] = runqpbox4prec .输出说明%RUNQPBOX4PREC演示了QUADPROG的“HessianMultiplyFcn”选项。问题=负载(“qpbox4”);u, l, B, A, fxstart = problem.xstart;u = problem.u;l = problem.l;B = problem.B;一个=实例计算;f = problem.f;mtxmpy = @qpbox4mult;qpbox4multi嵌套函数的句柄%选择算法,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)%QPBOX4MULT含稠密结构Hessian的Hessian矩阵乘积。% 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、输出]= runqpbox4prec;

运行上述代码。经过18次迭代和50次PCG迭代后,功能值与5个有效位数相同

Fval Fval = -1.0538e+003

一阶最优性本质上是一样的。

输出。第一步= 0.0043

请注意

减少TolPCG过多会大大增加PCG迭代次数。

相关的话题