主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

fseminf

R2026a

求解半无限约束的多变量非线性最小化问题

描述

fseminf 是非线性规划求解器,用于求由下式指定的问题的最小值

minxf(x) such that {A⋅x≤bAeq⋅x=beqlb≤x≤ubineqnonlin(x)≤0,eqnonlin(x)=0,Ki(x,wi)≤0, 1≤i≤n.

  • b 和 beq 是向量。

  • A 和 Aeq 是矩阵。

  • ineqnonlin(x)、eqnonlin(x) 和 Ki(x,wi) 是返回向量的函数。

  • f(x) 是返回标量的函数。

f(x)、ineqnonlin(x) 和 eqnonlin(x) 可以是非线性函数。向量(或矩阵)Ki(x,wi) ≤ 0 是 x 和一组附加变量 w1,w2,...,wn 的连续函数。变量 w1,w2,...,wn 是长度最大为 2 的向量。

x、lb 和 ub 可以作为向量或矩阵传递;请参阅矩阵参量。

x = fseminf(fun,x0,ntheta,seminfcon) 从 x0 开始,寻找函数 fun 的极小值,该函数受 ntheta 中定义的半无限约束的限制,这些约束在 seminfcon 中定义。

示例

x = fseminf(fun,x0,ntheta,seminfcon,A,b) 还尝试满足线性不等式 A*x ≤ b。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq) 还会在满足线性等式 Aeq*x = beq 的情况下进行最小化。如果不存在不等式,请设置 A = [] 和 b = []。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub) 对 x 中的设计变量定义一组下界和上界,使解始终在 lb ≤ x ≤ ub 范围内。

x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options) 使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。

x = fseminf(problem) 求 problem 的最小值,它是 problem 中所述的一个结构体。

[x,fval] = fseminf(___),对任何上述输入语法,返回目标函数 fun 在解 x 处的值。

注意

如果为问题指定的输入边界不一致,则输出 x 为 x0,输出 fval 为 []。

[x,fval,exitflag,output] = fseminf(___) 还返回描述退出条件的值 exitflag,以及提供优化过程信息的结构体 output。

示例

[x,fval,exitflag,output,lambda] = fseminf(___) 返回结构体 lambda,该结构体的字段包含在解 x 处的拉格朗日乘数。

示例

示例

全部折叠

最小化函数

(x-1)2,

需满足以下约束

0≤x≤2

g(x,t)=(x-1/2)-(t-1/2)2≤0(对于全部 0≤t≤1)。

无约束目标函数在 x=1 处最小化。然而,约束

g(x,t)≤0(对于全部 0≤t≤1)

意味着 x≤1/2。请注意,(t-1/2)2≥0,因此

maxtg(x,t)=x-1/2.

因此,

当 x≤1/2 时,maxtg(x,t)≤0。

要使用 fseminf 求解此问题,请将目标函数写为匿名函数。

objfun = @(x)(x-1)^2;

编写半无限约束函数 seminfcon,其中包括非线性约束 [ ]、t 的初始采样间隔(步长为 0.01,采样间隔为 0 到 1),以及半无限约束函数 g(x,t)。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.

<stopping criteria details>
x = 
0.5000

以下代码创建 seminfcon 函数。

function [ineqnonlin,eqnonlin,K1,s] = seminfcon(x,s)

% No finite nonlinear inequality and equality constraints
ineqnonlin = [];
eqnonlin = [];

% 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

最小化函数

(x-1)2,

需满足以下约束

0≤x≤2

g(x,t)=(x-1/2)-(t-1/2)2≤0(对于全部 0≤t≤1)。

示例最小化具有半无限约束的函数中表示了此问题并进行了求解,其中提供有关解和求解过程的详细信息。

要使用 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.

<stopping criteria details>
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.↵↵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 first-order optimality measure, 9.368173e-12, is less↵than options.OptimalityTolerance = 1.000000e-04, and the maximum constraint violation,↵4.684060e-12,is less than options.ConstraintTolerance = 1.000000e-06.'

lambda = struct with fields:
         lower: 0
         upper: 0
         eqlin: [0×1 double]
      eqnonlin: [0×1 double]
       ineqlin: [0×1 double]
    ineqnonlin: [1×0 double]

