fseminf
求解半无限约束多变量非线性函数的最小值
语法
说明
fseminf
是非线性规划求解器,用于求由下式指定的问题的最小值
b 和 beq 是向量。
A 和 Aeq 是矩阵。
c(x)、ceq(x) 和 Ki(x,wi) 是返回向量的函数。
f(x) 是返回标量的函数。
f(x)、c(x) 和 ceq(x) 可以是非线性函数。向量(或矩阵)Ki(x,wi) ≤ 0 是 x 和一组附加变量 w1,w2,...,wn 的连续函数。变量 w1,w2,...,wn 是长度最大为 2 的向量。
x、lb 和 ub 可以作为向量或矩阵传递;请参阅矩阵参数。
示例
最小化具有半无限约束的函数
最小化函数
,
需满足以下约束
(对于全部 )。
无约束目标函数在 处具有最小值。然而,约束
(对于全部 )
意味着 。请注意,,因此
.
因此
当 时,。
要使用 fseminf
求解此问题,请将目标函数写为匿名函数。
objfun = @(x)(x-1)^2;
编写半无限约束函数 seminfcon
,其中包括非线性约束 [ ]、 的初始采样间隔(步长为 0.01,采样间隔为 0 到 1),以及半无限约束函数 。seminfcon
函数的代码在此示例末尾。
设置初始点 x0 = 0.2
。
x0 = 0.2;
指定一个半无限约束。
ntheta = 1;
通过调用 fseminf
求解问题并查看结果。
x = fseminf(objfun,x0,ntheta,@seminfcon)
Local 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.
x = 0.5000
以下代码创建 seminfcon
函数。
function [c, ceq, K1, s] = seminfcon(x,s) % No finite nonlinear inequality and equality constraints c = []; ceq = []; % Sample set if isnan(s) % Initial sampling interval s = [0.01 0]; end t = 0:s(1):1; % Evaluate the semi-infinite constraint K1 = (x - 0.5) - (t - 0.5).^2; end
检查 fseminf
输出
最小化函数
,
需满足以下约束
(对于全部 )。
示例最小化具有半无限约束的函数中表示了此问题并进行了求解,其中提供有关解和求解过程的详细信息。
要使用 fseminf
求解此问题,请将目标函数写为匿名函数。
objfun = @(x)(x-1)^2;
非线性和半无限约束函数 seminfcon
的代码出现在此示例末尾。
设置初始点 x0 = 0.2
。
x0 = 0.2;
指定一个半无限约束。
ntheta = 1;
通过调用 fseminf
求解问题并查看结果。
A = [];
b = [];
Aeq = [];
beq = [];
lb = 0;
ub = 2;
[x,fval,exitflag,output,lambda] = fseminf(objfun,x0,ntheta,@seminfcon,...
A,b,Aeq,beq,lb,ub)
Local 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.
x = 0.5000
fval = 0.2500
exitflag = 1
output = struct with fields:
iterations: 2
funcCount: 4
lssteplength: 1
stepsize: 4.6841e-12
algorithm: 'active-set'
firstorderopt: 9.3682e-12
constrviolation: 4.6841e-12
message: 'Local minimum found that satisfies the constraints....'
lambda = struct with fields:
lower: 0
upper: 0
eqlin: [0x1 double]
eqnonlin: [0x1 double]
ineqlin: [0x1 double]
ineqnonlin: [1x0 double]
返回的值显示:
问题在 处求得解。
目标函数 的值是 。
求解器需要两次迭代和四次函数计算才能得到该解。
除了半无限约束之外,其他约束只有边界,因此
lambda
结构体没有线性或非线性值。对应于边界的lambda.lower
和lambda.upper
字段不为空,而是具有零值,因为解不在任一边界上。
以下代码创建 seminfcon
函数。
function [c, ceq, K1, s] = seminfcon(x,s) % No finite nonlinear inequality and equality constraints c = []; ceq = []; % Sample set if isnan(s) % Initial sampling interval s = [0.01 0]; end t = 0:s(1):1; % Evaluate the semi-infinite constraint K1 = (x - 0.5) - (t - 0.5).^2; end
输入参数
fun
— 要计算最小值的函数
函数句柄 | 函数名称
要计算最小值的函数,指定为函数句柄或函数名称。fun
函数接受向量或数组 x
,并返回实数标量 f
,即在 x
处计算的目标函数值。
fseminf
以 x0
参数的形状将 x
传递给目标函数和任何非线性约束函数。例如,如果 x0
是 5×3 数组,则 fseminf
将 x
以 5×3 数组的形式传递给 fun
。但是,在将 x
转换为列向量 x(:)
后,fseminf
会将线性约束矩阵 A
或 Aeq
乘以 x
。
将 fun
指定为文件的函数句柄。
x = fseminf(@myfun,...)
此处,myfun
是一个 MATLAB® 函数,如下所示。
function f = myfun(x) f = ... % Compute function value at x
您还可以为匿名函数指定 fun
作为函数句柄。
x = fseminf(@(x)norm(x)^2,...);
如果您可以计算 fun
的梯度且 SpecifyObjectiveGradient
选项设置为 true
,设置如下
options = optimoptions('fseminf','SpecifyObjectiveGradient',true);
fun
必须在第二个输出参数中返回梯度向量 g(x)
。
示例: fun = @(x)sin(x(1))*cos(x(2))
数据类型: char
| function_handle
| string
x0
— 初始点
实数向量 | 实数数组
ntheta
— 半无限约束的数量
正整数
半无限约束的数量,指定为正整数。
示例: 4
数据类型: double
seminfcon
— 计算非线性约束和半无限约束的函数
函数句柄 | 函数名称
函数计算点 x
处的非线性不等式约束向量 c
,非线性等式约束向量 ceq
,以及在区间 S
上求值的 ntheta
半无限约束(向量或矩阵)K1
、K2
、...
、Kntheta
。您可以将 seminfcon
指定为函数句柄。
x = fseminf(@myfun,x0,ntheta,@myinfcon)
其中 myinfcon
是一个 MATLAB 函数,例如
function [c,ceq,K1,K2,...,Kntheta,S] = myinfcon(x,S) % Initial sampling interval if isnan(S(1,1)), S = ...% S has ntheta rows and 2 columns end w1 = ...% Compute sample set w2 = ...% Compute sample set ... wntheta = ... % Compute sample set K1 = ... % 1st semi-infinite constraint at x and w K2 = ... % 2nd semi-infinite constraint at x and w ... Kntheta = ...% Last semi-infinite constraint at x and w c = ... % Compute nonlinear inequalities at x ceq = ... % Compute nonlinear equalities at x
S
是建议的采样间隔,该函数可能不会使用它。如果不存在此类约束,则对 c
和 ceq
返回 []
。
向量或矩阵 K1
、K2
、...
、Kntheta
分别包含针对自变量 w1
、w2
、...
、wntheta
的一组采样值计算的半无限约束。两列矩阵 S
包含 w1
、w2
、...
、wntheta
的值的建议采样间隔,采样值将用于计算 K1
、K2
、...
和 Kntheta
。S
的第 i
行包含用于计算 K
i
的建议采样间隔。当 K
i
是向量时,函数仅使用 S(i,1)
(第二列可以全为零)。当 K
i
是矩阵时,该函数使用 S(i,2)
对 K
i
中的行进行采样,并使用 S(i,1)
作为 K
i
的列的采样间隔(请参阅Two-Dimensional Semi-Infinite Constraint)。由于 S
在第一次迭代中是 NaN
,seminfcon
必须确定一个初始采样间隔。
注意
由于 Optimization Toolbox™ 函数只接受 double
类型的输入,因此用户提供的目标和非线性约束函数必须返回 double
类型的输出。
如有必要,请参阅传递额外参数来了解有关参数化 seminfcon
的方法。有关一维和二维采样点的示例,请参阅创建采样点的示例。
A
— 线性不等式约束
实矩阵
线性不等式约束,指定为实矩阵。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
。
数据类型: double
b
— 线性不等式约束
实数向量
线性不等式约束,指定为实数向量。b
是与 A
矩阵相关的包含 M
个元素的向量。如果将 b
作为行向量传递,求解器会在内部将 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
。
数据类型: double
Aeq
— 线性等式约束
实矩阵
线性等式约束,指定为实矩阵。Aeq
是 Me
×N
矩阵,其中 Me
是等式的数目,而 N
是变量的数目(x0
中的元素数)。对于大型问题,将 Aeq
作为稀疏矩阵传递。
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
。
数据类型: double
beq
— 线性等式约束
实数向量
线性等式约束,指定为实数向量。beq
是与 Aeq
矩阵相关的包含 Me
个元素的向量。如果将 beq
作为行向量传递,求解器会在内部将 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
。
数据类型: double
lb
— 下界
实数向量 | 实数数组
下界,指定为实数向量或实数数组。如果 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))
。
数据类型: double
ub
— 上界
实数向量 | 实数数组
上界,指定为实数向量或实数数组。如果 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))
。
数据类型: double
options
— 优化选项
optimoptions
的输出 | 结构体,例如 optimset
返回的结构体
优化选项,指定为 optimoptions
的输出或 optimset
等返回的结构体。有关详细信息,请参阅优化选项参考。
optimoptions
显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。
选项 | 描述 |
---|---|
| 将用户提供的导数(目标或约束的梯度)与有限差分导数进行比较。选择项是 对于 以后的版本中将会删除 |
ConstraintTolerance | 约束违反值的终止容差(正标量)。默认值为 对于 |
Diagnostics | 显示关于要最小化或求解的函数的诊断信息。选择项是 |
DiffMaxChange | 有限差分梯度变量的最大变化(正标量)。默认值为 |
DiffMinChange | 有限差分梯度变量的最小变化(正标量)。默认值为 |
Display | 显示级别(请参阅迭代输出):
|
FiniteDifferenceStepSize | 有限差分的标量或向量步长因子。当您将
sign′(x) = sign(x) (例外是 sign′(0) = 1 )。中心有限差分是
FiniteDifferenceStepSize 扩展为向量。对于正向有限差分,默认值为 sqrt(eps) ;对于中心有限差分,默认值为 eps^(1/3) 。 对于 |
FiniteDifferenceType | 用于估计梯度的有限差分是 当同时估计这两种类型的有限差分时,该算法小心地遵守边界。例如,为了避免在边界之外的某个点处进行计算,算法可能需要后向差分,而不是前向差分。 对于 |
FunctionTolerance | 函数值的终止容差(正标量)。默认值为 对于 |
FunValCheck | 检查目标函数和约束值是否有效。当目标函数或约束返回的值是 |
MaxFunctionEvaluations | 允许的函数计算最大次数,为正整数。默认值为 对于 |
MaxIterations | 允许的迭代最大次数,为正整数。默认值为 对于 |
MaxSQPIter | 允许的 SQP 迭代最大次数(正整数)。默认值为 |
OptimalityTolerance | 一阶最优性的终止容差(正标量)。默认值为 对于 |
OutputFcn | 指定优化函数在每次迭代中调用的一个或多个用户定义的函数。传递函数句柄或函数句柄的元胞数组。默认值是“无”( |
PlotFcn | 对算法执行过程中的各种进度测量值绘图,可以选择预定义的绘图,也可以自行编写绘图函数。传递名称、函数句柄或由名称或函数句柄组成的元胞数组。对于自定义绘图函数,传递函数句柄。默认值是“无”(
自定义绘图函数使用与输出函数相同的语法。请参阅Optimization Toolbox 的输出函数和Output Function and Plot Function Syntax。 对于 |
RelLineSrchBnd | 线搜索步长的相对边界(非负实数标量值),使得 |
RelLineSrchBndDuration |
|
SpecifyObjectiveGradient | 用户定义的目标函数梯度。请参阅前面对 对于 |
StepTolerance | 关于正标量 对于 |
TolConSQP | 内部迭代 SQP 约束违反值的终止容差(正标量)。默认值为 |
TypicalX | 典型的 |
示例: options = optimoptions('fseminf','PlotFcn','optimplotfval')
problem
— 问题结构体
结构体
问题结构体,指定为含有以下字段的结构体。
字段名称 | 条目 |
---|---|
| 目标函数 |
| x 的初始点 |
| 半无限约束的数量 |
| 半无限约束函数 |
| 线性不等式约束的矩阵 |
| 线性不等式约束的向量 |
| 线性等式约束的矩阵 |
| 线性等式约束的向量 |
lb | 由下界组成的向量 |
ub | 由上界组成的向量 |
| 'fmseminf' |
| 用 optimoptions 创建的选项 |
您必须在 problem
结构体中至少提供 objective
、x0
、seminfcon
、solver
和 options
字段。
数据类型: struct
输出参数
fval
— 解处的目标函数值
实数
解处的目标函数值,以实数形式返回。通常,fval
= fun(x)
。
exitflag
— fseminf
停止的原因
整数
fseminf
停止的原因,以整数形式返回。
标志 | 描述 |
---|---|
| 函数收敛于解 |
| 搜索方向的模小于指定的容差,约束违反值小于 |
| 方向导数的模小于指定容差,约束违反值小于 |
| 迭代次数超过 |
| 由输出函数或绘图函数停止。 |
| 找不到可行点。 |
output
— 有关优化过程的信息
结构体
有关优化过程的信息,以包含下列字段的结构体形式返回。
字段名称 | 描述 |
---|---|
iterations | 执行的迭代次数 |
funcCount | 函数计算次数 |
lssteplength | 相对于搜索方向的线搜索步长 |
stepsize |
|
algorithm | 使用的优化算法 |
constrviolation | 约束函数的最大值 |
firstorderopt | 一阶最优性的测度 |
message | 退出消息 |
iterations | 执行的迭代次数 |
funcCount | 函数计算次数 |
局限性
要最小化的函数、约束和半无限约束必须为
x
和w
的连续函数。fseminf
可能只提供局部解。
算法
fseminf
使用三次和二次插值方法来估计半无限约束中的峰值。该算法使用峰值来构成一组约束,这些约束将提供给 SQP 方法,就像在 fmincon
函数中那样。当约束数量发生变化时,算法将重新为新的约束组分配拉格朗日乘数。
建议的采样间隔计算使用峰值插值和在数据集中的峰值之间的差值来估计函数需要增加还是减少数据点。该函数还通过外插曲线并将其与曲线中的其他点进行比较来计算内插的有效性。当峰值接近约束边界(即零)时,建议的采样间隔减小。
当问题不可行时,fseminf
会尝试最小化最大约束值。
有关所用算法的详细信息,以及当使用 optimoptions
将 Display
选项设置为 'iter'
时在 Procedures
标题下显示的过程类型的详细信息,请参阅SQP 实现。有关 fseminf
算法的详细信息,请参阅fseminf 问题的表示和算法。
版本历史记录
在 R2006a 之前推出R2023b: CheckGradients
选项将被删除
以后的版本中将会删除 CheckGradients
选项。要检查目标函数或非线性约束函数的一阶导数,请使用 checkGradients
函数。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)