二次规划
解算器的二次目标函数线性约束。
quadprog发现问题规定的最低
H,一个,Aeq矩阵,f,b,说真的,磅,乌兰巴托,x是向量。
你可以通过f,磅,乌兰巴托向量或矩阵;看到矩阵的参数。
请注意
quadprog
仅适用于solver-based方法。两种优化方法的讨论,请参阅首先选择具体问题具体分析或Solver-Based方法。
找到最低的
受约束
在quadprog
语法,这个问题是最小化
,
在哪里
线性约束。
为了解决这个问题,首先输入系数矩阵。
H = [1 1;1 2];f = [2;6);(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];说真的= 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);(1 = 1;1 - 2;2 1];b = [2;2;3);
帮助写quadprog
函数调用,设置不必要的输入[]
。
Aeq = [];说真的= [];磅= [];乌兰巴托= [];x0 = [];
调用quadprog
来解决这个问题。
x = quadprog (H f A、b Aeq,说真的,磅,乌兰巴托,x0,选项)
Iter Fval原始Infeas双重Infeas互补0 -8.884885 1.071429 3.214286 e + e + 00 00 e-01 1.000000 e + 00 1 1.910489 -8.331868 1.321041 e + 00 e-01 4.403472 e 03 e-01 2 -8.212804 e + 00 1.676295 e 03 e-05 5.587652 2.793826 8.381476 -8.222204 1.009601 e-02 3 e + 00 e-07 e-08 1.809485 e-05 4 -8.222222 7.525735 1.352696 2.975398 e + 00 e-14 e-12 e-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 (x) =和< = 2;prob.Constraints。cons2 = - x (1) + 2 * x (2) < = 2;prob.Constraints。cons3 = 2 * x (1) + (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 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 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.691769 e + 01 1.582123 e + 00 1.712849 e + 01 1.680447 e + 00 1 -3.889430 9.971731 8.564246 0.000000 e + e + 00 00 e 03 e-01 2 -5.451769 2.710131 4.282123 0.000000 e + e + 00 00 e-06 e-02 3 -5.499997 0.000000 e + e + 00 00 1.221938平台以及6.939689 e-07 4 -5.500000 3.469847 5.842173 0.000000 e + e + 00 00 e-14平台以及最低发现满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
x =3×10.0000 1.0000 0.0000
fval = -5.5000
exitflag = 1
输出=结构体字段:消息:“……的算法:interior-point-convex firstorderopt: 1.5921 e-09 constrviolation: 0迭代:4 linearsolver:“密集”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(λ)
ineqlin: 12.0000 eqlin: [0 x1双]低:x1双[3]上:[3 x1双)
线性不等式约束的拉格朗日乘子相关12
。
显示相关乘数下界。
disp (lambda.lower)
5.0000 0.0000 0.0000
只有第一个组成部分lambda.lower
有一个非零的乘数。这通常意味着只有第一个组成部分x
下界的零。确认通过显示的组件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
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
作为一个稀疏的向量。
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
- - - - - -线性等式约束线性等式约束,指定为一个真正的矩阵。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我< < = =元素个数(磅)
。
如果磅
有更少的元素比x0
,解决者发出警告。
例子:指定,所有的x分量都是积极的,使用磅= 0(大小(x0))
。
数据类型:双
乌兰巴托
- - - - - -上界上界,指定为一个真正的向量或真正的数组。如果元素的数量x0
等于元素的数量乌兰巴托
,然后乌兰巴托
指定
x (i) < =乌兰巴托(我)
对所有我
。
如果元素个数(乌兰巴托)<元素个数(x0)
,然后乌兰巴托
指定
x (i) < =乌兰巴托(我)
为1我< < = =元素个数(乌兰巴托)
。
如果乌兰巴托
有更少的元素比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 |
终止公差函数值;一个积极的标量。默认值取决于问题类型:bound-constrained使用问题 为 |
|
黑森乘法函数,指定为一个函数处理。大规模的结构性问题,这个函数计算海赛矩阵产品 W = hmfun (Hinfo, Y) 在哪里 看到二次最小化密集,结构化的麻绳例如,使用此选项。 为 |
MaxPCGIter | 最大数量的首选条件共轭梯度迭代;一个积极的标量。默认值是 |
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
。热启动对象包含起点和选项,以及可选的数据生成代码的内存大小。看到热启动的最佳实践。
例子: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”
算法试图遵循路径内严格限制。它使用一个presolve模块删除冗余和简化问题,解决简单的组件。
稀疏的海赛矩阵的算法具有不同的实现H
和稠密矩阵。一般来说,大型稀疏实现更快,稀疏的问题,实现更快的在密集或小问题。有关更多信息,请参见interior-point-convex quadprog算法。
“trust-region-reflective”
的“trust-region-reflective”
子空间算法是一种基于interior-reflective牛顿方法中描述的信赖域方法[1]。每个迭代都包括近似解大型线性系统使用条件共轭梯度法(PCG)。有关更多信息,请参见trust-region-reflective quadprog算法。
“激活集”
的“激活集”
算法是一个投影方法,类似于一个描述[2]。这个算法不是大规模;看到大型和中型的算法。有关更多信息,请参见激活集quadprog算法。
热启动对象保持一个积极约束列表前解决问题。在解算器携带尽可能多的有效约束信息来解决当前的问题。如果前面的问题是不同的,没有激活集信息重用。在这种情况下,解算器有效地执行一个冷启动为了重建活动限制的列表。
的优化住编辑任务提供了一个可视化界面quadprog
。
[1]科尔曼,t·F。李,y。“反射牛顿方法,减少二次函数一些变量的界限。”暹罗杂志上优化。第四卷。6日,1996年,页1040 - 1058。
吉尔[2],p E。,W. Murray, and M. H. Wright.实际的优化。伦敦:学术出版社,1981年。
[3]古尔德,N。,P. L. Toint. “Preprocessing for quadratic programming.”数学规划。系列B卷。100年,2004年,页95 - 132。
使用笔记和限制:
quadprog
金宝app支持使用生成代码codegen
(MATLAB编码器)函数或MATLAB®编码器™应用程序,你必须有一个MATLAB编码器许可来生成代码。
目标硬件必须支持标准的双精度浮点计算。金宝app你不能为单精度或定点计算生成代码。
代码生成目标不使用MATLAB解决数学内核库一样。因此,代码生成解决方案可以解决不同的解决方案,特别是对金宝搏官方网站条件不佳的问题。
quadprog
不支持金宝app问题
理由代码生成。
[x, fval] = quadprog(问题)%不支持金宝app
所有quadprog
输入矩阵等一个
,Aeq
,磅
,乌兰巴托
必须完整,而不是稀疏。稀疏矩阵转换为可以充分利用完整的
函数。
的磅
和乌兰巴托
参数必须有相同数量的条目的列数H
或必须是空的[]
。
对于高级代码优化包括嵌入式处理器,您还需要嵌入式编码器®许可证。
你必须包括选项quadprog
并指定使用optimoptions
。必须包括的选项算法
选项,设置为“激活集”
。
选择= optimoptions (“quadprog”,“算法”,“激活集”);[x, fval exitflag] = quadprog (H f A、b Aeq,说真的,磅,乌兰巴托,x0,选项);
代码生成支持这些选项:金宝app
算法
——必须“激活集”
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成的代码错误检查选项有限。推荐的方式来更新一个选项是使用optimoptions
,而不是点符号。
选择= optimoptions (“quadprog”,“算法”,“激活集”);选择= optimoptions(选择,“MaxIterations”1 e4);%推荐选择。米axIterations = 1e4;%不推荐
不从文件加载选项。这样做会导致代码生成失败。相反,在代码中创建选项。
如果您指定一个选项不支持,在代码生成选项通常是忽略。金宝app对于可靠的结果,指定仅支持选项。金宝app
例如,看到的为quadprog生成代码。
你点击一个链接对应MATLAB命令:
运行该命令通过输入MATLAB命令窗口。Web浏览器不支持MATLAB命令。金宝app
你也可以从下面的列表中选择一个网站:
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。