Main Content

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

fminunc

求无约束多变量函数的最小值

说明

非线性规划求解器。

求以下问题的最小值:

minxf(x)

其中,f(x) 是返回标量的函数。

x 是向量或矩阵;请参阅矩阵参数

示例

x = fminunc(fun,x0) 在点 x0 处开始并尝试求 fun 中描述的函数的局部最小值 x。点 x0 可以是标量、向量或矩阵。

注意

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

fminunc 适用于无约束非线性问题。如果您的问题有约束,通常使用 fmincon。请参阅优化决策表

示例

x = fminunc(fun,x0,options) 使用 options 中指定的优化选项最小化 fun。使用 optimoptions 可设置这些选项。

示例

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

示例

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

示例

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

[x,fval,exitflag,output,grad,hessian] = fminunc(___) 还返回:

  • grad - fun 在解 x 处的梯度。

  • hessian - fun 在解 x 处的 Hessian 矩阵。请参阅 fminunc Hessian 矩阵

示例

全部折叠

最小化函数:f(x)=3x12+2x1x2+x22-4x1+5x2

为此,编写用于计算目标的匿名函数 fun

fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);

调用 fminunc 以在 [1,1] 附近处求 fun 的最小值。

x0 = [1,1];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    2.2500   -4.7500

fval = -16.3750

当您提供导数时,fminunc 可以执行得更快、也更可靠。

编写返回梯度和函数值的目标函数。使用包括梯度和 Hessian 矩阵 中所述的条件化形式。目标函数是 Rosenbrock 函数,

f(x)=100(x2-x12)2+(1-x1)2,

它有梯度

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)]

具有梯度的目标函数的代码出现在此示例的末尾

创建使用目标函数的梯度的选项。此外,将算法设置为 'trust-region'

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

将初始点设置为 [-1,2]。然后调用 fminunc

x0 = [-1,2];
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

以下代码创建 rosenbrockwithgrad 函数,该函数包含梯度作为第二个输出。

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

使用问题结构体而不是单独的参数来求解与提供梯度中相同的问题。

编写返回梯度和函数值的目标函数。使用包括梯度和 Hessian 矩阵 中所述的条件化形式。目标函数是 Rosenbrock 函数,

f(x)=100(x2-x12)2+(1-x1)2

它有梯度

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)]

具有梯度的目标函数的代码出现在此示例的末尾

创建使用目标函数的梯度的选项。此外,将算法设置为 'trust-region'

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

创建包括初始点 x0 = [-1,2] 的问题结构体。有关此结构体中的必填字段,请参阅problem

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';

求解。

x = fminunc(problem)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

以下代码创建 rosenbrockwithgrad 函数,该函数包含梯度作为第二个输出。

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

求非线性函数最小值的位置和该最小值处的函数值。目标函数是

f(x)=x(1)e-x22+x22/20

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2] 开始查找最小值的位置和对应的目标函数值。

x0 = [1,2];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052

选择 fminunc 选项和输出来检查求解过程。

设置选项以获取迭代输出并使用 'quasi-newton' 算法。

options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');

目标函数是

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2] 处开始最小化,并获取能够有助您检查求解质量和过程的输出。

x0 = [1,2];
[x,fval,exitflag,output] = fminunc(fun,x0,options)
                                                        First-order 
 Iteration  Func-count       f(x)        Step-size       optimality
     0           3         0.256738                         0.173
     1           6         0.222149              1          0.131  
     2           9          0.15717              1          0.158  
     3          18        -0.227902       0.438133          0.386  
     4          21        -0.299271              1           0.46  
     5          30        -0.404028       0.102071         0.0458  
     6          33        -0.404868              1         0.0296  
     7          36        -0.405236              1        0.00119  
     8          39        -0.405237              1       0.000252  
     9          42        -0.405237              1       7.97e-07  

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = -0.4052
exitflag = 1
output = struct with fields:
       iterations: 9
        funcCount: 42
         stepsize: 2.9343e-04
     lssteplength: 1
    firstorderopt: 7.9721e-07
        algorithm: 'quasi-newton'
          message: '...'

  • 退出标志 1 表明该解是局部最优解。

  • output 结构体显示迭代次数、函数计算次数和其他信息。

  • 迭代输出还会提供迭代次数和函数计算次数。

输入参数

全部折叠

要最小化的函数,指定为函数句柄或函数名称。fun 接受向量或数组 x,并返回实数标量 f,即在 x 处计算的目标函数值。

fun 指定为文件的函数句柄:

x = fminunc(@myfun,x0)

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

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

您还可以为匿名函数指定 fun 作为函数句柄:

x = fminunc(@(x)norm(x)^2,x0);

