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];Beq = 4;Lb = -0.1*ones(4,1);Ub = 2*ones(4,1);
调用lsqlin
解决问题。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
最小值满足约束条件。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
x =4×10.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 complementas 0 -7.687420e-02 1.600492e+00 6.150431e-01 1.000000e+00 1 -7.687419e-02 8.002458e-04 3.075216e-04 3.430833e -02 2 -3.162837e-01 4.001229e-07 1.537608e-07 5.945636e-02 3 -3.760545e-01 2.000615e-10 2.036997e-08 1.370933e-02 4 - 3.9121245e -01 9.994783e-14 1.006816e- 01 2.775558e-17 2.955102e-09 4.295807e-04 6 -3.953277e-01 2.775558e-17 1.23777758e -09 1.138719e-07 8-3.953582e-01 2.498002e-16 2.399331e-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];Lb = -0.1*ones(4,1);Ub = 2*ones(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
输出=带字段的结构:消息:'最小值发现满足约束....'算法:'内部点' firstorderopt: 4.3374e-11 constrviolation: 0迭代:6线性求解器:'密集' cgiterations: []
λ=带字段的结构:Ineqlin: [3x1 double] eqlin: [0x1 double] lower: [4x1 double] upper: [4x1 double]
更详细地检查非零拉格朗日乘子场。首先检验线性不等式约束的拉格朗日乘子。
lambda.ineqlin
ans =3×10.000 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
.
返回暖启动对象
创建一个暖启动对象,以便快速解决修改后的问题。设置选项以关闭迭代显示以支持热启动。金宝app
rng默认的%用于再现性选项= optimoptions(“lsqlin”,“算法”,“激活集”,“显示”,“关闭”);N = 15;X0 = 5*rand(n,1);Ws = optimwarmstart(x0,options);
创造并解决第一个问题。找出解决的时间。
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;Lb = -5*ones(1,n);Ub = 5*ones(1,n);抽搐(ws、fval ~、exitflag、输出]= lsqlin (C, d ,[],[],[],[], 磅,乌兰巴托,ws) toc
运行时间为0.005117秒。
加上一个线性约束,重新求解。
A = ones(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 <= b
,
在哪里x
列向量是N
变量x (:)
,b
列向量是米
元素。
例如,考虑以下不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30日
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6];B = [10;20;30];
例子:要指定x分量的和为1或更小,请使用A = ones(1,N)
而且B = 1
.
数据类型:双
b
- - - - - -线性不等式约束
真正的向量
线性不等式约束,指定为实向量。b
是一个米
元素的相关向量一个
矩阵。如果你通过了b
作为行向量,解算器内部转换b
对列向量b (:)
.对于大问题,可以通过b
作为一个稀疏向量。
b
编码米
线性不等式
A*x <= b
,
在哪里x
列向量是N
变量x (:)
,一个
矩阵的大小米
——- - - - - -N
.
例如,考虑以下不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30。
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6];B = [10;20;30];
例子:要指定x分量的和为1或更小,请使用A = ones(1,N)
而且B = 1
.
数据类型:双
Aeq
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。Aeq
是一个我
——- - - - - -N
矩阵,我
等式的个数,和N
变量的数量(元素的数量x0
).对于大问题,可以通过Aeq
作为一个稀疏矩阵。
Aeq
编码我
线性等式
Aeq*x = beq
,
在哪里x
列向量是N
变量x (:)
,说真的
列向量是我
元素。
例如,考虑以下不等式:
x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20,
通过输入以下约束来指定不等式。
Aeq = [1,2,3;2,4,1];Beq = [10;20];
例子:要指定x分量的和为1,使用Aeq = ones(1,N)
而且Beq = 1
.
数据类型:双
说真的
- - - - - -线性等式约束
真正的向量
线性等式约束,指定为实向量。说真的
是一个我
元素的相关向量Aeq
矩阵。如果你通过了说真的
作为行向量,解算器内部转换说真的
对列向量说真的(:)
.对于大问题,可以通过说真的
作为一个稀疏向量。
说真的
编码我
线性等式
Aeq*x = beq
,
在哪里x
列向量是N
变量x (:)
,Aeq
矩阵的大小我
——- - - - - -N
.
例如,考虑以下等式:
x1+ 2x2+ 3x3.= 10
2x1+ 4x2+x3.= 20。
通过输入以下约束来指定等式。
Aeq = [1,2,3;2,4,1];Beq = [10;20];
例子:要指定x分量的和为1,使用Aeq = ones(1,N)
而且Beq = 1
.
数据类型:双
磅
- - - - - -下界
[]
(默认)|实向量或数组
下界,指定为vector或double数组。磅
中以元素方式表示下界磅
≤x
≤乌兰巴托
.
在内部,lsqlin
转换数组磅
对向量磅(:)
.
例子:lb = [0;-Inf;4]
意味着X(1)≥0
,X(3)≥4
.
数据类型:双
乌兰巴托
- - - - - -上界
[]
(默认)|实向量或数组
上界,指定为vector或double类型数组。乌兰巴托
中以元素方式表示上界磅
≤x
≤乌兰巴托
.
在内部,lsqlin
转换数组乌兰巴托
对向量乌兰巴托(:)
.
例子:ub = [Inf;4;10]
意味着X(2)≤4
,X(3)≤10
.
数据类型:双
x0
- - - - - -初始点
[]
(默认)|实向量或数组
求解过程的初始点,指定为实向量或数组。的“trust-region-reflective”
而且“激活集”
算法使用x0
(可选)。
如果您没有指定x0
为“trust-region-reflective”
或“激活集”
算法,lsqlin
集x0
到0向量。如果这个零向量的任何分量x0
违反了边界,lsqlin
集x0
到由边界定义的盒子内部的一点。
例子:X0 = [4;-3]
数据类型:双
选项
- - - - - -选项lsqlin
使用以下方法创建的选项optimoptions
|结构,如创建的optimset
选项lsqlin
属性的输出optimoptions
创建的功能或结构optimset
.
中缺少一些选项optimoptions
显示。这些选项在下表中以斜体字显示。详细信息请参见视图选项.
所有的算法
|
选择算法:
的 的 当问题没有约束条件时, 如果你有大量的线性约束,而不是大量的变量,尝试 有关选择算法的详细信息,请参见算法选择. |
诊断 | 显示有关要最小化或解决的功能的诊断信息。选项是 |
显示 |
返回到命令行的显示级别。
的
|
MaxIterations |
允许的最大迭代次数,一个正整数。默认值为 为 |
trust-region-reflective
算法的选择
FunctionTolerance |
函数值上的终止公差为正标量。默认为 为 |
JacobianMultiplyFcn |
雅可比乘法函数,指定为函数句柄。对于大规模的结构化问题,这个函数应该计算雅可比矩阵的乘积 W = jmfun(Jinfo,Y,flag) 在哪里
在每种情况下, 看到线性最小二乘雅可比乘法函数举个例子。 为 |
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
.暖启动对象包含起始点和选项,以及代码生成中内存大小的可选数据。看到热启动最佳实践.
例子:Ws = optimwarmstart(x0,options)
输出参数
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)方法求解大型线性系统的近似解。看到信任区域反射最小二乘,特别是大尺度线性最小二乘.
内点算法
的“内点”
算法是基于的quadprog
“interior-point-convex”
算法。看到线性最小二乘:内点或活动集.
有效集算法
的“激活集”
算法是基于的quadprog
“激活集”
算法。有关更多信息,请参见线性最小二乘:内点或活动集而且active-set quadprog算法.
参考文献
[1] Coleman, t.f., Li Y.。求二阶函数在某些变量上有界的最小值的反射牛顿法SIAM优化期刊,第6卷第4期,第1040-1058页,1996年。
[2]吉尔,p.e., W.默里和M. H.赖特。实用的优化,学术出版社,伦敦,英国,1981年。
温暖的开始
暖启动对象维护前一个已解决问题的活动约束列表。求解器携带尽可能多的主动约束信息来解决当前问题。如果前一个问题与当前问题差异太大,则不会重用活动集信息。在这种情况下,求解器有效地执行冷启动,以重新构建活动约束列表。
选择功能
应用程序
的优化活动编辑器任务提供了一个可视化界面lsqlin
.
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
lsqlin
金宝app方法支持代码生成codegen
(MATLAB编码器)函数或MATLAB®编码器™你必须有一个MATLAB编码器生成代码的许可。目标硬件必须支持标准的双精度浮点计算。金宝app不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能与求解器解决方案不同,特别是金宝搏官方网站对于条件较差的问题。
在MATLAB中求解无约束欠定问题时,
lsqlin
调用mldivide
,返回一个基本解。在代码生成过程中,返回的解具有最小范数,通常是不同的。lsqlin
不支持金宝app问题
用于代码生成的参数。[x,fval] = lsqlin(problem)%不支持金宝app
所有
lsqlin
输入矩阵,例如一个
,Aeq
,磅
,乌兰巴托
一定要满,不能疏。方法可以将稀疏矩阵转换为完整矩阵完整的
函数。的
磅
而且乌兰巴托
参数的项数必须与中的列数相同C
或者必须为空[]
.如果您的目标硬件不支持无限边界,请使用金宝app
optim.coder.infbound
.对于涉及嵌入式处理器的高级代码优化,还需要一个嵌入式编码器®许可证。
您必须包含的选项
lsqlin
并使用optimoptions
.选项必须包括算法
选项,设置为“激活集”
.选项= optimoptions(“lsqlin”,“算法”,“激活集”);[x,fval,exitflag] = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options);
代码生成支持以下选项:金宝app
算法
-肯定是“激活集”
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成的代码具有有限的选项错误检查。更新选项的推荐方法是使用
optimoptions
,不是点表示法。Opts = optimoptions(“lsqlin”,“算法”,“激活集”);Opts = optimoptions(Opts,“MaxIterations”1 e4);%推荐选择。米axIterations = 1e4;%不推荐
不要从文件中加载选项。这样做会导致代码生成失败。相反,在代码中创建选项。
如果指定了不受支持的选项,则在代码生成期间通常会忽略该选项。金宝app为了获得可靠的结果,只指定受支持的选项。金宝app
版本历史
R2006a之前介绍
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。