このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
quadprog
信頼領域 反思的法では、ヘッシアンが密であっても構造化されていれば、大規模な問題を解くことができます。これらの問題に対しquadprog
は、スパース行列 Hを使った信頼領域 反思的法の問題で行うように、ヘッシアン Hを使用して直接 H*Yを計算するという方法は取りません。Hの形成には多大なメモリを要するからです。その代わり、行列 Yと Hの情報をもとに W=H*Yを計算する関数をquadprog
に与えなければなりません。
この例ではヘッセ行列H
はH=B+A*A'
という構造をしています。ここで、B
は 512行 512列の対称スパース行列でA.
は密な列から構成される512行10列のスパース行列です。H
が密であるため、直接H
を使うことで起こる過度のメモリ使用を避けるために、この例ではヘッセ乗算関数qpbox4mult
を与えます。この関数は行列Y
が渡されると、スパース行列A.
とB
を使用してヘッセ行列の積W=H*Y=(B+A*A')*Y
を計算します。
この例の最初の部分では,ヘッセ乗算関数qpbox4mult
に、行列A.
とB
を渡す必要があります。quadprog
の第 1.引数に、ヘッセ乗算関数に渡す行列を入力できます。第 2.の行列の値を与えるために入れ子関数を使用できます。
この例の 2.番目の部分では、正確な行列H
ではなく近似の前提条件子を使用することによる影響を補正するために托尔普克
許容誤差を厳しくする方法を説明します。
A.
またはB
をquadprog
の 1.番目の引数として渡すことができます。例では良い前提条件子 (前処理を参照) の結果から 1.番目の引数としてB
を渡すことにします。
quadprog(B、f、[]、[]、[]、[]、[]、l、u、xstart、选项)
ここで、次のような関数runqpbox4
を定義します。
A.
およびB
を用いて、W=H*Y=(B+A*A')*Y
となるヘッセ行列の積W
を計算する入れ子関数qpbox4mult
を含みます。この関数は、以下の形式でなければなりません。
W=qpbox4mult(Hinfo,Y,…)
最初の2つの引数欣福
とY
が必要です。
qpbox4.mat
から問題のパラメーターを読み込みます。
最佳选择
を使ってHessianMultiplyFcn
オプションに関数ハンドルでqpbox4mult
を指定します。
B
を第 1.引数としてquadprog
を呼び出します。
入れ子関数qpbox4mult
の第 1.引数はquadprog
に渡される第 1.引数と同じである必要があります。この場合は行列 Bです。
qpbox4mult
に対する第 2.引数は行列Y
(W=H*Y
のもの) です。quadprog
ではヘッセ行列の積の構成に使われるY
を想定しているため、問題の次元数をN
とした場合、Y
は常にN
行の行列になります。Y
の列数は可変です。関数qpbox4mult
は、行列A.
の値が外側の関数から得られる入れ子になります。优化工具箱™ ソフトウェアには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
runqpbox4
内の二次の最小化ルーチンを呼び出すには次のように入力してください。
[fval,exitflag,output]=runqpbox4;
上記のコードを実行します。次に,未来值
、出口滞后
、输出迭代次数
およびoutput.cg迭代次数
の値を表示します。
fval,exitflag,output.iterations,output.cgtations fval=-1.0538e+03 exitflag=3 ans=18 ans=30
30の PCG反復による 18回の反復の後、関数値が減ります。
fval fval=-1.0538e+003
そして、1.次の最適性は、以下のようになります。
output.firstorderopt ans=0.0043
H
が陰的に存在するためquadprog
が前提条件子の計算にH
を使用できないことがあります。その代わり、quadprog
はH
の代わりに渡す引数として前提条件子の計算にB
を使用します。B
はH
とサイズが同じであり、またH
とある程度近似しているため適切な選択となります。B
がH
と同じサイズでない場合,quadprog
はアルゴリズムで決められた対角行列をベースに前提条件子を計算します。通常、これはうまく実行されません。
H
が陽的に使用可能な場合、前提条件子はより良い近似になるため、托尔普克
パラメーターの調整はやや小さめの値にしなければなりません。この例は前の例と同じですが、托尔普克
は既定の 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;A=problem.A;f=problem.f;mtxmpy=@qpbox4mult;%qpbox4mult嵌套函数的函数句柄%选择algorithm、HessianMultiplyFcn选项,并覆盖TolPCG选项options=options(@quadprog,“算法”,“trust-region-reflective”,...“HessianMultiplyFcn”,mtxmpy,“托尔普克”,0.01);%通过H参数将B传递给qpbox4mult。此外,B将在%计算PCG的预处理器。%A作为“选项”后面的附加参数传递[x,fval,exitflag,output]=quadprog(B,f,[],[],[],[],[],[],[],l,u,xstart,options);作用W = qpbox4mult (B, Y)%QPBOX4MULT Hessian矩阵积,具有稠密结构Hessian。% W = qpbox4mult(B,Y)计算W = (B + A*A')*Y%输入:%B-稀疏平方矩阵(512 x 512)%Y-向量(或矩阵)乘以B+A'*A。%外部函数runqpbox4prec中的变量:% A -稀疏矩阵,512行10列。%%输出:%W-产品(B+A*A')*Y。%%为了避免形成*A',对倍数进行排序,%它又大又密W = b * y + a *(a '* y);终止终止
ここで以下を入力し,
[fval,exitflag,output]=runqpbox4prec;
上記のコードを実行します。18回の反復と 50回の PCG反復の後、関数値は 5.桁の有効数字となる同じ値になります。
fval fval=-1.0538e+003
さらに、1.次の最適性は基本的には同じです。
output.firstorderopt ans=0.0043
メモ:
托尔普克
を小さくしすぎると、PCG反復数がかなり増えることがあります。