如果您可以计算 fun 的梯度 SpecifyObjectiveGradient 选项设置为 true,设置如下

options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun 必须在第二个输出参数中返回梯度向量 g(x)

如果您还可以计算 Hessian 矩阵,通过 options = optimoptions('fminunc','HessianFcn','objective')HessianFcn 选项设置为 'objective'且将 Algorithm 选项设置为 'trust-region',则 fun 必须在第三个输出参数中返回 Hessian 值 H(x),即一个对称矩阵。fun 可以给出稀疏 Hessian 矩阵。有关详细信息,请参阅适用于 fminunc 信赖域或 fmincon 信赖域反射算法的 Hessian 矩阵

trust-region 算法允许您提供 Hessian 矩阵乘法函数。此函数给出 Hessian 乘以向量的乘积结果,而不直接计算 Hessian 矩阵。这可以节省内存。请参阅 Hessian 矩阵乘法函数

示例: fun = @(x)sin(x(1))*cos(x(2))

数据类型: char | function_handle | string

初始点,指定为实数向量或实数数组。求解器使用 x0 中的元素数量和 x0 的大小来确定 fun 接受的变量数量和大小。

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

数据类型: double

优化选项,指定为 optimoptions 的输出或 optimset 等返回的结构体。

一些选项适用于所有算法,其他选项则与特定算法相关。有关详细信息,请参阅优化选项参考

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

所有算法

Algorithm

选择 fminunc 算法。选项是 'quasi-newton'(默认值)或 'trust-region'

'trust-region' 算法要求您提供梯度(请参阅 fun 的说明),否则 fminunc 将使用 'quasi-newton' 算法。有关选择算法的信息,请参阅选择算法

CheckGradients

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

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

Diagnostics

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

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)

仅当 CheckGradients 设置为 true 时,信赖域算法才使用 FiniteDifferenceStepSize

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

FiniteDifferenceType

用于估计梯度的有限差分是 'forward'(默认值)或 'central'(中心化)。'central' 需要两倍的函数计算次数,但应更准确。仅当 CheckGradients 设置为 true 时,信赖域算法才使用 FiniteDifferenceType

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

FunValCheck

检查目标函数值是否有效。默认设置 'off' 不执行检查。当目标函数返回的值是 complexInfNaN 时,'on' 设置显示错误。

MaxFunctionEvaluations

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

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

MaxIterations

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

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

OptimalityTolerance

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

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

OutputFcn

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

PlotFcn

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

  • 'optimplotx' 绘制当前点。

  • 'optimplotfunccount' 绘制函数计数。

  • 'optimplotfval' 绘制函数值。

  • 'optimplotstepsize' 绘制步长大小。

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

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

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

SpecifyObjectiveGradient

用户定义的目标函数梯度。请参阅 fun 的说明,了解如何在 fun 中定义梯度。设置为 true,以使 fminunc 采用用户定义的目标函数梯度。默认值 false 会导致 fminunc 使用有限差分来估计梯度。您必须提供梯度,并将 SpecifyObjectiveGradient 设置为 true 才能使用信赖域算法。拟牛顿算法不需要此选项。

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

StepTolerance

关于正标量 x 的终止容差。默认值为 1e-6。请参阅容差和停止条件

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

TypicalX

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

trust-region 算法仅对 CheckGradients 选项使用 TypicalX

trust-region 算法
FunctionTolerance

关于函数值的终止容差,为正标量。默认值为 1e-6。请参阅容差和停止条件

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

HessianFcn

如果设置为 [](默认值),fminunc 使用有限差分逼近 Hessian 矩阵。

如果设置为 'objective'fminunc 对目标函数使用用户定义的 Hessian 矩阵。Hessian 矩阵是目标函数的第三个输出(请参阅 fun)。

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

HessianMultiplyFcn

Hessian 矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数计算 Hessian 矩阵乘积 H*Y,而并不实际构造 H。函数的形式是

W = hmfun(Hinfo,Y)

其中 Hinfo 包含用于计算 H*Y 的矩阵。

上述第一个参数与目标函数 fun 返回的第三个参数相同,例如

[f,g,Hinfo] = fun(x)

Y 是矩阵,其行数与问题中的维数相同。矩阵 W = H*Y(其中 H 未显式构造)。fminunc 使用 Hinfo 计算预条件子。要了解如何为 hmfun 所需的额外参数提供值的信息,请参阅传递额外参数

注意

要使用 HessianMultiplyFcn 选项,HessianFcn 必须设置为 []

有关示例,请参阅Minimization with Dense Structured Hessian, Linear Equalities

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

HessPattern