返回的值显示:

  • 问题在 x=1/2 处求得解。

  • 目标函数 (x-1)2 的值是 1/4。

  • 求解器需要两次迭代和四次函数计算才能得到该解。

  • 除了半无限约束之外,其他约束只有边界,因此 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 函数接受向量或数组 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 中的元素数量和 x0 的大小来确定 fun 接受的变量数量和大小。

示例: x0 = [1,2,3,4]

数据类型: double

半无限约束的数量,指定为正整数。

示例: 4

数据类型: double

函数计算点 x 处的非线性不等式约束向量 ineqnonlin,非线性等式约束向量 eqnonlin,以及在区间 S 上求值的 ntheta 半无限约束(向量或矩阵)K1,K2,...,Kntheta。您可以将 seminfcon 指定为函数句柄。

x = fseminf(@myfun,x0,ntheta,@myinfcon)

其中 myinfcon 是一个 MATLAB 函数,例如

function [ineqnonlin,eqnonlin,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
ineqnonlin = ... % Compute nonlinear inequalities at x
eqnonlin = ... % Compute nonlinear equalities at x

S 是建议的采样间隔,该函数可能不会使用它。如果不存在此类约束,则对 ineqnonlin 和 eqnonlin 返回 []。

向量或矩阵 K1、K2、...、Kntheta 分别包含针对自变量 w1、w2、...、wntheta 的一组采样值计算的半无限约束。两列矩阵 S 包含 w1、w2、...、wntheta 的值的建议采样间隔,采样值将用于计算 K1、K2、... 和 Kntheta。S 的第 i 行包含用于计算 Ki 的建议采样间隔。当 K i 是向量时,函数仅使用 S(i,1)(第二列可以全为零)。当 Ki 是矩阵时,该函数使用 S(i,2) 对 Ki 中的行进行采样,并使用 S(i,1) 作为 Ki 的列的采样间隔(请参阅二维半无限约束)。由于 S 在第一次迭代中是 NaN,seminfcon 必须确定一个初始采样间隔。

注意

由于 Optimization Toolbox™ 函数只接受 double 类型的输入,因此用户提供的目标和非线性约束函数必须返回 double 类型的输出。

如有必要,请参阅传递额外参数来了解有关参数化 seminfcon 的方法。有关一维和二维采样点的示例,请参阅创建采样点的示例。

线性不等式约束,指定为实矩阵。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 以如下形式编写 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

优化选项,指定为 optimoptions 的输出或 optimset 等返回的结构体。有关详细信息,请参阅优化选项参考。

optimoptions 显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参阅查看优化选项。

选项描述
ConstraintTolerance

约束违反值的终止容差(非负标量)。默认值为 1e-6。请参阅容差和停止条件。

对于 optimset,名称为 TolCon。请参阅当前选项名称和旧选项名称。

Diagnostics

显示关于要最小化或求解的函数的诊断信息。选择项是 'on' 或默认值 'off'。

DiffMaxChange

有限差分梯度变量的最大变化(正标量)。默认值为 Inf。

DiffMinChange

有限差分梯度变量的最小变化(正标量)。默认值为 0。

Display

显示级别(请参阅迭代输出):

  • 'off' 或 'none' 不显示输出。

  • 'iter' 显示每次迭代的输出,并给出默认退出消息。

  • 'iter-detailed' 显示每次迭代的输出,并给出带有技术细节的退出消息。

  • 'notify' 仅当函数不收敛时才显示输出,并给出默认退出消息。

  • 'notify-detailed' 仅当函数不收敛时才显示输出,并给出技术性退出消息。

  • 'final'(默认值)仅显示最终输出,并给出默认退出消息。

  • 'final-detailed' 仅显示最终输出,并给出带有技术细节的退出消息。

FiniteDifferenceStepSize

有限差分的标量或向量步长因子。当您将 FiniteDifferenceStepSize 设置为向量 v 时,正向有限差分 delta 是

delta = v.*sign′(x).*max(abs(x),TypicalX);

其中 sign′(x) = sign(x)(例外是 sign′(0) = 1)。中心有限差分是

delta = v.*max(abs(x),TypicalX);

标量 FiniteDifferenceStepSize 扩展为向量。对于正向有限差分,默认值为 sqrt(eps);对于中心有限差分,默认值为 eps^(1/3)。

对于 optimset,名称为 FinDiffRelStep。请参阅当前选项名称和旧选项名称。

FiniteDifferenceType

用于估计梯度的有限差分是 'forward'(默认值)或 'central'(中心化)。'central' 需要两倍的函数计算次数,但可以更准确。

当同时估计这两种类型的有限差分时,该算法小心地遵守边界。例如,为了避免在边界之外的某个点处进行计算,算法可能需要后向差分,而不是前向差分。

对于 optimset,名称为 FinDiffType。请参阅当前选项名称和旧选项名称。

FunctionTolerance

函数值的终止容差(非负标量)。默认值为 1e-4。请参阅容差和停止条件。

对于 optimset,名称为 TolFun。请参阅当前选项名称和旧选项名称。

FunValCheck

检查目标函数和约束值是否有效。当目标函数或约束返回的值是 complex、Inf 或 NaN 时,设置 'on' 显示错误。默认值 'off' 不显示错误。

MaxFunctionEvaluations

允许的最大函数计算次数(非负整数)。默认值为 100*numberOfVariables。请参阅容差和停止条件和迭代和函数计算次数。

对于 optimset,名称为 MaxFunEvals。请参阅当前选项名称和旧选项名称。

MaxIterations

允许的最大迭代次数(非负整数)。默认值为 400。请参阅容差和停止条件和迭代和函数计算次数。

对于 optimset,名称为 MaxIter。请参阅当前选项名称和旧选项名称。

MaxSQPIter

允许的 SQP 迭代最大次数(正整数)。默认值为 10*max(numberOfVariables, numberOfInequalities + numberOfBounds)。

OptimalityTolerance

一阶最优性的终止容差(非负标量)。默认值为 1e-6。请参阅一阶最优性测度。

对于 optimset,名称为 TolFun。请参阅当前选项名称和旧选项名称。

OutputFcn

指定优化函数在每次迭代中调用的一个或多个用户定义的函数。传递函数句柄或函数句柄的元胞数组。默认值是“无”([])。请参阅输出函数和绘图函数语法。

PlotFcn

对算法执行过程中的各种进度测量值绘图,可以选择预定义的绘图,也可以自行编写绘图函数。传递名称、函数句柄或由名称或函数句柄组成的元胞数组。对于自定义绘图函数,传递函数句柄。默认值是“无”([])。

  • 'optimplotx' 绘制当前点。

  • 'optimplotfunccount' 绘制函数计数。

  • 'optimplotfval' 绘制函数值。

  • "optimplotfvalconstr" 绘制找到的最佳可行目标函数值。该图用一种颜色显示不可行点,用另一种颜色显示可行点,可行性容差为 1e-6。

  • 'optimplotconstrviolation' 绘制最大约束违反值。

  • 'optimplotstepsize' 绘制步长。

  • 'optimplotfirstorderopt' 绘制一阶最优性测度。

自定义绘图函数使用与输出函数相同的语法。请参阅Optimization Toolbox 的输出函数和输出函数和绘图函数语法。

对于 optimset,名称为 PlotFcns。请参阅当前选项名称和旧选项名称。

RelLineSrchBnd

线搜索步长的相对边界(非负实数标量值),使得 x 中的总位移满足 |Δx(i)| ≤ relLineSrchBnd· max(|x(i)|,|typicalx(i)|)。当 fseminf 认为求解器采用的步长过大时,此选项可控制 x 中位移的模。默认值为无边界 ([])。

RelLineSrchBndDuration

RelLineSrchBnd 所指定的边界应处于活动状态的迭代次数(默认值为 1)。

SpecifyObjectiveGradient

用户定义的目标函数梯度。请参阅前面对 fun 的说明,了解如何在 fun 中定义梯度。将此选项设置为 true,以使 fseminf 采用用户定义的目标函数梯度。默认值 false 会导致 fseminf 使用有限差分来估计梯度。

对于 optimset,名称为 GradObj,值为 'on' 或 'off'。请参阅当前选项名称和旧选项名称。

StepTolerance

x 的终止容差,非负标量。默认值为 1e-4。请参阅容差和停止条件。

对于 optimset,名称为 TolX。请参阅当前选项名称和旧选项名称。

TolConSQP

内部迭代 SQP 约束违反值的终止容差(正标量)。默认值为 1e-6。

TypicalX

典型的 x 值。TypicalX 中的元素数等于 x0(即起点)中的元素数。默认值为 ones(numberofvariables,1)。fseminf 使用 TypicalX 缩放有限差分来进行梯度估计。

示例: options = optimoptions('fseminf','PlotFcn','optimplotfval')

问题结构体,指定为含有以下字段的结构体。

字段名称条目

objective

目标函数

x0

x 的初始点

ntheta

半无限约束的数量

seminfcon

半无限约束函数

Aineq

线性不等式约束的矩阵

bineq

线性不等式约束的向量

Aeq

线性等式约束的矩阵

beq

线性等式约束的向量
lb由下界组成的向量
ub由上界组成的向量

solver

'fmseminf'

options

用 optimoptions 创建的选项

您必须在 problem 结构体中至少提供 objective、x0、seminfcon、solver 和 options 字段。

数据类型: struct

输出参量

全部折叠

解,以实数向量或实数数组形式返回。x 的大小与 x0 的大小相同。通常情况下,当 exitflag 为正时,x 是该问题的局部解。有关解质量的信息,请参阅求解成功后。

解处的目标函数值,以实数形式返回。通常,fval = fun(x)。

fseminf 停止的原因,以整数形式返回。

标志

描述

1

函数收敛于解 x。

4

搜索方向的模小于指定的容差,约束违反值小于 options.ConstraintTolerance。

5

方向导数的模小于指定容差,约束违反值小于 options.ConstraintTolerance。

0

迭代次数超过 options.MaxIterations 或函数计算次数超过 options.MaxFunctionEvaluations。

-1

由输出函数或绘图函数停止。

-2

找不到可行点。

有关优化过程的信息,以包含下列字段的结构体形式返回。

字段名称描述
iterations

执行的迭代次数

funcCount

函数计算次数

lssteplength

相对于搜索方向的线搜索步长

stepsize

x 中的最终位移

algorithm

使用的优化算法

constrviolation

约束函数的最大值

firstorderopt

一阶最优性的测度

message

退出消息

iterations

执行的迭代次数

funcCount

函数计算次数

解处的拉格朗日乘数,以包含下列字段的结构体形式返回。

字段名称描述
lower

对应于 lb 的下界

upper

对应于 ub 的上界

ineqlin

对应于 A 和 b 的线性不等式

eqlin

对应于 Aeq 和 beq 的线性等式

ineqnonlin

seminfcon 中与 ineqnonlin 函数对应的非线性不等式

eqnonlin

seminfcon 中与 eqnonlin 函数对应的非线性等式

限制

  • 要最小化的函数、约束和半无限约束必须为 x 和 w 的连续函数。

  • fseminf 可能只提供局部解。

算法

fseminf 使用三次和二次插值方法来估计半无限约束中的峰值。该算法使用峰值来构成一组约束,这些约束将提供给 SQP 方法,就像在 fmincon 函数中那样。当约束数量发生变化时,算法将重新为新的约束组分配拉格朗日乘数。

建议的采样间隔计算使用峰值插值和在数据集中的峰值之间的差值来估计函数需要增加还是减少数据点。该函数还通过外插曲线并将其与曲线中的其他点进行比较来计算内插的有效性。当峰值接近约束边界(即零)时,建议的采样间隔减小。

当问题不可行时,fseminf 会尝试最小化最大约束值。

有关所用算法的详细信息,以及当使用 optimoptions 将 Display 选项设置为 'iter' 时在 Procedures 标题下显示的过程类型的详细信息,请参阅SQP 实现。有关 fseminf 算法的详细信息,请参阅fseminf 问题的表示和算法。

版本历史记录

在 R2006a 之前推出

全部展开