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=beq界限x乌兰巴托. 如果you do not need certain constraints such asAeq说真的,设置为[]. 如果x(我)下面是无界的吗磅(i) =负无穷,如果x(我)上面是无界的,集合乌兰巴托(i) =正无穷

例子

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

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

例子

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

  • 残差的平方模重新规范= C x d 2 2

  • 剩余残差= C*x - d

  • 一个值exitflag描述退出条件

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

  • 一个结构兰姆达包含拉格朗日乘数

    问题定义中的因子½影响兰姆达结构。

例子

全部折叠

找到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×10.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 Primal infas Dual infas complement 0 -7.687420e-02 1.600492e+00 6.150431e-01 1.000000e+00 1 -7.687419e-02 8.002458e-04 3.075216e-04 2.430833e-01 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.912129e-01 9.997558e-14 1.006816e- 01 2.0048273e -03 5 -3.948062e-01发现满足约束条件的最小值为3.953582e-01优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
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
输出=结构体字段:消息:“…”算法:“内部点”firstorderopt:4.3374e-11冲突:0次迭代:6次线性解决方案:“密集”cgiterations:[]
λ=结构体字段:ineqlin:[3x1双精度]eqlin:[0x1双精度]下部:[4x1双精度]上部:[4x1双精度]

更详细地检查非零拉格朗日乘子场。首先检查线性不等式约束的拉格朗日乘子。

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

输入参数

全部折叠

乘子矩阵,指定为双精度矩阵。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日

输入这些约束:

A=[1,2;3,4;5,6];b=[10;20;30];

例子:要指定x分量的和为1或更小,请使用A=一(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。

通过输入以下约束来指定不等式。

A=[1,2;3,4;5,6];b=[10;20;30];

例子:要指定x分量的和为1或更小,请使用A=一(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];说真的=(10、20);

例子:要指定x分量的和为1,使用Aeq = 1 (1, N)说真的= 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];说真的=(10、20);

例子:要指定x分量的和为1,使用Aeq = 1 (1, N)说真的= 1

数据类型:

下界,指定为双精度向量或数组。表示元素方向的下界x乌兰巴托

在内部,lsqlin将一个数组的向量磅(:)

例子:lb=[0;-Inf;4]意味着x(1)≥ 0x(3)≥4

数据类型:

上界,指定为双精度向量或数组。乌兰巴托表示元素的上界x乌兰巴托

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

例子:乌兰巴托= (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功能或结构,如由优化集

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

所有的算法

算法

选择算法:

  • “内点”(默认)

  • “trust-region-reflective”

  • “激活集”

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

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

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

如果你有大量的线性约束而不是大量的变量,尝试“激活集”算法。

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

诊断学

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

展示

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

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

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

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

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

  • “iter-detailed”给出一个详细的退出消息的迭代显示。

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

MaxIterations

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

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

trust-region-reflective算法的选择

FunctionTolerance

函数值上的终止容差,一个正标量。默认值是100*eps,大约2.2204 e-14

优化集,选项名称为TolFun.看到当前和遗留选项名称

JacobianMultiplyFcn

雅可比乘函数,指定为函数句柄。对于大规模结构化问题,此函数应计算雅可比矩阵乘积C * YC ' * YC'*(C*Y)没有真正形成C.将函数写成这种形式

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

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

jmfun必须计算三种不同产品中的一种,具体取决于s manbetx 845国旗lsqlin通过:

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

  • 如果标志>0然后W = C * Y

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

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

看到雅可比函数与线性最小二乘举个例子。

优化集,选项名称为雅各布穆特.看到当前和遗留选项名称

MaxPCGIter

PCG(预处理共轭梯度)迭代的最大次数,正标量。默认值是马克斯(1楼(numberOfVariables / 2)). 有关详细信息,请参阅Trust-Region-Reflective算法

最佳耐受性

一阶最优性的终止容限,一个正标量。默认值是100*eps,大约2.2204 e-14.看到一阶最优性测量

优化集,选项名称为TolFun.看到当前和遗留选项名称

预带宽

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

子问题算法

确定迭代步骤的计算方式。默认情况下,“cg”,比。要快但不准确的一步“分解”.看到Trust-Region-Reflective最小二乘

TolPCG

PCG(预处理共轭梯度)迭代上的终止容差,一个正标量。默认值是0.1

TypicalX

典型的x价值观中的元素数TypicalX等于变量的个数。默认值为一(numberofvariables,1)lsqlin使用TypicalX内部扩展。TypicalX只有在什么时候才有效果x有无界分量,当aTypicalX值大于1

内点算法的选择

约束耐受性

约束冲突的容差,正标量。默认值是1e-8

优化集,选项名称为TolCon.看到当前和遗留选项名称

LinearSolver

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

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

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

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

最佳耐受性

一阶最优性的终止容限,一个正标量。默认值是1e-8.看到一阶最优性测量

优化集,选项名称为TolFun.看到当前和遗留选项名称

阶跃公差

端接公差x,一个正标量。默认值是1e-12

优化集,选项名称为TolX.看到当前和遗留选项名称

“激活集”算法的选择

约束耐受性

约束冲突的容差,正标量。默认值为1e-8

优化集,选项名称为TolCon.看到当前和遗留选项名称

ObjectiveLimit

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

最佳耐受性

一阶最优性的终止容限,一个正标量。默认值为1e-8.看到一阶最优性测量

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

阶跃公差

端接公差x,一个正标量。默认值为1e-8

优化集,选项名称为TolX.看到当前和遗留选项名称

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

C

术语中的矩阵乘法器C * x - d

d

这一项的加法常数C * x - d

Aineq

线性不等式约束的矩阵

比内克

线性不等式约束的向量

Aeq

线性等式约束的矩阵

说真的

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

x0

初始点x

解算器

“lsqlin”

选项

选择创建optimoptions

数据类型:结构体

输出参数

全部折叠

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

作为标量值返回的客观值范数(C*x-d)^2

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

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

3.

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

2

步长小于选项。阶跃公差,满足约束条件。(内点算法)

1

函数收敛到一个解x

0

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

-2

这个问题不可行。或,内点算法,步长小于选项。阶跃公差,但不满足约束条件。

-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)方法求解一个大线性系统的近似解。看到Trust-Region-Reflective最小二乘,特别是大规模线性最小二乘

内点算法

“内点”算法是基于quadprog“interior-point-convex”算法。看见线性最小二乘:内部点或活动集

有效集算法

“激活集”算法是基于quadprog“激活集”算法。有关更多信息,请参见线性最小二乘:内部点或活动集主动集quadprog算法

参考文献

[1] 科尔曼、T.F.和Y.Li。一种反射牛顿法,用于最小化受某些变量边界约束的二次函数SIAM优化学报,第6卷,第4期,第1040-1058页,1996。

吉尔,P. E., W.默里和M. H.赖特。实用的优化,学术出版社,伦敦,英国,1981年。

选择功能

应用程序

优化活动编辑器任务为lsqlin

之前介绍过的R2006a