Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

fseminf

求解半无限约束多变量非线性函数的最小值

方程

求以下问题的最小值:

minxf(x) such that {Axb,Aeqx=beq,lbxub,c(x)0,ceq(x)=0,Ki(x,wi)0, 1in.

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 可以作为向量或矩阵传递;请参阅矩阵参数

语法

x = fseminf(fun,x0,ntheta,seminfcon)
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
x = fseminf(problem)
[x,fval] = fseminf(...)
[x,fval,exitflag] = fseminf(...)
[x,fval,exitflag,output] = fseminf(...)
[x,fval,exitflag,output,lambda] = fseminf(...)

说明

fseminf 求解包含多个变量的半无限约束标量函数的最小值,从初始估计值开始。目的是最小化 f(x),使约束对 wi∈ℜ1(或 wi∈ℜ2)的所有可能值都成立。由于无法计算 Ki(x,wi) 的所有可能值,因此必须为 wi 选择一个区域,并基于该区域来计算一组适当的采样值。

注意

传递额外参数说明如何将额外的参数传递给目标函数和非线性约束函数(如有必要)。

x = fseminf(fun,x0,ntheta,seminfcon)x0 开始,求解满足 seminfcon 中定义的 ntheta 半无限约束条件的函数 fun 的最小值。

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,fval,exitflag] = fseminf(...) 返回描述退出条件的值 exitflag

[x,fval,exitflag,output] = fseminf(...) 返回一个包含有关优化的信息的结构体 output

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

注意

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

输入参数

Function Input Arguments包含传递到 fseminf 中的参数的一般说明。本节提供有关 funnthetaoptionsseminfconproblem 的函数特定详细信息:

fun

要最小化的函数。fun 函数接受向量 x 并返回标量 f(在 x 处进行计算的目标函数)。对于函数文件,函数 fun 可以指定为函数句柄

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

其中 myfun 是一个 MATLAB® 函数,例如

function f = myfun(x)
f = ...            % Compute function value at x

fun 也可以是匿名函数的函数句柄。

fun = @(x)sin(x''*x);

如果还可以计算 fun 的梯度 SpecifyObjectiveGradient 选项是 true(如以下设置所示)

options = optimoptions('fseminf','SpecifyObjectiveGradient',true)

则函数 fun 必须在第二个输出参数中返回在 x 处的梯度值 g(向量)。

ntheta

半无限约束的数量。

options

选项提供有关 options 值的函数特定详细信息。

seminfcon

该函数计算点 x 处的非线性不等式约束向量 c,非线性等式约束向量 ceq,以及在区间 S 上求值的 ntheta 半无限约束(向量或矩阵)K1K2...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 the nonlinear equalities at x

S 是推荐的采样间隔,可以使用也可以不使用。如果不存在此类约束,则对 cceq 返回 []

向量或矩阵 K1K2...Kntheta 分别包含针对自变量 w1w2...wntheta 的一组采样值计算的半无限约束。两列矩阵 S 包含 w1w2...wntheta 的值的建议采样间隔,采样值将用于计算 K1K2...KnthetaS 的第 i 行包含用于计算 Ki 的建议采样间隔。当 Ki 是向量时,将仅使用 S(i,1)(第二列可以全为零)。当 Ki 为矩阵时,将使用 S(i,2) 作为 Ki 中行的采样,使用 S(i,1) 作为 Ki 中列的采样间隔(请参阅Two-Dimensional Semi-Infinite Constraint)。在第一次迭代中,SNaN,因此一些初始采样间隔必须由 seminfcon 确定。

注意

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

传递额外参数解释在必要时如何参数化 seminfcon创建采样点的示例包含一维和二维采样点的示例。

problem

objective

目标函数

x0

x 的初始点
ntheta半无限约束的数量
seminfcon半无限约束函数

Aineq

线性不等式约束的矩阵

bineq

线性不等式约束的向量

Aeq

线性等式约束的矩阵

beq

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

solver

'fseminf'

options

optimoptions 创建的选项

输出参数

Function Input Arguments包含 fseminf 返回的参数的一般说明。本节提供有关 exitflaglambdaoutput 的函数特定详细信息:

exitflag

整数,用于标识算法终止的原因。以下列出了 exitflag 的值以及对应的算法终止原因。

1

函数收敛于解 x

4

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

5

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

0

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

-1

算法已被输出函数终止。

-2

找不到可行点。

lambda

结构体,包含在解 x 处的拉格朗日乘数(按约束类型分隔)。结构体字段有:

lower

下界 lb

upper

上界 ub

ineqlin

线性不等式

eqlin

线性等式

ineqnonlin

非线性不等式

eqnonlin

非线性等式

output

结构体,包含有关优化的信息。结构体字段有:

iterations

执行的迭代次数

funcCount

函数计算次数

lssteplength

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

stepsize

x 中的最终位移

algorithm

使用的优化算法

constrviolation

约束函数的最大值

firstorderopt

一阶最优性的度量

message

退出消息

选项

fseminf 使用的优化选项。使用 optimoptions 设置或更改 options。有关详细信息,请参阅优化选项参考

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

CheckGradients

将用户提供的导数(目标或约束的梯度)与有限差分导数进行比较。选择项是 true 或默认值 false

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

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

检查目标函数和约束值是否有效。如果为 'on',则当目标函数或约束返回的值是 complexInfNaN 时,会显示错误。默认值 'off' 不显示错误。

MaxFunctionEvaluations

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

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

MaxIterations

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

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

MaxSQPIter

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

OptimalityTolerance

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

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

OutputFcn

指定优化函数在每次迭代中调用的一个或多个用户定义的函数。传递函数句柄或函数句柄的元胞数组。默认值是“无”([])。请参阅Output Function and Plot Function Syntax

PlotFcn

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

  • 'optimplotx' 绘制当前点。

  • 'optimplotfunccount' 绘制函数计数。

  • 'optimplotfval' 绘制函数值。

  • 'optimplotfvalconstr' 将找到的最佳可行目标函数值绘制为线图。该图将不可行点显示为红色,可行点显示为蓝色,使用的可行性容差为 1e-6

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

  • 'optimplotstepsize' 绘制步长大小。

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

自定义绘图函数使用与输出函数相同的语法。请参阅Output Functions for Optimization Toolbox™Output Function and Plot Function Syntax

对于 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 缩放有限差分来进行梯度估计。

注释

优化例程 fseminf 可能会在计算过程中更改在 seminfcon 中设置的建议采样间隔 S,因为使用非建议间隔值可能会提高效率或稳健性。此外,在优化期间,还允许更改用于计算 wi 的有限区域 Ki(x,wi),前提是更改不会导致 Ki(x,wi) 中的局部最小值发生显著变化。

示例

全部折叠

此示例对以下函数进行最小化

(x-1)2

需满足以下约束

0x2

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

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

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

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

maxt g(x,t)=x-1/2

因此

x  1/2 时,maxt g(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.
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

局限性

要最小化的函数、约束和半无限约束必须为 xw 的连续函数。fseminf 可能只提供局部解。

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

算法

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

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

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

在 R2006a 之前推出