二次规划
具有线性约束的二次目标函数求解器。
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 -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 Primal infas Dual infas complement 0 - 8.33488e +00 3.214286e+00 1.071429e-01 1.000000e+00 1 -8.331868e+00 1.321041e-01 4.40347e -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。Cons1 = 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(问题)
警告:你的Hessian不是对称的。重置H = (H + H) / 2。
找到满足约束条件的最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
x =2×10.6667 - 1.3333
fval = -8.2222
quadprog
目标函数值解一个二次规划,并返回解和目标函数值。
H = [1,-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
,设置选项以显示迭代显示并返回4个输出。问题是最小化
受
,
在哪里
, .
输入问题系数。
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 Primal infas Dual infas complement 0 2.691769e+01 1.582123e+00 1.712849e+01 1.680447e+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.221938e-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
输出=结构体字段:消息:“……' algorithm: 'interior-point-凸' firstorderopt: 1.5921e-09 construct: 0 iterations: 4 linearsolver: 'dense' cgiterations: []
quadprog
拉格朗日乘数法解一个二次规划问题并返回拉格朗日乘数。
H = [1,-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(λ)
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
调用时,创建一个热启动对象。
选择= optimoptions (“quadprog”,“算法”,“激活集”);X0 = [1 2 3];ws = optimwarmstart (x0,选项);
用ws
.
H = [1,-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”
算法使用的算法略有不同,当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矩阵乘积 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
是全局最小值。有关更多信息,请参见局部优化与全局优化.
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”
算法试图遵循严格在约束之内的路径。它使用一个预解决模块来消除冗余,并通过解决简单的组件来简化问题。
该算法对稀疏Hessian矩阵有不同的实现方式H
对于一个密集矩阵。一般来说,稀疏实现在大的、稀疏的问题上更快,而密集实现在密集或小的问题上更快。有关更多信息,请参见interior-point-convex quadprog算法.
“trust-region-reflective”
的“trust-region-reflective”
算法是一种基于内反射牛顿法的子空间信赖域方法[1].每次迭代都涉及到使用预条件共轭梯度(PCG)方法求解一个大线性系统的近似解。有关更多信息,请参见trust-region-reflective quadprog算法.
“激活集”
的“激活集”
算法是一种投影方法,类似于[2].算法不是大规模的;看到大规模与中型算法.有关更多信息,请参见激活集quadprog算法.
热启动对象维护一个来自先前解决的问题的活动约束列表。求解器携带尽可能多的主动约束信息来解决当前问题。如果以前的问题与当前的问题太不同,则不会重用活动集信息。在这种情况下,求解器有效地执行冷启动,以重建活动约束列表。
的优化活动编辑器任务为quadprog
.
[1]科尔曼,T. F.和Y. Li。使二次函数在某些变量有界的情况下最小的反射牛顿法SIAM优化学报.第6卷第4期,1996年,第1040-1058页。
吉尔,P. E., W.默里和M. H.赖特。实际的优化。伦敦:学术出版社,1981。
N. Gould和P. L. Toint。"二次规划的预处理"数学规划。系列丛书,Vol. 19, 2004, pp. 95-132。
使用注意事项及限制:
quadprog
万博1manbetx支持使用codegen
(MATLAB编码器)函数或MATLAB®编码器™你一定有一个MATLAB编码器生成代码的许可。
目标硬件必须支持标准的双精度浮点计算。万博1manbetx不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能因求解器解决方案而异,特别是万博 尤文图斯对于条件差的问题。
quadprog
不支持万博1manbetx问题
用于代码生成的参数。
[x, fval] = quadprog(问题)%不支持万博1manbetx
所有quadprog
输入矩阵如一个
,Aeq
,磅
,乌兰巴托
必须充实,不能稀疏。您可以将稀疏矩阵转换为完整的完整的
函数。
的磅
和乌兰巴托
参数必须具有与中的列数相同的条目数H
或者必须是空的[]
.
对于涉及嵌入式处理器的高级代码优化,还需要嵌入式编码器®许可证。
您必须包含以下选项quadprog
并使用optimoptions
.选项必须包括算法
选项,设置为“激活集”
.
选择= optimoptions (“quadprog”,“算法”,“激活集”);[x, fval exitflag] = quadprog (H f A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
代码生成支持以下选项:万博1manbetx
算法
——必须“激活集”
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成的代码对选项有有限的错误检查。更新选项的推荐方法是使用optimoptions
,而不是点符号。
选择= optimoptions (“quadprog”,“算法”,“激活集”);选择= optimoptions(选择,“MaxIterations”1 e4);%推荐选择。米axIterations = 1e4;%不推荐
不要从文件中加载选项。这样做可能会导致代码生成失败。相反,在代码中创建选项。
如果指定不受支持的选项,则该选项通常在代码生成期间被忽略。万博1manbetx为了得到可靠的结果,只指定受支持的选项。万博1manbetx
例如,请参见为quadprog生成代码.
你点击一个链接对应于这个MATLAB命令:
通过在MATLAB命令窗口中输入命令来运行命令。Web浏览器不支持MATLAB命令。万博1manbetx
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。