主要内容

lsqlin

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

描述

线性最小二乘解算器边界或线性约束。

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

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

请注意

lsqlin仅适用于solver-based方法。两种优化方法的讨论,请参阅首先选择具体问题具体分析或Solver-Based方法

例子

x= lsqlin (C,d,一个,b)解决了线性系统C * x = d在最小二乘意义上,* xb

例子

x= lsqlin (C,d,一个,b,Aeq,说真的,,乌兰巴托)增加了线性等式约束Aeq * x =说真的和范围x乌兰巴托。如果你不需要特定的约束等Aeq说真的,他们[]。如果x(我)下面是无界的,准备好了吗磅(i) =负无穷,如果x(我)上面是无界的,准备好了吗乌兰巴托(i) =正无穷

例子

x= lsqlin (C,d,一个,b,Aeq,说真的,,乌兰巴托,x0,选项)最大限度地减少初始点x0和优化选项中指定选项。使用optimoptions设置这些选项。如果你不想包含一个初始点,设置x0参数[]

x= lsqlin (问题)发现的最低标准问题描述的结构问题。创建问题使用点符号或结构结构体函数。或者创建一个问题结构的OptimizationProblem对象的使用prob2struct

例子

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

  • 的平方2-norm残留resnorm = C x d 2 2

  • 剩余剩余= C * x - d

  • 一个值exitflag描述了退出条件

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

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

    问题的定义中因素½影响中的值λ结构。

例子

(wsout,resnorm,剩余,exitflag,输出,λ)= lsqlin (C,d,一个,b,Aeq,说真的,,乌兰巴托,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);= (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);= (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);= (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 Resnorm原始Infeas双重Infeas互补e-01 0 6.545534 1.600492 6.150431 1.000000 e-01 e + e + 00 00 1 1.757343 6.545534 2.430833 3.075216 8.002458 e-01 e-04 e-04 e-01 2 e-01 2.000615 5.619277 4.001229 5.945636 1.537608 e-07 e-07 e-02 3 e-02平台以及1.006816 1.000589 2.587604 2.036997 1.370933 e-08 e-02 4 e-02 e-13 e-08 2.548273 e 03 5 1.764630 1.868939 4.295807 2.955102 2.775558 e-02 e-17 e-09 e-04 6 e-02 1.758561 0.000000 3.102850 1.237758 e + 00 e-09 e-05 7 e-02 2.775558 e-17 1.645863平台以及1.138719 e-07 8 1.758538 e-02 0.000000 e + 00 2.400302 e-13 5.693290 e-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);= (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.3374 e-11 constrviolation: 0迭代:6 linearsolver:“密集”cgiterations: []
λ=结构体字段:ineqlin: x1双[3]eqlin: [0 x1双]低:x1双[4]上:[4 x1双)

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

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

创建一个热启动对象,这样你就可以很快解决一个修改的问题。设置选项关掉迭代显示支持热启动。万博1manbetx

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
3x1+ 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
3x1+ 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

数据类型:

下界,指定为一个向量或双打的数组。代表了下界elementwisex乌兰巴托

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

例子:磅=[0;无穷;4)意味着x (1)≥0,x (3)≥4

数据类型:

上界,指定为一个向量或双打的数组。乌兰巴托代表了上界elementwisex乌兰巴托

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

例子:乌兰巴托= (Inf; 4; 10)意味着x (2)≤4,x (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 * Y,C ' * Y,或C”* (C * Y)没有真正形成C。写的函数形式

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

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

jmfun必须计算出三种不同的产品,根据的价值s manbetx 845国旗lsqlin通过:

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

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

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

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

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

optimset选项名称JacobMult。看到当前和遗留选项名称

MaxPCGIter

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

OptimalityTolerance

终止宽容的一阶最优性,积极的标量。默认值是100 *每股收益,大约2.2204 e-14。看到一阶最优性测量

optimset选项名称TolFun。看到当前和遗留选项名称

PrecondBandWidth

上带宽预调节器的首选(预处理共轭梯度)。默认情况下,对角预处理(0)上带宽。用于一些问题,增加带宽减少了PCG迭代的数量。设置PrecondBandWidth使用直接分解(柯列斯基)而非共轭梯度(CG)。直接分解比CG计算更贵,但质量更好一步生成解决方案。有关更多信息,请参见Trust-Region-Reflective算法

SubproblemAlgorithm

确定迭代步骤是如何计算的。默认的,“重心”,但不准确的步骤需要一个速度更快“分解”。看到Trust-Region-Reflective最小二乘

TolPCG

终止公差在PCG预处理共轭梯度迭代,一个积极的标量。默认值是0.1

TypicalX

典型的x值。元素的数量TypicalX等于变量的数量。默认值是的(numberofvariables, 1)lsqlin使用TypicalX内部扩展。TypicalX只有当有影响吗x有无限的组件,当一个TypicalX值大于一个无界的组件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,选项)

输出参数

全部折叠

解决方案,作为一个向量返回最小化的规范C * x d主体范围和线性约束。

溶液热启动对象,作为一个返回LsqlinWarmStart对象。解决方案是wsout.X

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

客观的价值,作为标量值返回规范(C * x d) ^ 2

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

算法停止条件,作为一个整数返回识别算法停止的原因。以下列出的值exitflag和相应的原因lsqlin停止了。

3

剩余的变化小于指定的公差options.FunctionTolerance。(trust-region-reflective算法)

2

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

1

功能融合解决方案x

0

迭代次数超过options.MaxIterations

2

问题是不可行的。或,内点算法,步长小于options.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算法

该方法基于interior-reflective牛顿的一个子空间信赖域方法中描述的方法[1]。每个迭代都包括近似解大型线性系统使用条件共轭梯度法(PCG)。看到Trust-Region-Reflective最小二乘,特别是大型线性最小二乘法

内点算法

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

有效集算法

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

引用

[1]科尔曼,t·f·李和y。“反射牛顿方法,减少二次函数边界的一些变量,“暹罗杂志上优化》第六卷,4号,第1058 - 1040页,1996年。

吉尔[2],p E。,W. Murray, and M. H. Wright.实用的优化、学术出版社,伦敦,英国,1981年。

温暖的开始

热启动对象保持一个积极约束列表前解决问题。在解算器携带尽可能多的有效约束信息来解决当前的问题。如果前面的问题是不同的,没有激活集信息重用。在这种情况下,解算器有效地执行一个冷启动为了重建活动限制的列表。

选择功能

应用程序

优化住编辑任务提供了一个可视化界面lsqlin

扩展功能

版本历史

之前介绍过的R2006a