lsqlin
解决约束线性最小二乘问题
语法
描述
例子
线性不等式约束下的最小二乘
找到x
最小化的标准C * x - d
一个具有线性不等式约束的过定问题。
指定问题和约束。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936];D = [0.0578 0.3528 0.8131 0.0098 0.1388];A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462];B = [0.5251 0.2026 0.6721];
调用lsqlin
解决问题。
x = lsqlin (C, d, A, b)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =4×10.1299 -0.5757 0.4251 0.2438
线性约束和边界的最小二乘
找到x
最小化的标准C * x - d
对于一个具有线性等式和不等式约束和边界的过定问题。
指定问题和约束。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936];D = [0.0578 0.3528 0.8131 0.0098 0.1388];A =[0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462];B =[0.5251 0.2026 0.6721];Aeq = [3 5 7 9];说真的= 4;磅= -0.1 * 1 (4,1);乌兰巴托= 2 * 1 (4,1);
调用lsqlin
解决问题。
x = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =4×1-0.1000 -0.1000 0.1599 0.4090
具有非默认选项的线性最小二乘
这个例子展示了如何使用线性最小二乘的非默认选项。
设置选项以使用“内点”
算法并给出迭代显示。
选择= optimoptions (“lsqlin”,“算法”,“内点”,“显示”,“通路”);
建立一个线性最小二乘问题。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936];D = [0.0578 0.3528 0.8131 0.0098 0.1388];A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462];B = [0.5251 0.2026 0.6721];
运行问题。
x = lsqlin (C, d, A, b ,[],[],[],[],[], 选项)
Iter Fval primary Infeas Dual Infeas互补0 -7.687420e-02 1.60049e +00 6.150431e-01 1.000000e+00 1 -7.687419e-02 8.002458e-04 3.075216e-04 3.430833e -01 4.001229e- 01 2.000615e-10 1.536997e -08 5.945636e-02 3 -3.760545e-01 2.000615e-10 2.036997e-08 1.370933e-02 4 - 3.9121245e -01 1.00058e -13 1.006816e-08 2.548273e-03 5 -3.948062e-01 2.775558e-17 2.955102e-09 4.295807e-04 6 -3.953277e-01 3.775558e -01 3.775558e -01 3.775558e -17 1.645863e-10 1.138719e-07 8无-3.953582e-01 0.000000e+00 2.400302e-13 5.693290e-11最小发现满足约束。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =4×10.1299 -0.5757 0.4251 0.2438
返回所有输出
获取并解释所有lsqlin
输出。
定义一个具有线性不等式约束和边界的问题。这个问题是过度确定的,因为有四列C
矩阵只有五行。这意味着问题有四个未知数和五个条件,甚至在包括线性约束和边界之前。
C = [0.9501 0.7620 0.6153 0.4057 0.2311 0.4564 0.7919 0.9354 0.6068 0.0185 0.9218 0.9169 0.4859 0.8214 0.7382 0.4102 0.8912 0.4447 0.1762 0.8936];D = [0.0578 0.3528 0.8131 0.0098 0.1388];A = [0.2027 0.2721 0.7467 0.4659 0.1987 0.1988 0.4450 0.4186 0.6037 0.0152 0.9318 0.8462];B = [0.5251 0.2026 0.6721];磅= -0.1 * 1 (4,1);乌兰巴托= 2 * 1 (4,1);
设置选项以使用“内点”
算法。
选择= optimoptions (“lsqlin”,“算法”,“内点”);
的“内点”
算法不使用初始点,因此设置x0
来[]
.
x0 = [];
调用lsqlin
与所有输出。
[x, resnorm残留,exitflag,输出,λ)=...lsqlin (C, d, A, b,[],[],磅,乌兰巴托,x0,选项)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =4×1-0.1000 -0.1000 0.2152 0.3502
resnorm = 0.1672
剩余=5×10.0455 0.0764 -0.3562 0.1620 0.0784
exitflag = 1
输出=结构体字段:message: '找到满足约束条件的最小值....'算法:' inner -point' firstorderopt: 4.3374e-11 constrbreach: 0 iterations: 6 linearsolver: '密' cgiterations: []
λ=结构体字段:Ineqlin: [3x1 double] eqlin: [0x1 double] lower: [4x1 double] upper: [4x1 double]
更详细地检查非零拉格朗日乘子场。首先检验线性不等式约束的拉格朗日乘子。
lambda.ineqlin
ans =3×10.0000 0.2392 0.0000
当解在相应的约束边界上时,拉格朗日乘子恰恰是非零的。换句话说,当相应的约束有效时,拉格朗日乘子是非零的。lambda.ineqlin (2)
是零。这意味着第二个元素* x
应该等于第二个元素b
,因为约束是活动的。
[(2) * x, b (2))
ans =1×20.2026 - 0.2026
现在检查下限和上限约束的拉格朗日乘子。
lambda.lower
ans =4×10.0409 0.2784 0.0000 0.0000
lambda.upper
ans =4×10 0 0 0
的前两个元素lambda.lower
非零。你会看到x (1)
而且x (2)
都在它们的下界,-0.1
.所有元素的lambda.upper
本质上是零,你看所有的分量x
都小于它们的上限,2
.
返回温暖开始对象
创建一个温暖的开始对象,以便快速解决修改后的问题。设置选项以关闭迭代显示以支持热启动。
rng默认的%的再现性选择= optimoptions (“lsqlin”,“算法”,“激活集”,“显示”,“关闭”);n = 15;x0 = 5 *兰德(n, 1);ws = optimwarmstart (x0,选项);
创造并解决第一个问题。找出解决的时间。
r = 1: n - 1;制作向量的索引v (n) = (1) ^ (n + 1) / n;分配向量vv (r) = (1) ^ (r + 1) / r;C =画廊(“线性”, v);C = (C, C);r = 1:2 * n;d (r) = n-r;磅= 5 * 1 (1,n);乌兰巴托= 5 * 1 (1,n);抽搐(ws、fval ~、exitflag、输出]= lsqlin (C, d ,[],[],[],[], 磅,乌兰巴托,ws) toc
运行时间为0.005117秒。
添加一个线性约束,然后再次求解。
一个= 1 (1,n);b = -10;抽搐(ws、fval ~、exitflag、输出]= lsqlin (C, d, A, b,[],[],磅,乌兰巴托,ws) toc
运行时间为0.001491秒。
输入参数
C
- - - - - -矩阵乘法器
真正的矩阵
乘数矩阵,指定为双精度矩阵。C
表示解的乘数x
在表达C * x - d
.C
是米
——- - - - - -N
,在那里米
方程的个数,和N
元素的个数是x
.
例子:C =(1, 4, 2、5、7、8)
数据类型:双
d
- - - - - -常数向量
真正的向量
常数向量,指定为一个双精度向量。d
表示表达式中的附加常数项C * x - d
.d
是米
——- - - - - -1
,在那里米
是方程的个数。
例子:d = [5, 0, -12)
数据类型:双
一个
- - - - - -线性不等式约束
真正的矩阵
线性不等式约束,指定为实矩阵。一个
是一个米
——- - - - - -N
矩阵,米
不等式的个数,和N
变量的个数(元素的个数?x0
).对于大问题,不考虑一个
作为一个稀疏矩阵。
一个
编码米
线性不等式
A * x < =
,
在哪里x
列向量是N
变量x (:)
,b
列向量是米
元素。
例如,考虑以下这些不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30日
通过输入以下约束指定不等式。
= [1, 2, 3, 4, 5, 6);b =(10、20、30);
例子:要指定x分量的和为1或更小,请使用一个= 1 (1,N)
而且b = 1
.
数据类型:双
b
- - - - - -线性不等式约束
真正的向量
线性不等式约束,指定为实向量。b
是一个米
元素向量相关的一个
矩阵。如果你通过b
作为行向量,求解器内部转换b
到列向量b (:)
.对于大问题,不考虑b
作为一个稀疏向量。
b
编码米
线性不等式
A * x < =
,
在哪里x
列向量是N
变量x (:)
,一个
矩阵的大小米
——- - - - - -N
.
例如,考虑以下这些不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30。
通过输入以下约束指定不等式。
= [1, 2, 3, 4, 5, 6);b =(10、20、30);
例子:要指定x分量的和为1或更小,请使用一个= 1 (1,N)
而且b = 1
.
数据类型:双
Aeq
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。Aeq
是一个我
——- - - - - -N
矩阵,我
等式的个数,和N
变量的个数(元素的个数?x0
).对于大问题,不考虑Aeq
作为一个稀疏矩阵。
Aeq
编码我
线性等式
Aeq * x =说真的
,
在哪里x
列向量是N
变量x (:)
,说真的
列向量是我
元素。
例如,考虑以下这些不等式:
x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20,
通过输入以下约束指定不等式。
Aeq =[1、2、3、2、4、1];说真的=(10、20);
例子:要指定x分量的和为1,使用Aeq = 1 (1, N)
而且说真的= 1
.
数据类型:双
说真的
- - - - - -线性等式约束
真正的向量
线性等式约束,指定为实向量。说真的
是一个我
元素向量相关的Aeq
矩阵。如果你通过说真的
作为行向量,求解器内部转换说真的
到列向量说真的(:)
.对于大问题,不考虑说真的
作为一个稀疏向量。
说真的
编码我
线性等式
Aeq * x =说真的
,
在哪里x
列向量是N
变量x (:)
,Aeq
矩阵的大小我
——- - - - - -N
.
例如,考虑以下等式:
x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20。
通过输入以下约束来指定等式。
Aeq =[1、2、3、2、4、1];说真的=(10、20);
例子:要指定x分量的和为1,使用Aeq = 1 (1, N)
而且说真的= 1
.
数据类型:双
磅
- - - - - -下界
[]
(默认)|实向量或数组
下界,指定为向量或双精度值数组。磅
中元素的下界磅
≤x
≤乌兰巴托
.
在内部,lsqlin
将一个数组磅
的向量磅(:)
.
例子:磅=[0;无穷;4)
意味着x(1)≥0
,x(3)≥4
.
数据类型:双
乌兰巴托
- - - - - -上界
[]
(默认)|实向量或数组
上界,指定为vector或double类型数组。乌兰巴托
中elementwise的上界磅
≤x
≤乌兰巴托
.
在内部,lsqlin
将一个数组乌兰巴托
的向量乌兰巴托(:)
.
例子:乌兰巴托= (Inf; 4; 10)
意味着x(2)≤4
,x(3)≤10
.
数据类型:双
x0
- - - - - -初始点
[]
(默认)|实向量或数组
求解过程的初始点,指定为实向量或数组。的“trust-region-reflective”
而且“激活集”
算法使用x0
(可选)。
如果不指定x0
为“trust-region-reflective”
或“激活集”
算法,lsqlin
集x0
到零向量。如果这个零向量的任何分量x0
违背了界限,lsqlin
集x0
到由边界定义的盒子内部的一点。
例子:x0 = (4; 3)
数据类型:双
选项
- - - - - -选项lsqlin
选择使用optimoptions
|结构,如创建的optimset
选项lsqlin
的输出optimoptions
功能或结构,如由optimset
.
的选项中缺少一些选项optimoptions
显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项.
所有的算法
|
选择的算法:
的 的 当问题没有约束条件时, 如果您有大量的线性约束,而没有大量的变量,请尝试 有关选择算法的更多信息,请参见选择算法. |
诊断 | 显示关于要最小化或解决的功能的诊断信息。的选择是 |
显示 |
返回到命令行的显示级别。
的
|
MaxIterations |
允许的最大迭代次数,一个正整数。默认值为 为 |
trust-region-reflective
算法的选择
FunctionTolerance |
函数值上的终止公差为正标量。默认值是 为 |
JacobianMultiplyFcn |
雅可比矩阵乘法函数,指定为函数句柄。对于大规模的结构化问题,该函数应计算雅可比矩阵乘积 W = jmfun(动力系统,Y,标志) 在哪里
在每种情况下, 看到线性最小二乘的雅可比矩阵乘法了一个例子。 为 |
MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数,一个正标量。默认值是 |
OptimalityTolerance |
一阶最优性上的终止公差为正标量。默认值是 为 |
PrecondBandWidth | PCG(预条件共轭梯度)预处理器的上带宽。缺省情况下,使用对角预处理(上带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置 |
SubproblemAlgorithm |
确定如何计算迭代步骤。默认的, |
TolPCG | PCG(预条件共轭梯度)迭代的终止公差为正标量。默认值是 |
TypicalX |
典型的 |
内点
算法的选择
“激活集”
算法的选择
ConstraintTolerance |
对约束违例的容忍度,是一个正标量。默认值为 为 |
ObjectiveLimit |
一个标量的公差(停止标准)。如果目标函数值低于 |
OptimalityTolerance |
一阶最优性上的终止公差为正标量。默认值为 为 |
StepTolerance |
终止上公差 为 |
问题
- - - - - -优化问题
结构
优化问题,指定为具有以下字段的结构。
|
矩阵乘数C * x - d |
|
项的加性常数C * x - d |
|
矩阵用于线性不等式约束 |
|
线性不等式约束的向量 |
|
矩阵用于线性等式约束 |
|
线性等式约束的向量 |
磅 |
下界向量 |
乌兰巴托 |
上界向量 |
|
初始点x |
|
“lsqlin” |
|
选择创建optimoptions |
请注意
你不能用暖开始问题
论点。
数据类型:结构体
ws
- - - - - -热启动对象
对象创建使用optimwarmstart
对象,指定为使用创建的对象optimwarmstart
.warm start对象包含起始点和选项,以及代码生成中内存大小的可选数据。看到热启动最佳实践.
例子:ws = optimwarmstart (x0,选项)
输出参数
x
——解决方案
真正的向量
的范数最小化的向量C * x d
服从所有边界和线性约束。
wsout
—解决方案热启动对象
LsqlinWarmStart
对象
解决方案热启动对象,返回为LsqlinWarmStart
对象。解决点是wsout。X
.
您可以使用wsout
作为后续对象中的输入热启动对象lsqlin
调用。
resnorm
——客观价值
真正的标量
目标值,作为标量值返回规范(C * x d) ^ 2
.
剩余
——解决残差
真正的向量
解残差,作为向量返回C * x d
.
exitflag
-算法停止条件
整数
算法停止条件,返回为整数,标识算法停止的原因。的值如下所示exitflag
以及相应的原因lsqlin
停止了。
|
残留的变化小于规定的公差 |
|
步长小于 |
|
函数收敛到一个解 |
|
超过的迭代次数 |
|
这个问题是不可行的。或, |
3 |
这个问题没有界限。 |
|
条件不良阻碍了进一步优化。 |
|
无法计算步长方向。 |
的退出消息内点
算法可以给出更详细的原因lsqlin
停止,如超过容忍。看到退出标志和退出消息.
输出
-解决过程总结
结构
解决方案流程摘要,作为包含优化流程信息的结构返回。
|
求解器的迭代次数。 |
|
这些算法之一:
对于无约束问题, |
|
的约束违例,对于违例的约束为正(不返回
|
|
退出消息。 |
|
解的一阶最优性。看到一阶最优性测量. |
linearsolver |
内部线性求解器的类型, |
|
求解器执行的共轭梯度迭代的次数。的非空 |
看到输出结构.
λ
——拉格朗日乘数法
结构
提示
对于没有约束的问题,您可以使用
mldivide
(矩阵左部)。当你没有约束时,lsqlin
返回x = C \ d
.因为被解决的问题总是凸的,
lsqlin
找到一个全局的(尽管不一定是唯一的)解决方案。如果您的问题有很多线性约束和很少的变量,请尝试使用
“激活集”
算法。看到具有许多线性约束的二次规划.如果显式指定等式,可能会得到更好的数值结果
Aeq
而且说真的
,而不是隐式地使用磅
而且乌兰巴托
.的
trust-region-reflective
算法不允许相等的上下界。在这种情况下使用另一种算法。如果问题的指定输入边界不一致,则输出
x
是x0
和输出resnorm
而且剩余
是[]
.您可以解决一些大型的结构化问题,包括那些
C
矩阵太大,内存无法容纳trust-region-reflective
具有雅可比矩阵乘法函数的算法。信息,请参阅trust-region-reflective算法的选择.
算法
Trust-Region-Reflective算法
该方法是一种基于内反射牛顿法的子空间信赖域方法[1].每次迭代都使用预条件共轭梯度(PCG)方法对一个大型线性系统进行近似求解。看到Trust-Region-Reflective最小二乘,特别是大尺度线性最小二乘.
内点算法
的“内点”
算法是基于的quadprog
“interior-point-convex”
算法。看到线性最小二乘:内点或活动集.
有效集算法
的“激活集”
算法是基于的quadprog
“激活集”
算法。有关更多信息,请参见线性最小二乘:内点或活动集而且激活集quadprog算法.
参考文献
[1]科尔曼,T. F.和李宇春。求受某些变量边界约束的二次函数最小值的反射牛顿法SIAM优化期刊1996年,第6卷第4期,第1040-1058页。
吉尔,p.e., W.默里,M. H.赖特。实用的优化,文献出版社,英国伦敦,1981年。
温暖的开始
warm start对象维护前面解决的问题的活动约束列表。求解器携带尽可能多的活动约束信息来解决当前问题。如果前面的问题与当前的问题差异太大,则不会重用任何活动集信息。在这种情况下,求解器有效地执行冷启动,以便重新构建活动约束列表。
选择功能
应用程序
的优化Live Editor任务提供了一个可视化的界面lsqlin
.
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
lsqlin
方法支持代码生成codegen
(MATLAB编码器)函数或MATLAB®编码器™你一定有一个MATLAB编码器生成代码的许可证。目标硬件必须支持标准的双精度浮点计算。不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能不同于求解器解决方案,特别是对于条件较差的问题。
在MATLAB中求解无约束欠定问题时,
lsqlin
调用mldivide
,它返回一个基本解。在代码生成中,返回的解具有最小范数,通常是不同的。lsqlin
不支持问题
代码生成的参数。[x, fval] = lsqlin(问题)%不支持
所有
lsqlin
输入矩阵如一个
,Aeq
,磅
,乌兰巴托
必须是饱满的,而不是稀疏的。方法可以将稀疏矩阵转换为全矩阵完整的
函数。的
磅
而且乌兰巴托
参数的条目数必须与中的列数相同C
或者必须为空[]
.如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
.对于涉及嵌入式处理器的高级代码优化,还需要一个嵌入式Coder®许可证。
你必须包含选项
lsqlin
并使用optimoptions
.选项必须包含算法
选项,设置为“激活集”
.选择= optimoptions (“lsqlin”,“算法”,“激活集”);[x, fval exitflag] = lsqlin (C, d, A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
代码生成支持以下选项:
算法
——必须“激活集”
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成的代码对选项的错误检查是有限的。更新选项的推荐方法是使用
optimoptions
,而不是点符号。选择= optimoptions (“lsqlin”,“算法”,“激活集”);选择= optimoptions(选择,“MaxIterations”1 e4);%推荐选择。米axIterations = 1e4;%不推荐
不要从文件中加载选项。这样做可能导致代码生成失败。相反,在代码中创建选项。
如果指定的选项不受支持,则在代码生成过程中通常会忽略该选项。要获得可靠的结果,请只指定支持的选项。
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。