主要内容

lsqlin

解决约束线性最小二乘问题

描述

有界或线性约束的线性最小二乘求解器。

解决了形式的最小二乘曲线拟合问题

最小值 x 1 2 C x d 2 2 这样 一个 x b 一个 e x b e l b x u b

请注意

lsqlin只适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于求解器的方法

例子

x= lsqlin (Cd一个b求解线性系统C * x = d在最小二乘意义上,受制于* xb

例子

x= lsqlin (Cd一个bAeq说真的乌兰巴托增加线性等式约束Aeq * x =说真的和范围x乌兰巴托.如果不需要某些约束,如Aeq而且说真的,设置为[].如果x(我)下面是无界的,集合磅(i) =负无穷,如果x(我)上面是无界的,集合吗乌兰巴托(i) =正无穷

例子

x= lsqlin (Cd一个bAeq说真的乌兰巴托x0选项在初始点处最小化x0和中指定的优化选项选项.使用optimoptions设置这些选项。如果不希望包含初始点,请设置x0参数[]

x= lsqlin (问题找到最小值问题中描述的结构问题.创建问题结构使用点表示法或结构体函数。或者创建一个问题结构的OptimizationProblem对象的使用prob2struct

例子

xresnorm剩余exitflag输出λ) = lsqlin (___,对于上面描述的任何输入参数,返回:

  • 残差的平方2范数resnorm = C x d 2 2

  • 剩余残差= C*x - d

  • 一个值exitflag描述退出条件

  • 一个结构输出包含关于优化过程的信息

  • 一个结构λ包含拉格朗日乘子

    问题定义中的因子1 / 2影响λ结构。

例子

wsoutresnorm剩余exitflag输出λ) = lsqlin (Cd一个bAeq说真的乌兰巴托ws开始lsqlin从温暖启动对象中的数据ws,使用中的选项ws.返回的参数wsout包含解点wsout。X.通过使用wsout作为后续求解器调用中的初始热启动对象,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表示解的乘数x在表达C * x - dC——- - - - - -N,在那里方程的个数,和N元素的个数是x

例子:C =(1, 4, 2、5、7、8)

数据类型:

常数向量,指定为一个双精度向量。d表示表达式中的附加常数项C * x - dd——- - - - - -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编码线性不等式

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是一个——- - - - - -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)≥0x(3)≥4

数据类型:

上界,指定为vector或double类型数组。乌兰巴托中elementwise的上界x乌兰巴托

在内部,lsqlin将一个数组乌兰巴托的向量乌兰巴托(:)

例子:乌兰巴托= (Inf; 4; 10)意味着x(2)≤4x(3)≤10

数据类型:

求解过程的初始点,指定为实向量或数组。的“trust-region-reflective”而且“激活集”算法使用x0(可选)。

如果不指定x0“trust-region-reflective”“激活集”算法,lsqlinx0到零向量。如果这个零向量的任何分量x0违背了界限,lsqlinx0到由边界定义的盒子内部的一点。

例子:x0 = (4; 3)

数据类型:

选项lsqlin的输出optimoptions功能或结构,如由optimset

的选项中缺少一些选项optimoptions显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项

所有的算法

算法

选择的算法:

  • “内点”(默认)

  • “trust-region-reflective”

  • “激活集”

“trust-region-reflective”算法只允许上界和下界,不允许线性不等式或等式。如果您同时指定“trust-region-reflective”算法和线性约束,lsqlin使用“内点”算法。

“trust-region-reflective”算法不允许相等的上下界。

当问题没有约束条件时,lsqlin调用mldivide在内部。

如果您有大量的线性约束,而没有大量的变量,请尝试“激活集”算法。

有关选择算法的更多信息,请参见选择算法

诊断

显示关于要最小化或解决的功能的诊断信息。的选择是“上”或默认“关闭”

显示

返回到命令行的显示级别。

  • “关闭”“没有”显示没有输出。

  • “最后一次”只显示最终输出(默认值)。

“内点”算法允许附加值:

  • “通路”给出了迭代显示。

  • “iter-detailed”提供迭代显示和详细的退出消息。

  • 最后详细的仅显示最终输出,并显示详细的退出消息。

MaxIterations

允许的最大迭代次数,一个正整数。默认值为2000“激活集”算法,200对于其他算法。

optimset,选项名称为麦克斯特.看到当前和遗留选项名称

trust-region-reflective算法的选择

FunctionTolerance

函数值上的终止公差为正标量。默认值是100 *每股收益,大约2.2204 e-14

optimset,选项名称为TolFun.看到当前和遗留选项名称

JacobianMultiplyFcn

雅可比矩阵乘法函数,指定为函数句柄。对于大规模的结构化问题,该函数应计算雅可比矩阵乘积C * YC ' * Y,或C”* (C * Y)没有真正形成C.把函数写在表单中

W = jmfun(动力系统,Y,标志)

在哪里动力系统包含用于计算的矩阵C * Y(或C ' * Y,或C”* (C * Y)).

jmfun必须计算三个不同产品中的一个,取决于的值2022世界杯八强谁会赢?国旗lsqlin通过:

  • 如果标志= = 0然后W = C ' * (C * Y)

  • 如果国旗> 0然后W = C * Y

  • 如果国旗< 0然后W = C ' * Y

在每种情况下,jmfun不需要形式C明确。lsqlin使用动力系统计算前置条件。看到传递额外的参数有关如何在必要时提供额外参数的信息。

看到线性最小二乘的雅可比矩阵乘法了一个例子。

optimset,选项名称为JacobMult.看到当前和遗留选项名称

MaxPCGIter

PCG(预条件共轭梯度)迭代的最大次数,一个正标量。默认值是马克斯(1楼(numberOfVariables / 2)).有关更多信息,请参见Trust-Region-Reflective算法

OptimalityTolerance

一阶最优性上的终止公差为正标量。默认值是100 *每股收益,大约2.2204 e-14.看到一阶最优性测量

optimset,选项名称为TolFun.看到当前和遗留选项名称

PrecondBandWidth

PCG(预条件共轭梯度)预处理器的上带宽。缺省情况下,使用对角预处理(上带宽为0)。对于某些问题,增加带宽可以减少PCG迭代次数。设置PrecondBandWidth使用直接因式分解(Cholesky)而不是共轭梯度(CG)。直接因式分解在计算上比CG更昂贵,但产生了更好的解决方法。有关更多信息,请参见Trust-Region-Reflective算法

SubproblemAlgorithm

确定如何计算迭代步骤。默认的,“重心”的步骤更快,但没有“分解”.看到Trust-Region-Reflective最小二乘

TolPCG

PCG(预条件共轭梯度)迭代的终止公差为正标量。默认值是0.1

TypicalX

典型的x值。元素的数量TypicalX等于变量的个数。默认值为的(numberofvariables, 1)lsqlin使用TypicalX内部扩展。TypicalX只有当x有无界分量,当aTypicalX值的值大于1

内点算法的选择

ConstraintTolerance

对约束违例的容忍度,是一个正标量。默认值是1 e-8

optimset,选项名称为TolCon.看到当前和遗留选项名称

LinearSolver

算法中的内线性求解器类型:

  • “汽车”(默认)——使用“稀疏”如果C矩阵是稀疏的,“密集”否则。

  • “稀疏”-使用稀疏线性代数。看到稀疏矩阵

  • “密集”-使用密集线性代数。

OptimalityTolerance

一阶最优性上的终止公差为正标量。默认值是1 e-8.看到一阶最优性测量

optimset,选项名称为TolFun.看到当前和遗留选项名称

StepTolerance

终止上公差x,一个正标量。默认值是1 e-12

optimset,选项名称为TolX.看到当前和遗留选项名称

“激活集”算法的选择

ConstraintTolerance

对约束违例的容忍度,是一个正标量。默认值为1 e-8

optimset,选项名称为TolCon.看到当前和遗留选项名称

ObjectiveLimit

一个标量的公差(停止标准)。如果目标函数值低于ObjectiveLimit如果当前点是可行的,迭代就会停止,因为问题是无界的。默认值为1 e20

OptimalityTolerance

一阶最优性上的终止公差为正标量。默认值为1 e-8.看到一阶最优性测量

optimset,名字是TolFun.看到当前和遗留选项名称

StepTolerance

终止上公差x,一个正标量。默认值为1 e-8

optimset,选项名称为TolX.看到当前和遗留选项名称

优化问题,指定为具有以下字段的结构。

C

矩阵乘数C * x - d

d

项的加性常数C * x - d

Aineq

矩阵用于线性不等式约束

bineq

线性不等式约束的向量

Aeq

矩阵用于线性等式约束

说真的

线性等式约束的向量
下界向量
乌兰巴托 上界向量

x0

初始点x

解算器

“lsqlin”

选项

选择创建optimoptions

请注意

你不能用暖开始问题论点。

数据类型:结构体

对象,指定为使用创建的对象optimwarmstart.warm start对象包含起始点和选项,以及代码生成中内存大小的可选数据。看到热启动最佳实践

例子:ws = optimwarmstart (x0,选项)

输出参数

全部折叠

的范数最小化的向量C * x d服从所有边界和线性约束。

解决方案热启动对象,返回为LsqlinWarmStart对象。解决点是wsout。X

您可以使用wsout作为后续对象中的输入热启动对象lsqlin调用。

目标值,作为标量值返回规范(C * x d) ^ 2

解残差,作为向量返回C * x d

算法停止条件,返回为整数,标识算法停止的原因。的值如下所示exitflag以及相应的原因lsqlin停止了。

3.

残留的变化小于规定的公差选项。FunctionTolerance.(trust-region-reflective算法)

2

步长小于选项。StepTolerance、约束满足。(内点算法)

1

函数收敛到一个解x

0

超过的迭代次数选项。麦克斯特ations

-2

这个问题是不可行的。或,内点算法,步长小于选项。StepTolerance,但不满足约束。

3 这个问题没有界限。

4

条件不良阻碍了进一步优化。

8

无法计算步长方向。

的退出消息内点算法可以给出更详细的原因lsqlin停止,如超过容忍。看到退出标志和退出消息

解决方案流程摘要,作为包含优化流程信息的结构返回。

迭代

求解器的迭代次数。

算法

这些算法之一:

  • “内点”

  • “trust-region-reflective”

  • “mldivide”对于一个无约束问题

对于无约束问题,迭代的其余项输出结构是空的。

constrviolation

的约束违例,对于违例的约束为正(不返回“trust-region-reflective”算法)。

constrviolation = max([0;规范(Aeq * x-beq,正无穷);(lb-x); (x-ub);(*取向)))

消息

退出消息。

firstorderopt

解的一阶最优性。看到一阶最优性测量

linearsolver

内部线性求解器的类型,“密集”“稀疏”“内点”算法只)

cgiterations

求解器执行的共轭梯度迭代的次数。的非空“trust-region-reflective”算法。

看到输出结构

拉格朗日乘子,作为具有以下字段的结构返回。

较低的

下界

上界乌兰巴托

ineqlin

线性不等式

eqlin

线性等式

看到拉格朗日乘子的结构

提示

  • 对于没有约束的问题,您可以使用mldivide(矩阵左部)。当你没有约束时,lsqlin返回x = C \ d

  • 因为被解决的问题总是凸的,lsqlin找到一个全局的(尽管不一定是唯一的)解决方案。

  • 如果您的问题有很多线性约束和很少的变量,请尝试使用“激活集”算法。看到具有许多线性约束的二次规划

  • 如果显式指定等式,可能会得到更好的数值结果Aeq而且说真的,而不是隐式地使用而且乌兰巴托

  • trust-region-reflective算法不允许相等的上下界。在这种情况下使用另一种算法。

  • 如果问题的指定输入边界不一致,则输出xx0和输出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

扩展功能

版本历史

之前介绍过的R2006a

Baidu
map