このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例は,スパース問題を解くときにスパース演算を使用することの価値を示しています。行列はn
行です。大きい値のn
と,いくつかの非ゼロの対角帯を選択します。n
行n
列の非スパース行列は使用可能なメモリをすべて使用することがありますが,スパース行列は問題を起こしません。
問題は以下の制約に従ってx ' * H * x / 2 + f ' * x
を最小化することです。
X (1) + X(2) +…+ x(n) <= 0
,
ここで,f =[1, 2, 3,…;- n)
、H
はスパース対称帯行列です。
ベクトル(2 2 3, 6日,14日,6日3]
の14を主対角に置いたシフトにより,対称循環行列を作成します。行列はn
行n
列にします。ここで,n = 30000
です。
n = 3 e4;H2 = speye (n);H = 3 * circshift (H2 3 2) + 6 * circshift (H2 2 2) + 2 * circshift (H2, 1、2)...+ 14*H2 + 2*circshift(H2,1,2) + 6*circshift(H2,2,2) + 3*circshift(H2,3,2);
行列構造を表示します。
间谍(H)
線形制約は,解の要素の合計が非正であるというものです。目的関数には,ベクトルf
で表現された線形項が含まれます。
一个= 1 (1,n);b = 0;f = 1: n;f = - f;
interior-point-convex”
アルゴリズムを使用して二次計画問題を解きます。ソルバーが途中で停止しないように,StepTolerance
オプションを0
に設定します。
选择= optimoptions (@quadprog,“算法”,“interior-point-convex”,“StepTolerance”, 0);[x, fval exitflag、输出λ)=...quadprog (H f A、b ,[],[],[],[],[], 选项);
找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。> <停止标准细节
n
= 30000の場合,多くのコンピューターでは,完全なn
行n
列の行列を作成することができません。したがって,この問題はスパース行列を使用してのみ実行できます。
目的関数の値と反復回数を表示し,線形不等式に関連付けられたラグランジュ乗数も表示します。
流(’目标函数值为%d。\n迭代次数为%d。拉格朗日乘数是%d.\n',...fval、output.iterations lambda.ineqlin)
目标函数值为-3.133073e+10。迭代次数为7次。拉格朗日乘数是1.500050e+04。
下限,上限,線形等式のいずれの制約もないため,有効なラグランジュ乗数はlambda.ineqlin
のみです。lambda.ineqlin
が非ゼロであるため,不等式制約がアクティブであることがわかります。制約を評価して,解が境界上であることを確認します。
流(线性不等式约束A*x的值为%d.\n'* x)
线性不等式约束A*x的值为9.150244e-08。
解の構成要素の合計は0で許容誤差の範囲内です。
解x
には3つの領域,最初の部分,最後の部分,および解の大半を占めるほぼ線形の部分があります。3つの領域をプロットします。
次要情节(1,1)情节(x(一60))标题((1)通过x(60)”)子地块(3,1,2)地块(x(61:n-60))标题(“x(61)通过x (n-60) ')子地块(3,1,3)地块(x(n-59:n))标题(“x (n-59) x (n) ')