quadprog
二次规划
语法
描述
具有线性约束的二次目标函数的求解器。
Quadprog为指定的问题找到最小值
H,一个,Aeq矩阵,f,b,说真的,磅,乌兰巴托,x是向量。
你可以通过f,磅,乌兰巴托作为向量或矩阵;看到矩阵的参数.
请注意
quadprog
只适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于求解器的方法.
返回的最小值x
= quadprog (问题
)问题
中描述的结构问题
.创建问题
结构使用点表示法或结构体
函数。另外,创建一个问题
结构的OptimizationProblem
对象的使用prob2struct
.
例子
具有线性约束的二次规划
求最小值
受限于
在quadprog
语法,这个问题是最小化
,
在哪里
受线性约束。
要解决这个问题,首先要输入系数矩阵。
H = [1 -1;1 2];f = [2;6);A = [1 1;1 - 2;2 1];b = [2;2;3);
调用quadprog
.
[x, fval exitflag、输出λ)=...quadprog (H f A、b);
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
检查最后一个点、函数值和退出标志。
x fval exitflag
x =2×10.6667 - 1.3333
fval = -8.2222
exitflag = 1
的出口标志1
表示结果是局部最小值。因为H
是一个正定矩阵,这个问题是凸的,所以最小值是全局最小值。
确认H
通过检查它的特征值是正定的。
eig (H)
ans =2×10.3820 - 2.6180
具有线性等式约束的二次规划
求最小值
受限于约束条件
在quadprog
语法,这个问题是最小化
,
在哪里
受线性约束。
要解决这个问题,首先要输入系数矩阵。
H = [1 -1;1 2];f = [2;6);Aeq = [1 1];说真的= 0;
调用quadprog
,进入[]
的输入一个
和b
.
[x, fval exitflag、输出λ)=...quadprog (H f [] [], Aeq, beq);
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
检查最后一个点、函数值和退出标志。
x fval exitflag
x =2×1-0.8000 - 0.8000
fval = -1.6000
exitflag = 1
的出口标志1
表示结果是局部最小值。因为H
是一个正定矩阵,这个问题是凸的,所以最小值是全局最小值。
确认H
通过检查它的特征值是正定的。
eig (H)
ans =2×10.3820 - 2.6180
带线性约束和界的二次极小化
找到x它最小化了二次表达式
在哪里
, ,
受限于
, .
要解决这个问题,首先输入系数。
H = [1,-1, -1,2,-2 1,-2,4];f =[2、3、1];磅= 0 (3,1);乌兰巴托= 1(大小(磅));Aeq = 1(1、3);说真的= 1/2;
调用quadprog
,进入[]
的输入一个
和b
.
x = quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =3×10.0000 0.5000 0.0000
带有非默认选项的二次极小化
设置监视进度的选项quadprog
.
选择= optimoptions (“quadprog”,“显示”,“通路”);
定义一个具有二次目标和线性不等式约束的问题。
H = [1 -1;1 2];f = [2;6);A = [1 1;1 - 2;2 1];b = [2;2;3);
来帮助编写quadprog
函数调用,将不必要的输入设置为[]
.
Aeq = [];说真的= [];磅= [];乌兰巴托= [];x0 = [];
调用quadprog
解决问题。
x = quadprog (H f A、b Aeq,说真的,磅,乌兰巴托,x0,选项)
Iter Fval primary Infeas Dual Infeas互补0 -8.884885e+00 3.214286e+00 1.071429e-01 1.000000e+00 -8.331868e+00 1.3210489e -01 4.403472e-03 1.910489e-01 2 -8.212804e+00 1.676295e-03 5.587652e-05 1.009601e-02 3 -8.222204e+00 8.381476e-07 2.793826e-08 1.809485e-05 4 -8.222222e+00 2.975398e-14 1.352696e-12 7.525735e-13最小发现,满足约束。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =2×10.6667 - 1.3333
二次问题prob2struct
创建一个问题
结构使用具体问题具体分析优化工作流程.创建一个优化问题相当于具有线性约束的二次规划.
x = optimvar (“x”2);objec = x (1) ^ 2/2 + x (2) ^ 2 - x (1) * (2) - 2 * x (1) - 6 * x (2);概率= optimproblem (“目标”, objec);prob.Constraints。con1 = sum(x) <= 2;prob.Constraints。con2 = -x(1) + 2*x(2) <= 2;prob.Constraints。con3 = 2*x(1) + x(2) <= 3;
转换概率
到一个问题
结构。
问题= prob2struct(概率);
用quadprog
.
[x, fval] = quadprog(问题)
警告:你的黑森不是对称的。重置H = (H + H) / 2。
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =2×10.6667 - 1.3333
fval = -8.2222
返回quadprog
目标函数值
求解一个二次程序,并返回解和目标函数值。
H = [1,-1, -1,2,-2 1,-2,4];f = [7, -12; -15);一个= (1 1 1);b = 3;[x, fval] = quadprog (H, f, A, b)
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =3×1-3.5714 2.9286 3.6429
fval = -47.1786
方法计算的值是否与返回的目标函数值匹配quadprog
目标函数定义。
fval2 = 1/2*x'*H*x + f'*x
fval2 = -47.1786
检查quadprog
优化过程
查看优化过程quadprog
,设置选项以显示迭代显示并返回四个输出。问题是最小化
受
,
在哪里
, .
输入问题系数。
H = [2 1 -1 1 3 1/2 -1 /2 5];f =(4、7、12);磅= 0 (3,1);乌兰巴托= 1 (3,1);
设置选项以显示求解器的迭代进度。
选择= optimoptions (“quadprog”,“显示”,“通路”);
调用quadprog
有四个输出。
[x fval exitflag,输出]= quadprog (H, f ,[],[],[],[], 磅,乌兰巴托,[]选项)
Iter Fval原始Infeas双Infeas互补性0 2.691769e+01 1.582123e+00 1.712849e+01 1.680447e+00 1 -3.889430e+00 0.000000e+00 8.564246e-03 9.971731e-01 2 -5.451769e+00 0.000000e+00 4.282123e-06 2.710131e-02 3 -5.499997e+00 0.000000e+00 1.221903e-10 6.939689e-07 4 -5.500000e+00 0.000000e+00 5.842173e-14 3.469847e-10最小发现满足约束。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
x =3×10.0000 1.0000 0.0000
fval = -5.5000
exitflag = 1
输出=结构体字段:message: '找到满足约束条件的最小值....'算法:' inner -point-凸' firstorderopt: 1.5921e-09 constrbreach: 0 iterations: 4 linearsolver: '密' cgiterations: []
返回quadprog
拉格朗日乘数法
解决一个二次规划问题并返回拉格朗日乘子。
H = [1,-1, -1,2,-2 1,-2,4];f = [7, -12; -15);一个= (1 1 1);b = 3;磅= 0 (3,1);[x, fval exitflag、输出λ)= quadprog (H f A、b[],[],磅);
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
检查拉格朗日乘子结构λ
.
disp(λ)
Ineqlin: 12.0000 eqlin: [0x1 double] lower: [3x1 double] upper: [3x1 double]
线性不等式约束有一个相关的拉格朗日乘子12
.
显示与下界相关的乘数。
disp (lambda.lower)
5.0000 0.0000 0.0000
的第一个成分lambda.lower
有一个非零乘数。这通常意味着只有第一个成分x
在0的下界。的组件进行确认x
.
disp (x)
0.0000 1.5000 1.5000
返回温暖开始对象
速度后续quadprog
调用,创建一个温暖的start对象。
选择= optimoptions (“quadprog”,“算法”,“激活集”);X0 = [1 2 3];ws = optimwarmstart (x0,选项);
用二次程序求解ws
.
H = [1,-1, -1,2,-2 1,-2,4];f = [7, -12; -15);一个= (1 1 1);b = 3;磅= 0 (3,1);抽搐(ws、fval exitflag、输出λ)= quadprog (H f A、b[],[],磅,[],ws);toc
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。运行时间为0.021717秒。
改变目标函数,重新求解。
f = (-10; -15; -20);抽搐(ws、fval exitflag、输出λ)= quadprog (H f A、b[],[],磅,[],ws);toc
找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。运行时间为0.018485秒。
输入参数
H
- - - - - -二次目标词
对称的矩阵
二次客观项,表示为对称实矩阵。H
表示表达式中的二次元1/2 * x ' * H * x + f ' * x
.如果H
不对称的,quadprog
发出警告并使用对称版本(H + H ') / 2
代替。
如果二次矩阵H
是稀疏的,那么默认情况下“interior-point-convex”
算法使用的算法与when略有不同H
是密集。一般来说,稀疏算法在大型、稀疏问题上速度更快,而密集算法在密集或小问题上速度更快。有关更多信息,请参见LinearSolver
选项描述和interior-point-convex quadprog算法.
例子:(2, 1, 1, 3)
数据类型:双
f
- - - - - -线性目标词
真正的向量
线性客观项,指定为实向量。f
表示表达式中的线性项1/2 * x ' * H * x + f ' * x
.
例子:(1; 3; 2)
数据类型:双
一个
- - - - - -线性不等式约束
真正的矩阵
线性不等式约束,指定为实矩阵。一个
是一个米
——- - - - - -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
作为一个稀疏向量。
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
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。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
.
数据类型:双
磅
- - - - - -下界
真正的向量|真正的数组
下界,指定为实向量或实数组。如果元素的个数x0
等于元素的个数磅
,然后磅
指定
x(我)> =磅(我)
对所有我
.
如果元素个数(磅)<元素个数(x0)
,然后磅
指定
x(我)> =磅(我)
为1 <= I <= numel(lb)
.
如果磅
元素少于x0
,求解者发出警告。
例子:要指定所有x分量都是正的,使用磅= 0(大小(x0))
.
数据类型:双
乌兰巴托
- - - - - -上界
真正的向量|真正的数组
上界,指定为实向量或实数组。如果元素的个数x0
等于元素的个数乌兰巴托
,然后乌兰巴托
指定
x (i) < =乌兰巴托(我)
对所有我
.
如果元素个数(乌兰巴托)<元素个数(x0)
,然后乌兰巴托
指定
x (i) < =乌兰巴托(我)
为1 <= I <= numel(ub)
.
如果乌兰巴托
元素少于x0
,求解者发出警告。
例子:要指定所有x分量都小于1,使用乌兰巴托= 1(大小(x0))
.
数据类型:双
x0
- - - - - -初始点
真正的向量
初始点,指定为实向量。的长度x0
行数还是列数H
.
x0
适用于“trust-region-reflective”
当问题只有约束条件时的算法。x0
也适用于“激活集”
算法。
请注意
x0
的必选参数“激活集”
算法。
如果不指定x0
,quadprog
设置的所有组件x0
到由边界定义的盒子内部的一点。quadprog
忽略了x0
为“interior-point-convex”
算法和“trust-region-reflective”
具有等式约束的算法。
例子:(1, 2, 1)
数据类型:双
选项
- - - - - -优化选项
的输出optimoptions
|结构如optimset
返回
优化选项,指定为的输出optimoptions
或者一个结构,比如optimset
的回报。
的选项中缺少一些选项optimoptions
显示。这些选项在下表中以斜体显示。有关详细信息,请参见视图选项.
所有的算法
算法 |
选择的算法:
的 |
诊断 | 显示关于要最小化或解决的功能的诊断信息。的选择是 |
显示 |
显示水平(参见迭代显示):
的
|
MaxIterations |
允许的最大迭代次数;一个正整数。
为 |
OptimalityTolerance |
一阶最优性的终止公差;一个积极的标量。
看到公差和停止标准. 为 |
StepTolerance |
终止上公差
为 |
“trust-region-reflective”
算法只
FunctionTolerance |
函数值上的终止公差;一个积极的标量。默认值取决于问题类型:有约束问题使用 为 |
|
Hessian乘法函数,指定为函数句柄。对于大规模的结构化问题,该函数计算Hessian矩阵积 W = hmfun (Hinfo, Y) 在哪里 看到密集、结构化Hessian的二次极小化对于使用此选项的示例。 为 |
MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数;一个积极的标量。默认值是 |
PrecondBandWidth | PCG预处理器的上带宽一个非负整数。默认情况下, |
SubproblemAlgorithm |
确定如何计算迭代步骤。默认的, |
TolPCG | PCG迭代的终止公差一个积极的标量。默认值是 |
TypicalX |
典型的 |
“interior-point-convex”
算法只
“激活集”
算法只
ConstraintTolerance |
对约束违反的容忍;一个积极的标量。默认值为 为 |
ObjectiveLimit |
一个标量的公差(停止标准)。如果目标函数值低于 |
问题
- - - - - -问题的结构
结构
问题结构,指定为具有以下字段的结构:
|
对称矩阵1/2 * x ' * H * x |
|
线性向量f ' * x |
|
矩阵的线性不等式约束Aineq * x ≤bineq |
|
向量在线性不等式约束下Aineq * x ≤bineq |
|
矩阵的线性等式约束Aeq * x =说真的 |
|
向量在线性等式的约束下Aeq * x =说真的 |
磅 |
下界向量 |
乌兰巴托 |
上界向量 |
|
初始点x |
|
“quadprog” |
|
选择使用optimoptions 或optimset |
必需的字段是H
,f
,解算器
,选项
.当解决,quadprog
中的任何字段都忽略问题
除了上面列出的。
请注意
你不能用暖开始问题
论点。
数据类型:结构体
ws
- - - - - -热启动对象
对象创建使用optimwarmstart
对象,指定为使用创建的对象optimwarmstart
.warm start对象包含起始点和选项,以及代码生成中内存大小的可选数据。看到热启动最佳实践.
例子:ws = optimwarmstart (x0,选项)
输出参数
x
——解决方案
真正的向量
解,作为实向量返回。x
是最小化的向量吗1/2 * x ' * H * x + f ' * x
服从所有边界和线性约束。x
可为非凸问题的局部极小值。对凸的问题,x
是全局极小值。有关更多信息,请参见本地vs.全局优化.
wsout
—解决方案热启动对象
QuadprogWarmStart
对象
解决方案热启动对象,返回为QuadprogWarmStart
对象。解决点是wsout。X
.
您可以使用wsout
作为后续对象中的输入热启动对象quadprog
调用。
fval
-目标函数解的值
真正的标量
目标函数在解处的值,作为实标量返回。fval
的值1/2 * x ' * H * x + f ' * x
在解决方案x
.
exitflag
- - -原因quadprog
停止
整数
原因quadprog
停止,返回为表中描述的整数。
所有的算法 |
|
|
函数收敛到解决方案 |
|
超过的迭代次数 |
|
问题是不可行的。或者,为 |
|
问题是无限的。 |
|
|
|
步长小于 |
|
发现非凸问题。 |
|
无法计算步长方向。 |
|
|
|
局部最小值;最小值不是唯一的。 |
|
目标函数值的变化小于 |
|
目前的搜索方向不是下降方向。无法取得进一步进展。 |
|
|
|
请注意
偶尔,“激活集”
算法在退出标志时停止0
当问题实际上是无界的时候。设置更高的迭代限制也会导致退出标志0
.
输出
—优化流程信息
结构
关于优化过程的信息,作为包含以下字段的结构返回:
|
迭代次数 |
|
优化算法 |
|
PCG迭代的总次数( |
constrviolation |
约束函数的最大值 |
firstorderopt |
一阶最优性的度量 |
linearsolver |
内部线性求解器的类型, |
消息 |
退出消息 |
λ
-解的拉格朗日乘子
结构
算法
“interior-point-convex”
的“interior-point-convex”
算法试图遵循严格在约束内的路径。它使用一个presolve模块来消除冗余,并通过解决简单的组件来简化问题。
该算法对稀疏黑森矩阵有不同的实现H
对于一个密集矩阵。通常,稀疏实现在大型、稀疏问题上更快,而密集实现在密集或小问题上更快。有关更多信息,请参见interior-point-convex quadprog算法.
“trust-region-reflective”
的“trust-region-reflective”
算法是一种基于内反射牛顿法的子空间信赖域方法[1].每次迭代都使用预条件共轭梯度(PCG)方法对一个大型线性系统进行近似求解。有关更多信息,请参见trust-region-reflective quadprog算法.
“激活集”
的“激活集”
算法是一种投影方法,类似于[2].该算法不具有大规模;看到大规模vs.中型算法.有关更多信息,请参见激活集quadprog算法.
温暖的开始
warm start对象维护前面解决的问题的活动约束列表。求解器携带尽可能多的活动约束信息来解决当前问题。如果前面的问题与当前的问题差异太大,则不会重用任何活动集信息。在这种情况下,求解器有效地执行冷启动,以便重新构建活动约束列表。
选择功能
应用程序
的优化Live Editor任务提供了一个可视化的界面quadprog
.
参考文献
[1]科尔曼,T. F.和Y.李。求受某些变量有界的二次函数最小化的反射牛顿法。SIAM优化期刊.1996年第6卷第4期,第1040-1058页。
吉尔,p.e., W.默里,M. H.赖特。实际的优化。伦敦:文献出版社,1981年。
[3]古尔德和P. L.托特。二次规划的预处理。数学规划。B辑,2004年第100卷,第95-132页。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
quadprog
方法支持代码生成codegen
(MATLAB编码器)函数或MATLAB®编码器™你一定有一个MATLAB编码器生成代码的许可证。目标硬件必须支持标准的双精度浮点计算。不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能不同于求解器解决方案,特别是对于条件较差的问题。
quadprog
不支持问题
代码生成的参数。[x, fval] = quadprog(问题)%不支持
所有
quadprog
输入矩阵如一个
,Aeq
,磅
,乌兰巴托
必须是饱满的,而不是稀疏的。方法可以将稀疏矩阵转换为全矩阵完整的
函数。的
磅
和乌兰巴托
参数的条目数必须与中的列数相同H
或者必须为空[]
.如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
.对于涉及嵌入式处理器的高级代码优化,还需要一个嵌入式Coder®许可证。
你必须包含选项
quadprog
并使用optimoptions
.选项必须包含算法
选项,设置为“激活集”
.选择= optimoptions (“quadprog”,“算法”,“激活集”);[x, fval exitflag] = quadprog (H f A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
代码生成支持以下选项:
算法
——必须“激活集”
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成的代码对选项的错误检查是有限的。更新选项的推荐方法是使用
optimoptions
,而不是点符号。选择= optimoptions (“quadprog”,“算法”,“激活集”);选择= optimoptions(选择,“MaxIterations”1 e4);%推荐选择。米axIterations = 1e4;%不推荐
不要从文件中加载选项。这样做可能导致代码生成失败。相反,在代码中创建选项。
如果指定的选项不受支持,则在代码生成过程中通常会忽略该选项。要获得可靠的结果,请只指定支持的选项。
示例请参见为quadprog生成代码.
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。