大型稀疏二次与内点算法的程序
这个例子展示了使用稀疏算法的价值,当你有一个稀疏的问题。的矩阵n
行,你选择n
一个较大的值,和一些非零对角乐队。一个完整的矩阵的大小n
——- - - - - -n
可以使用所有可用的内存,但一个稀疏矩阵提出了没有问题。
问题是最小化x ' * H * x / 2 + f ' * x
受
x (1) + (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
——- - - - - -n
矩阵时n
= 30000。所以你可以运行这个问题只有通过使用稀疏矩阵。
检查解决方案
把目标函数值,迭代次数和拉格朗日乘子与线性不等式有关。
流(的目标函数值% d。% d \ nThe的迭代次数。\ nThe拉格朗日乘子% d。\ n”,…fval、output.iterations lambda.ineqlin)
目标函数值是-3.133073 e + 10。迭代的数量是7。拉格朗日乘数为1.500050 e + 04。
因为没有下界,上界,或线性等式约束,唯一有意义的拉格朗日乘子lambda.ineqlin
。因为lambda.ineqlin
是零,你可以告诉不等式约束是活跃的。评估约束边界上的解决方案。
流(的线性不等式约束* x值% d。\ n”* x)
线性不等式约束e-08 * x值9.150244。
解决方案组件的总和是零公差内。
解决方案x
有三个区域:一个初始部分,最后一个部分,是一个近似的线性部分的解决方案。绘制三个区域。
次要情节(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) ')