用于有限差分的 Hessian 矩阵稀疏模式。如果存在 ∂2fun/∂x(i)x(j) ≠ 0,则设置 HessPattern(i,j) = 1。否则,设置 HessPattern(i,j) = 0

如果不方便在 fun 中计算 Hessian 矩阵 H,但您可以确定(例如,通过检查)fun 的梯度的第 i 个分量何时依赖 x(j),请使用 HessPattern。如果您提供 H稀疏结构作为 HessPattern 的值,fminunc 可以通过稀疏有限差分(梯度)逼近 H。这相当于提供非零元的位置。

当结构未知时,不要设置 HessPattern。默认行为是将 HessPattern 视为由 1 组成的稠密矩阵。然后,fminunc 在每次迭代中计算满有限差分逼近。对于大型问题,这种计算可能成本高昂,因此通常最好确定稀疏结构。

MaxPCGIter

预条件共轭梯度 (PCG) 迭代的最大次数,正标量。默认值为 max(1,floor(numberOfVariables/2))。有关详细信息,请参阅信赖域算法

PrecondBandWidth

PCG 的预条件子上带宽,非负整数。默认情况下,fminunc 使用对角预条件处理(上带宽为 0)。对于某些问题,增加带宽会减少 PCG 迭代次数。将 PrecondBandWidth 设置为 Inf 会使用直接分解 (Cholesky),而不是共轭梯度 (CG)。直接分解的计算成本较 CG 高,但所得的求解步质量更好。

SubproblemAlgorithm

确定迭代步的计算方式。与 'factorization' 相比,默认值 'cg' 采用的步执行速度更快,但不够准确。请参阅fminunc trust-region 算法

TolPCG

PCG 迭代的终止容差,正标量。默认值为 0.1

quasi-newton 算法
HessUpdate

用于在拟牛顿算法中选择搜索方向的方法。选项包括:

ObjectiveLimit

容差(停止条件),标量。如果迭代中的目标函数值小于或等于 ObjectiveLimit,迭代将停止,因为问题可能是无界的。默认值为 -1e20

UseParallel

此选项为 true 时,fminunc 以并行方式估计梯度。设置为默认值 false 将禁用此功能。trust-region 要求目标中有梯度,因此 UseParallel 不适用。请参阅并行计算

示例: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)

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

字段名称条目

objective

目标函数

x0

x 的初始点

solver

'fminunc'

options

optimoptions 创建的选项

数据类型: struct

输出参数

全部折叠

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

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

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

1

梯度的模小于 OptimalityTolerance 容差。

2

x 的变化小于 StepTolerance 容差。

3

目标函数值的变化小于 FunctionTolerance 容差。

5

目标函数的预测下降小于 FunctionTolerance 容差。

0

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

-1

算法已被输出函数终止。

-3

当前迭代的目标函数低于 ObjectiveLimit

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

iterations

执行的迭代次数

funcCount

函数计算次数

firstorderopt

一阶最优性的度量

algorithm

使用的优化算法

cgiterations

PCG 迭代总数(仅适用于 'trust-region' 算法)

lssteplength

相对于搜索方向的线搜索步的步长(仅适用于 'quasi-newton' 算法)

stepsize

x 中的最终位移

message

退出消息

解处的梯度,以实数向量形式返回。grad 给出 funx(:) 点处的梯度。

逼近 Hessian 矩阵,以实矩阵形式返回。有关 hessian 的含义,请参阅Hessian 矩阵输出

算法

全部折叠

拟牛顿算法

quasi-newton 算法使用具有三次线搜索过程的 BFGS 拟牛顿法。这种拟牛顿法使用 BFGS([1][5][8][9])公式来更新 Hessian 矩阵的逼近。您可以通过将 HessUpdate 选项设置为 'dfp'(并将 Algorithm 选项设置为 'quasi-newton')来选择逼近逆 Hessian 矩阵的 DFP([4][6][7])公式。您可以通过将 HessUpdate 设置为 'steepdesc'(并将 Algorithm 设置为 'quasi-newton')来选择最陡下降法,尽管此设置通常效率不高。请参阅fminunc quasi-newton 算法

信赖域算法

trust-region 算法要求您在 fun 中提供梯度,并使用 optimoptionsSpecifyObjectiveGradient 设置为 true。此算法是一种子空间信赖域方法,基于 [2][3] 中所述的内部反射牛顿法。每次迭代都涉及使用预条件共轭梯度法 (PCG) 来近似求解大型线性方程组。请参阅fminunc trust-region 算法非线性最小化信赖域方法预条件共轭梯度法

替代功能

App

优化实时编辑器任务为 fminunc 提供可视化界面。

参考

[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.

[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.

[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.

[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.

[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.

[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.

[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.

扩展功能

在 R2006a 之前推出