主要内容

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在最小二乘意义上,subject to* xb

例子

x= lsqlin (Cd一个bAeq说真的乌兰巴托增加线性等式约束Aeq*x = beq和范围x乌兰巴托.如果不需要某些约束,如Aeq而且说真的,设置为[].如果x(我)下面是无界的吗lb(i) = -无穷大,如果x(我)上面是无界的吗ub(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];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表示解的乘法器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 <= 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编码线性不等式

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

数据类型:

上界,指定为vector或double类型数组。乌兰巴托中以元素方式表示上界x乌兰巴托

在内部,lsqlin转换数组乌兰巴托对向量乌兰巴托(:)

例子:ub = [Inf;4;10]意味着X(2)≤4X(3)≤10

数据类型:

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

如果您没有指定x0“trust-region-reflective”“激活集”算法,lsqlinx0到0向量。如果这个零向量的任何分量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(Jinfo,Y,flag)

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

jmfun必须计算三个不同的产品之一,取决于的值下载188bet金宝搏国旗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

确定如何计算迭代步骤。默认的,“重心”,采取了更快但更不准确的步骤“分解”.看到信任区域反射最小二乘

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.暖启动对象包含起始点和选项,以及代码生成中内存大小的可选数据。看到热启动最佳实践

例子:Ws = optimwarmstart(x0,options)

输出参数

全部折叠

的范数最小化的向量返回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”对于一个无约束的问题

对于一个无约束的问题,迭代= 0,以及输出结构为空。

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)方法求解大型线性系统的近似解。看到信任区域反射最小二乘,特别是大尺度线性最小二乘

内点算法

“内点”算法是基于的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

扩展功能

版本历史

R2006a之前介绍