主要内容

非负线性最小二乘法,具体问题具体分析

这个例子展示了如何使用一些算法来求解一个线性约束最小二乘问题非负约束的解决方案。一个线性最小二乘问题的形式

最小值 x C x - - - - - - d 2

在这种情况下,约束的解决方案是负的, x 0

首先,加载阵列 C d 到您的工作区。

负载粒子

查看每个数组的大小。

sizec =大小(C)
sizec =1×22000 400
尺寸的大小= (d)
大小=1×22000年1

创建一个优化变量x适当大小的乘法C。强加一个下界0的元素x

x = optimvar (“x”sizec (2)下界的,0);

创建目标函数表达式。

剩余= C * x - d;obj =总和(残余。^ 2);

创建一个优化问题nonneglsq,包括目标函数的问题。

nonneglsq = optimproblem (“目标”、obj);

找到的默认解决问题。

选择= optimoptions (nonneglsq)
选择= lsqlin选项:选择当前使用的算法(“内点”):(其他可用的算法:“激活集”、“trust-region-reflective”)设置属性:任何选项设置。默认属性:算法:“内点”ConstraintTolerance: 1.0000 e-08显示:“最终”LinearSolver:“汽车”MaxIterations: 200 OptimalityTolerance: 1.0000 e-08 StepTolerance: 1.0000 e-12显示选项不习惯目前的算法(“内点”)

使用默认解决解决问题。

[溶胶,fval exitflag、输出]=解决(nonneglsq);
使用lsqlin解决问题。最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。

看到的细节优化过程,检查输出结构。

disp(输出)
消息:“……”算法:“内点”firstorderopt: 9.9673 e-07 constrviolation: 0迭代:9 linearsolver:“稀疏”cgiterations:[]解算器:“lsqlin”

输出结构显示lsqlin解算器使用一个内部稀疏线性规划求解的内点算法和迭代需要9到1 e-6的一阶最优性措施。

改变算法

trust-region-reflective算法处理bound-constrained问题。看看这个问题上它执行。

选择。算法=“trust-region-reflective”;[sol2, fval2 exitflag2 output2] =解决(nonneglsq,“选项”、选择);
使用lsqlin解决问题。局部最小值。lsqlin停止,因为函数的相对变化值小于公差的函数。
disp (output2)
迭代:14算法:“trust-region-reflective”firstorderopt: 5.2187 e-08 cgiterations: 54 constrviolation: [] linearsolver:[]消息:“局部最小值可能....“解决者:“lsqlin”

这一次,解算器需要更多的迭代和到达一个解决方案(更好的)较低一阶最优性措施。

得到一个更好的一阶最优性措施,尝试设置SubproblemAlgorithm选项“分解”

选择。SubproblemAlgorithm =“分解”;[sol3, fval3 exitflag3 output3] =解决(nonneglsq,“选项”、选择);
使用lsqlin解决问题。找到最优解。
disp (output3)
迭代:11个算法:“trust-region-reflective”firstorderopt: 1.3973 e-14 cgiterations: 0 constrviolation: [] linearsolver:[]消息:“找到最优解。“解决者:“lsqlin”

使用此选项将一阶最优性测量几乎为零,这是最好的。

改变解算器

lsqnonneg解算器是专门设计来处理非负线性最小二乘法。尝试解决。

[sol4, fval4 exitflag4 output4] =解决(nonneglsq,“规划求解”,“lsqnonneg”);
使用lsqnonneg解决问题。
disp (output4)
迭代:184算法:“激活集”的信息:“优化终止。“解决者:“lsqnonneg”

lsqnonneg不报告一阶最优性措施。相反,调查剩余规范,返回的fval输出。看到lower-significance数字减去22.5794每个剩余常态。

t =表(fval3 fval2 fval - 22.5794——22.5794——22.5794, fval4 - 22.5794,“VariableNames”,{“默认”,“trust-region-reflective”,“分解”,“lsqnonneg”})
t =1×4表默认trust-region-reflective分解lsqnonneg __________ _______________________ _________________ __________ 5.0804 4.9179 4.9179 4.9179 e-05 e-05 e-05 e-05

默认的解算器有一个略高(更糟糕的)剩余比其他三个标准,无法区分是谁的残留标准在这个级别的显示精度。看到这是最低,减去lsqnonneg结果从两个结果。

disp ([fval2——fval4 fval3 - fval4])
1.0 e-12 * 0.7070 - 0.6892

lsqnonneg残留标准是最小的几乎微不足道。然而,lsqnonneg大多数迭代收敛。

相关的话题