这个例子展示了在处理稀疏问题时使用稀疏算法的价值。的矩阵n
行,由你选择n
得到一个较大的值,并有几个非零的对角线带。一个完整的矩阵大小n
——- - - - - -n
可以使用所有可用内存,但稀疏矩阵没有问题。
问题是如何最小化x ' * H * x / 2 + f ' * x
受
X (1) + X(2) +…+ x(n) <= 0
,
在哪里f =[1, 2, 3,…;- n)
.H
是稀疏对称带状矩阵。
创建一个对称循环矩阵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*循环移位(H2,1,2) + 6*循环移位(H2,2,2) + 3*循环移位(H2,3,2);
查看稀疏矩阵结构。
间谍(H)
创建优化变量x
和问题qprob
.
x = optimvar (“x”n);qprob = optimproblem;
创建目标函数和约束条件。把目标和约束放在qprob
.
f = 1: n;obj = 1/2*x'*H*x - f*x;qprob。目标= obj;Cons = sum(x) <= 0;qprob。约束=缺点;
求解二次规划问题interior-point-convex”
算法与稀疏线性代数。为防止求解器过早停止,设置StepTolerance
选项0
.
选择= optimoptions (“quadprog”,“算法”,“interior-point-convex”,...“LinearSolver”,“稀疏”,“StepTolerance”, 0);[溶胶,fval exitflag、输出λ)=解决(qprob,“选项”、选择);
求满足约束条件的最小值。优化完成是因为目标函数在可行方向上是不递减的,到最优公差的值以内,并且约束满足到约束公差的值以内。> <停止标准细节
查看与线性不等式约束相关的目标函数值、迭代次数和拉格朗日乘子。
流('目标函数值是%d。\n迭代次数为%d。\n拉格朗日乘数是%d。\n',...fval、output.iterations lambda.Constraints)
目标函数值为-3.133073e+10。迭代次数为7。拉格朗日乘数是1.500050e+04。
计算约束条件,看解是否在边界上。
流('线性不等式约束sum(x)的值为%d.\n'总和(sol.x))
线性不等式约束和(x)的值为7.599738e-09。
解决方案组件的和是零到公差范围内。
解决方案x
有三个区域:初始部分,最终部分,和大部分溶液的近似线性部分。绘制三个区域。
次要情节(1,1)情节(sol.x(一60))标题((1)通过x(60)”) subplot(3,1,2) plot(sol.x(61:n-60)) title(“x(61)通过x (n-60) ') subplot(3,1,3) plot(sol.x(n-59:n)) title(“x (n-59) x (n) ')