quadprog
二次规划
语法
说明
具有线性约束的二次目标函数的求解器。
quadprog 求由下式指定的问题的最小值
H、A 和 Aeq 是矩阵,f、b、beq、lb、ub 和 x 是向量。
您可以将 f、lb 和 ub 作为向量或矩阵进行传递;请参阅矩阵参量。
注意
quadprog
仅适用于基于求解器的方法。使用 solve
作为基于问题的方法。有关这两种优化方法的讨论,请参阅首先选择基于问题或基于求解器的方法。
返回 x
= quadprog(problem
)problem
的最小值,它是 problem
中所述的一个结构体。使用圆点表示法或 struct
函数创建 problem
结构体。或者,使用 prob2struct
从 OptimizationProblem
对象创建 problem
结构体。
示例
找到下式的最小值
需满足以下约束
在 quadprog
语法中,此问题可表示为最小化下式
,
其中
问题具有线性约束。
要求解此问题,首先输入系数矩阵。
H = [1 -1; -1 2]; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3];
调用 quadprog
。
[x,fval,exitflag,output,lambda] = ...
quadprog(H,f,A,b);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
检查终点、函数值和退出标志。
x,fval,exitflag
x = 2×1
0.6667
1.3333
fval = -8.2222
exitflag = 1
退出标志为 1
表示结果是局部最小值。由于 H
是正定矩阵,此问题为凸型,因此最小值是全局最小值。
通过检查特征值,确认 H
是正定矩阵。
eig(H)
ans = 2×1
0.3820
2.6180
找到下式的最小值
需满足以下约束
在 quadprog
语法中,此问题可表示为最小化下式
,
其中
问题具有线性约束。
要求解此问题,首先输入系数矩阵。
H = [1 -1; -1 2]; f = [-2; -6]; Aeq = [1 1]; beq = 0;
调用 quadprog
,为输入项 A
和 b
输入 []
。
[x,fval,exitflag,output,lambda] = ...
quadprog(H,f,[],[],Aeq,beq);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
检查终点、函数值和退出标志。
x,fval,exitflag
x = 2×1
-0.8000
0.8000
fval = -1.6000
exitflag = 1
退出标志为 1
表示结果是局部最小值。由于 H
是正定矩阵,此问题为凸型,因此最小值是全局最小值。
通过检查特征值,确认 H
是正定矩阵。
eig(H)
ans = 2×1
0.3820
2.6180
求使二次表达式最小的 x
其中
, ,
需满足以下约束
, .
要求解此问题,首先输入系数。
H = [1,-1,1 -1,2,-2 1,-2,4]; f = [2;-3;1]; lb = zeros(3,1); ub = ones(size(lb)); Aeq = ones(1,3); beq = 1/2;
调用 quadprog
,为输入项 A
和 b
输入 []
。
x = quadprog(H,f,[],[],Aeq,beq,lb,ub)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 3×1
0.0000
0.5000
0.0000
设置选项以监控 quadprog
的进度。
options = optimoptions('quadprog','Display','iter');
定义具有二次目标和线性不等式约束的问题。
H = [1 -1; -1 2]; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3];
为了帮助编写 quadprog
函数调用,请将不必要的输入设置为 []
。
Aeq = []; beq = []; lb = []; ub = []; x0 = [];
调用 quadprog
以求解问题。
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
Iter Fval Primal Infeas Dual Infeas Complementarity 0 -8.884885e+00 3.214286e+00 1.071429e-01 1.000000e+00 1 -8.331868e+00 1.321041e-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 4.190870e-11 1.396883e-12 9.047989e-10 Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 2×1
0.6667
1.3333
使用基于问题的优化工作流创建一个 problem
结构体。创建一个等效于具有线性约束的二次规划的优化问题。
x = optimvar('x',2); objec = x(1)^2/2 + x(2)^2 - x(1)*x(2) - 2*x(1) - 6*x(2); prob = optimproblem('Objective',objec); prob.Constraints.cons1 = sum(x) <= 2; prob.Constraints.cons2 = -x(1) + 2*x(2) <= 2; prob.Constraints.cons3 = 2*x(1) + x(2) <= 3;
将 prob
转换为 problem
结构体。
problem = prob2struct(prob);
使用 quadprog
求解问题。
[x,fval] = quadprog(problem)
Warning: Your Hessian is not symmetric. Resetting H=(H+H')/2.
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 2×1
0.6667
1.3333
fval = -8.2222
求解二次规划,并返回解和目标函数值。
H = [1,-1,1 -1,2,-2 1,-2,4]; f = [-7;-12;-15]; A = [1,1,1]; b = 3; [x,fval] = quadprog(H,f,A,b)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
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
的优化过程,请设置选项以显示迭代输出并返回四个输出。问题可以表示为最小化下式
约束条件为
,
其中
, .
输入问题系数。
H = [2 1 -1 1 3 1/2 -1 1/2 5]; f = [4;-7;12]; lb = zeros(3,1); ub = ones(3,1);
设置选项以显示求解器的迭代进度。
options = optimoptions('quadprog','Display','iter');
调用带有四个输出的 quadprog
。
[x fval,exitflag,output] = quadprog(H,f,[],[],[],[],lb,ub,[],options)
Iter Fval Primal Infeas Dual Infeas Complementarity 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.499995e+00 0.000000e+00 2.878422e-10 1.750743e-06 4 -5.500000e+00 0.000000e+00 1.454808e-13 8.753723e-10 Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 3×1
0.0000
1.0000
0.0000
fval = -5.5000
exitflag = 1
output = struct with fields:
message: 'Minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative dual feasibility, 1.212340e-14,↵is less than options.OptimalityTolerance = 1.000000e-08, the complementarity measure,↵8.753723e-10, is less than options.OptimalityTolerance, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-08.'
algorithm: 'interior-point-convex'
firstorderopt: 2.3577e-09
constrviolation: 0
iterations: 4
linearsolver: 'dense'
cgiterations: []
求解二次规划问题并返回拉格朗日乘数。
H = [1,-1,1 -1,2,-2 1,-2,4]; f = [-7;-12;-15]; A = [1,1,1]; b = 3; lb = zeros(3,1); [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
检查拉格朗日乘数结构体 lambda
。
disp(lambda)
ineqlin: 12.0000 eqlin: [0×1 double] lower: [3×1 double] upper: [3×1 double]
线性不等式约束有一个相关联的拉格朗日乘数 12
。
显示与下界相关联的乘数。
disp(lambda.lower)
5.0000 0.0000 0.0000
只有 lambda.lower
的第一个分量具有非零乘数。这通常意味着只有 x
的第一个分量位于下界(即零)上。这可通过显示 x
的分量进行确认。
disp(x)
0.0000 1.5000 1.5000
要加速后续的 quadprog
调用,请创建一个热启动对象。
options = optimoptions('quadprog','Algorithm','active-set'); x0 = [1 2 3]; ws = optimwarmstart(x0,options);
使用 ws
求解二次规划。
H = [1,-1,1 -1,2,-2 1,-2,4]; f = [-7;-12;-15]; A = [1,1,1]; b = 3; lb = zeros(3,1); tic [ws,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb,[],ws);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
toc
Elapsed time is 0.060411 seconds.
更改目标函数,重新求解问题。
f = [-10;-15;-20]; tic [ws,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb,[],ws);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
toc
Elapsed time is 0.010756 seconds.
输入参数
二次目标项,指定为对称实矩阵。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]
数据类型: single
| double
线性目标项,指定为实数向量。f
表示 1/2*x'*H*x + f'*x
表达式中的线性项。
示例: [1;3;2]
数据类型: single
| double
线性不等式约束,指定为实矩阵。A
是 M
×N
矩阵,其中 M
是不等式的数目,而 N
是变量的数目(x0
中的元素数)。对于大型问题,如果使用支持稀疏数据的算法,则可将 A
作为稀疏矩阵传递。请参阅稀疏性在优化算法中的应用。
A
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 N
个变量组成的列向量 x(:)
,b
是具有 M
个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30,
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6]; b = [10;20;30];
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N)
和 b = 1
。
数据类型: single
| double
线性不等式约束,指定为实数向量。b
是与 A
矩阵相关的包含 M
个元素的向量。如果将 b
作为行向量传递,求解器会在内部将 b
转换为列向量 b(:)
。
b
以如下形式编写 M
个线性不等式
A*x <= b
,
其中,x
是由 N
个变量组成的列向量 x(:)
,A
是大小为 M
×N
的矩阵。
例如,假设有以下不等式:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6]; b = [10;20;30];
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N)
和 b = 1
。
数据类型: single
| double
线性等式约束,指定为实矩阵。Aeq
是 Me
×N
矩阵,其中 Me
是等式的数目,而 N
是变量的数目(x0
中的元素数)。对于大型问题,如果算法支持稀疏数据,则可将 A
作为稀疏矩阵传递。请参阅稀疏性在优化算法中的应用。
Aeq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 N
个变量组成的列向量 x(:)
,beq
是具有 Me
个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 +3x3 =10
2x1 +4x2 + x3 =20,
通过输入以下约束来指定不等式。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N)
和 beq = 1
。
数据类型: single
| double
线性等式约束,指定为实数向量。beq
是与 Aeq
矩阵相关的包含 Me
个元素的向量。如果将 beq
作为行向量传递,求解器会在内部将 beq
转换为列向量 beq(:)
。
beq
以如下形式编写 Me
个线性等式
Aeq*x = beq
,
其中,x
是由 N
个变量组成的列向量 x(:)
,Aeq
是大小为 Me
×N
的矩阵。
例如,请参考以下等式:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。
通过输入以下约束来指定等式。
Aeq = [1,2,3;2,4,1]; beq = [10;20];
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N)
和 beq = 1
。
数据类型: single
| double
下界,指定为实数向量或实数数组。如果 x0
中的元素数等于 lb
中的元素数,则 lb
指定
x(i) >= lb(i)
(对于全部 i
)。
如果 numel(lb) < numel(x0)
,则 lb
指定
x(i) >= lb(i)
(1 <= i <= numel(lb)
)。
如果 lb
的元素数少于 x0
,求解器将发出警告。
示例: 要指定所有 x 分量为正,请使用 lb = zeros(size(x0))
。
数据类型: single
| double
上界,指定为实数向量或实数数组。如果 x0
中的元素数等于 ub
中的元素数,则 ub
指定
x(i) <= ub(i)
(对于全部 i
)。
如果 numel(ub) < numel(x0)
,则 ub
指定
x(i) <= ub(i)
(1 <= i <= numel(ub)
)。
如果 ub
的元素数少于 x0
,求解器将发出警告。
示例: 要指定 x 的所有分量小于 1,请使用 ub = ones(size(x0))
。
数据类型: single
| double
初始点,指定为实数向量。x0
的长度是 H
的行数或列数。
当问题只有边界约束时,x0
适用于 'trust-region-reflective'
算法。x0
也适用于 'active-set'
算法。
注意
x0
是 'active-set'
算法的必需参量。
如果您未指定 x0
,quadprog
会将 x0
的所有分量设置为由边界定义的框内部的一个点。对于 'interior-point-convex'
算法和具有等式约束的 'trust-region-reflective'
算法,quadprog
将忽略 x0
。
示例: [1;2;1]
数据类型: single
| double
优化选项,指定为 optimoptions
的输出或 optimset
等返回的结构体。
optimoptions
显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。
所有算法
Algorithm | 选择算法:
|
Diagnostics | 显示关于要最小化或求解的函数的诊断信息。选项是 |
Display | 显示级别(请参阅迭代输出):
|
MaxIterations | 允许的最大迭代次数;为非负整数。
对于 |
OptimalityTolerance | 一阶最优性的终止容差;非负标量。
请参阅容差和停止条件。 对于 |
StepTolerance |
对于 |
仅 'trust-region-reflective'
算法
FunctionTolerance | 函数值的终止容差;非负标量。默认值取决于问题类型:边界约束问题使用 对于 |
| 黑塞矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数计算黑塞矩阵乘积 W = hmfun(Hinfo,Y) 其中 有关使用此选项的示例,请参阅使用密集、结构化的 Hessian 矩阵进行二次最小化。 对于 |
MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数;正标量。对于边界约束问题,默认值为 |
PrecondBandWidth | PCG 的预条件子的上带宽;非负整数。默认情况下, |
SubproblemAlgorithm | 确定迭代步的计算方式。与 |
TolPCG | PCG 迭代的终止容差:正标量。默认值为 |
TypicalX | 典型的 |
仅 'interior-point-convex'
算法
ConstraintTolerance | 约束违反值的容差;为非负标量。默认值为 对于 |
LinearSolver | 算法内部线性求解器的类型:
|
ScaleProblem | 当 对于一些线性约束( |
仅 'active-set'
算法
ConstraintTolerance | 约束违反值的容差;为非负标量。默认值为 对于 |
ObjectiveLimit | 容差(停止条件),标量。如果目标函数值低于 |
UseCodegenSolver | 对使用目标硬件上运行的软件版本的指示,指定为 |
单精度代码生成
Algorithm | 必须是 |
ConstraintTolerance | 约束违反值容差;正标量。默认值为 对于 |
MaxIterations | 允许的最大迭代次数,非负整数。默认值为 |
ObjectiveLimit | 容差(停止条件),标量。如果目标函数值低于 |
OptimalityTolerance | 一阶最优性的终止容差,正标量。默认值为 对于 |
StepTolerance | 关于正标量 对于 |
UseCodegenSolver | 对使用目标硬件上运行的软件版本的指示,指定为 |
问题结构体,指定为具有以下字段的结构体:
| 1/2*x'*H*x 中的对称矩阵 |
| 线性项 f'*x 中的向量 |
| 线性不等式约束 Aineq*x ≤ bineq 中的矩阵 |
| 线性不等式约束 Aineq*x ≤ bineq 中的向量 |
| 线性等式约束 Aeq*x = beq 中的矩阵 |
| 线性等式约束 Aeq*x = beq 中的向量 |
lb | 由下界组成的向量 |
ub | 由上界组成的向量 |
| x 的初始点 |
| 'quadprog' |
| 使用 optimoptions 或 optimset 创建的选项 |
必需字段有 H
、f
、solver
和 options
。在求解时,quadprog
忽略 problem
中上面列出的字段以外的任何字段。
注意
您不能将热启动与 problem
参量结合使用。
数据类型: struct
热启动对象,指定为使用 optimwarmstart
创建的对象。热启动对象包含起点和选项,以及代码生成中的内存大小数据(可选)。请参阅热启动最佳实践。
示例: ws = optimwarmstart(x0,options)
输出参量
解,以实数向量形式返回。x
是在满足所有边界和线性约束的条件下对 1/2*x'*H*x + f'*x
进行最小化的向量。x
可以是非凸问题的局部最小值。对于凸问题,x
是全局最小值。有关详细信息,请参阅局部最优与全局最优。
热启动对象求解,以 QuadprogWarmStart
对象形式返回。解点是 wsout.X
。
您可以在后续的 quadprog
调用中使用 wsout
作为输入热启动对象。
在解处的目标函数值,以实数标量形式返回。fval
是 1/2*x'*H*x + f'*x
在解 x
处的值。
quadprog
停止的原因,以下表中所述的整数形式返回。
所有算法 | |
| 函数收敛于解 |
| 迭代次数超出 |
| 问题不可行。或者,对于 |
| 问题无界。 |
| |
| 步长小于 |
| 检测到非凸问题。 |
| 无法计算步的方向。 |
| |
| 找到局部最小值;最小值不唯一。 |
| 目标函数值的变化小于 |
| 当前搜索方向不是下降方向。无法取得进一步进展。 |
| |
|
注意
有时,在问题实际无界时,'active-set'
算法会停止并返回退出标志 0
。设置更高的迭代限制也会返回退出标志 0
。
有关优化过程的信息,以包含下列字段的结构体形式返回:
| 执行的迭代次数 |
| 使用的优化算法 |
| PCG 迭代总数(仅适用于 |
constrviolation | 约束函数的最大值 |
firstorderopt | 一阶最优性的测度 |
linearsolver | 内部线性求解器的类型, |
message | 退出消息 |
详细信息
接下来的几项列出了可能增强的退出消息 quadprog
。增强的退出消息在消息的第一句中给出了更多信息的链接。
求解器找到一个满足所有边界约束和线性约束的最小化点。由于问题是凸问题,该最小化点是全局最小值。有关详细信息,请参阅局部最优与全局最优。
求解器停止,因为最后一步太小了。当相对步长低于 StepTolerance容差,则迭代结束。有时,这意味着求解器找到了最小值。然而,一阶最优性度量不低于 OptimalityTolerance,因此结果可能不准确。所有约束均已满足。
要继续,请尝试以下操作:
检查
output
结构中的一阶最优性度量。如果一阶最优性度量很小,那么返回的解很可能是准确的。将
StepTolerance
选项设置为0
。有时,此设置可帮助求解器继续进行,但有时求解器会因其他问题而停滞。尝试不同算法。如果求解器提供了多得算法选择,有时尝试不同的算法可能会成功。
尝试删除依赖约束。这可以确保没有任何多余的线性约束。
quadprog
停止,因为它似乎找到了一个满足所有约束并导致目标函数无限下降的方向
要继续,请:
确保每个分量都有有限的边界。
检查目标函数以确保它是严格凸函数(即二次矩阵的特征值严格为正)。
查看相关的线性规划问题(即没有二次项的原始问题)是否有有限解。
求解器无法继续,因为它无法计算出一个通向最小值的方向。这很可能是由于冗余的线性约束或容差过小所导致的。
要继续,请:
检查线性约束矩阵是否存在冗余。尝试识别并消除冗余的线性约束。
确保您的
FunctionTolerance
、OptimalityTolerance
和ConstraintTolerance
选项大于1e-14
,最好大于1e-12
。请参阅容差和停止条件。
求解器在预求解阶段找到了解。这意味着有了此边界、线性约束和 f
(线性目标系数)可以立即找到解。有关详细信息,请参阅预求解/后求解。
在预求解过程中,求解器发现问题的表达式不一致。不一致意味着并非所有约束都能在一个点 x 上得到满足。有关详细信息,请参阅预求解/后求解。
在预求解过程中,求解器找到一个可行方向,在该方向上目标函数无边界地递减。有关详细信息,请参阅预求解/后求解。
quadprog
收敛到不满足所有约束的点,在约束范围内 容差 称为ConstraintTolerance。quadprog
停止的原因是上一个步长太小。当相对步长低于 StepTolerance 容忍度,则迭代结束。
有关如何继续的建议,请参阅quadprog 收敛于不可行点。
求解器收敛到不满足所有约束的点,在约束范围内 容差 称为ConstraintTolerance。求解器停止的原因是上一个步长太小。当相对步长低于 StepTolerance 容忍度,则迭代结束。
不存在满足所有边界和线性约束的点。有关检查不一致的线性约束的帮助,请参阅调查线性不可行性。
只有一个可行点。独立线性等式约束的数量与问题中的变量数量相同。
求解器停止,因为一阶最优性度量小于 OptimalityTolerance
容差。
一阶最优性度量是投影梯度的无穷范数。投影是投影到线性等式矩阵 Aeq
的零空间上。
求解器停止在零曲率点处,即局部最小值处。存在其他具有相同目标函数值的可行点。
存在零曲率或负曲率方向,目标函数沿着这些方向无限减小。因此,对于任何目标值,都存在目标值小于目标的可行点。检查问题中是否包含足够的约束,例如所有变量的边界。
求解器停止,因为一阶最优性度量小于 OptimalityTolerance容差。
接下来的几项包含以下术语的定义 quadprog
退出消息。
一般来说,容差是一个阈值,超过阈值时将终止求解器的迭代。有关容差的详细信息,请参阅容差和停止条件。
如果从任何可行点都不存在具有负曲率的可行方向,则二次规划问题为凸问题。凸问题只有一个局部最小值,它也是全局最小值。
来自可行点 x 的可行方向是满足以下条件的向量 v:对于足够小的正 a,x + av 可行。
可行点是一个满足所有约束的点。
StepTolerance
是一个 容差 最后一步的大小,即评估 fsolve
位置变化的大小。
称为 OptimalityTolerance
的容差与一阶最优性测度相关。当一阶最优性测度小于 OptimalityTolerance
时,迭代结束。
对于约束问题,一阶最优性测度是以下两个量的最大值:
对于无约束问题,一阶最优性测度是梯度向量分量绝对值的最大值(也称为无穷范数)。
一阶最优性测度在最小化点上应为零。
有关详细信息,包括这些方程中所有变量的定义,请参阅一阶最优性测度。
对于无约束问题,一阶最优性测度是梯度向量分量绝对值的最大值(也称为梯度的无穷范数)。在最小化点处,此值应为零。
对于有边界问题,一阶最优性测度是最大值除以 |vi*gi| 的 i。此处,gi 是梯度的第 i 个分量,x 是当前点,并且
如果 xi 位于边界上,则 vi 为零。如果 xi 不在边界上,则在最小化点上,梯度 gi 应为零。因此,一阶最优性测度在最小化点上应为零。
有关详细信息,请参阅一阶最优性测度。
约束 容差 称为 ConstraintTolerance
,是当前点所有约束函数值的最大值。
ConstraintTolerance
的运算原理不同于其他容差。如果不满足 ConstraintTolerance
(即,如果约束函数的模超过 ConstraintTolerance
),求解器将尝试继续求解,除非因其他原因而停止。求解器不会仅仅因为满足 ConstraintTolerance
就停止。
KKT 条件状态,在最优 x 下,存在拉格朗日乘数 和 λeq,使得
变量 、 和 包含边界作为线性不等式的一部分。
对偶可行性 rd 是 的绝对值。
缩放因子 ρ 为
范数 是表达式中元素的最大绝对值。
KKT 条件状态,在最优 x 下,存在拉格朗日乘数 和 λeq,使得
变量 、 和 包含边界作为线性不等式的一部分。
φ 评价函数是
φ 定义中的术语:
表达式 φmin 表示在所有迭代中看到的 φ 的最小值。
预求解是一组用于简化线性或二次规划问题的算法。这些算法寻找简单的不一致问题,例如不一致的边界和线性约束。它们也寻找冗余的边界和线性不等式。有关详细信息,请参阅预求解/后求解。
算法
'interior-point-convex'
算法尝试遵循严格在约束范围内的路径。它使用预求解模块来消除冗余,并通过求解简单的分量来简化问题。
该算法针对稀疏黑塞矩阵 H
和稠密矩阵有不同的实现。通常,对于大型稀疏问题,稀疏实现更快,对于稠密或小型问题,稠密实现更快。有关详细信息,请参阅interior-point-convex quadprog 算法。
'trust-region-reflective'
算法基于 [1] 中所述的内部反射牛顿法的子空间信赖域方法。每次迭代都涉及使用预条件共轭梯度法 (PCG) 来近似求解大型线性系统。有关详细信息,请参阅trust-region-reflective quadprog 算法。
'active-set'
算法是一种投影方法,类似于 [2] 中所述的方法。该算法不使用稀疏数据;请参阅稀疏性在优化算法中的应用。有关详细信息,请参阅active-set quadprog 算法。
热启动对象维护先前已求解问题的活动约束列表。求解器将尽可能多地携带活动约束信息来求解当前问题。如果前一个问题与当前问题差异太大,则不会重用任何活动约束集信息。在这种情况下,求解器实际上执行冷启动,以重新构建活动约束列表。
替代功能
App
优化实时编辑器任务为 quadprog
提供了一个可视化界面。
参考
[1] Coleman, T. F., and Y. Li. “A Reflective Newton Method for Minimizing a Quadratic Function Subject to Bounds on Some of the Variables.” SIAM Journal on Optimization. Vol. 6, Number 4, 1996, pp. 1040–1058.
[2] Gill, P. E., W. Murray, and M. H. Wright. Practical Optimization. London: Academic Press, 1981.
[3] Gould, N., and P. L. Toint. “Preprocessing for quadratic programming.” Mathematical Programming. Series B, Vol. 100, 2004, pp. 95–132.
扩展功能
用法说明和限制:
quadprog
支持使用codegen
(MATLAB Coder) 函数或 MATLAB® Coder™ 生成代码。您必须拥有 MATLAB Coder 许可证才能生成代码。目标硬件必须支持标准双精度浮点计算或标准单精度浮点计算。
代码生成目标与 MATLAB 求解器不使用相同的数学核心函数库。因此,代码生成解可能不同于求解器解,尤其是对于病态问题。
要在生成代码前在 MATLAB 中测试代码,请将
UseCodegenSolver
选项设置为true
。这样,求解器便可使用代码生成创建的相同代码。在生成代码时,
quadprog
不支持problem
参量。[x,fval] = quadprog(problem) % Not supported
所有
quadprog
输入矩阵(如A
、Aeq
、lb
和ub
)都必须是满矩阵,而不能是稀疏矩阵。您可以使用full
函数将稀疏矩阵转换为满矩阵。lb
和ub
参量的条目数必须与H
中的列数相同,或必须为空[]
。如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
。对于涉及嵌入式处理器的高级代码优化,您还需要 Embedded Coder® 许可证。
您必须包括适用于
quadprog
的选项,并使用optimoptions
指定这些选项。选项中必须包括Algorithm
并将其设置为'active-set'
。options = optimoptions("quadprog",Algorithm="active-set"); [x,fval,exitflag] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options);
代码生成支持以下选项:
Algorithm
- 必须为'active-set'
ConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
UseCodegenSolver
生成的代码只会对选项进行有限的错误检查。更新选项的推荐方法是使用
optimoptions
,而不是圆点表示法。opts = optimoptions('quadprog','Algorithm','active-set'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
不要从文件中加载选项。否则会导致代码生成失败。请在代码中创建选项。
如果您指定了不受支持的选项,在代码生成过程中通常会忽略该选项。为了获得可靠的结果,请仅指定支持的选项。
有关示例,请参阅为 quadprog 生成代码。
版本历史记录
在 R2006a 之前推出将新的 UseCodegenSolver
选项设置为 true
,以便 quadprog
使用与代码生成所创建软件相同的版本。通过此选项,可以在生成代码或将代码部署到硬件之前检查求解器的行为。对于支持单精度代码生成的求解器,生成的代码也可以支持单精度硬件。您可以在生成代码时包含该选项;该选项对代码生成没有影响,但保留该选项可以省去删除它的步骤。尽管生成的代码与 MATLAB 代码相同,但结果可能因链接的数学库不同而略有差异。
您可以使用 quadprog
为单精度浮点硬件生成代码。有关说明,请参阅单精度代码生成。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)