Main Content

fminsearch

使用无导数法计算无约束多变量函数的最小值

说明

非线性规划求解器。搜索由以下公式指定的问题的最小值:

minxf(x)

f(x) 是返回标量的函数,x 是向量或矩阵;请参阅矩阵参数

示例

x = fminsearch(fun,x0) 在点 x0 处开始并尝试求 fun 中描述的函数的局部最小值 x

示例

x = fminsearch(fun,x0,options) 使用 options 所指定的优化选项执行最小化。使用 optimset 可设置这些选项。

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

示例

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

[x,fval,exitflag] = fminsearch(___) 还返回描述退出条件的值 exitflag

示例

[x,fval,exitflag,output] = fminsearch(___) 还会返回结构体 output 以及有关优化过程的信息。

示例

全部折叠

计算 Rosenbrock 函数的最小值,对于许多算法来说,这是极难的优化问题:

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

该函数的最小值在 x = [1,1] 处,最小值为 0

将起始点设置为 x0 = [-1.2,1] 并使用 fminsearch 计算 Rosenbrock 函数的最小值。

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
x = 1×2

    1.0000    1.0000

设置选项,以监视 fminsearch 尝试定位最小值的过程。

设置选项,以在每次迭代时绘制目标函数图。

options = optimset('PlotFcns',@optimplotfval);

将目标函数设置为 Rosenbrock 函数,

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

该函数的最小值在 x = [1,1] 处,最小值为 0

将起始点设置为 x0 = [-1.2,1] 并使用 fminsearch 计算 Rosenbrock 函数的最小值。

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

Figure Optimization Plot Function contains an axes object. The axes object with title Current Function Value: 8.17766e-10, xlabel Iteration, ylabel Function value contains an object of type scatter.

x = 1×2

    1.0000    1.0000

计算目标函数的最小值,该函数的值通过执行文件得出。函数文件必须接受实数向量 x,并返回目标函数值实数标量。

复制以下代码,并将其以名为 objectivefcn1.m 的文件包含在您的 MATLAB® 路径中。

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

x0 = [0.25,-0.25] 处开始并搜索 objectivefcn 的最小值。

x0 = [0.25,-0.25];
x = fminsearch(@objectivefcn1,x0)
x =

   -0.1696   -0.5086

有时您的目标函数具有额外参数。这些参数不是要优化的变量,它们是优化过程中的固定值。例如,假设您在以下 Rosenbrock 类型函数中有一个参数 a

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

此函数在 x1=ax2=a2 处具有最小值 0。假如 a=3,您可以通过创建匿名函数将该参数包含在您的目标函数中。

创建目标函数并将其额外形参作为额外实参。

f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;

将参数放在您的 MATLAB® 工作区中。

a = 3;

单独创建包含参数的工作区值的 x 的匿名函数。

fun = @(x)f(x,a);

x0 = [-1,1.9] 处开始解算该问题。

x0 = [-1,1.9];
x = fminsearch(fun,x0)
x = 1×2

    3.0000    9.0000

有关在您的目标函数中使用额外参数的详细信息,请参阅参数化函数

使用 fminsearch 求目标函数最小值的位置和值。

为三变量问题编写匿名目标函数。

x0 = [1,2,3];
fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));

x0 开始求 fun 最小值的位置,并求出最小值的值。

[x,fval] = fminsearch(fun,x0)
x = 1×3

    1.5359    2.5645    3.5932

fval = -5.9565e+04

在优化进行期间和优化结束后检查优化结果。

将选项设置为提供迭代输出,从而在求解器运行时提供有关优化的信息。此外,将绘图函数设置为在求解器运行时显示目标函数值。

options = optimset('Display','iter','PlotFcns',@optimplotfval);

设置目标函数和起始点。

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

objectivefcn1 的代码作为文件包含在您的 MATLAB® 路径中。

x0 = [0.25,-0.25];
fun = @objectivefcn1;

获取所有求解器输出。在求解器运行完毕后,使用这些输出检查结果。

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count         f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 


x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

exitflag 的值为 1,这意味着 fminsearch 很可能收敛于局部最小值。

output 结构体显示迭代数。迭代输出中和绘图中也显示此信息。output 结构体还显示函数求值的次数,迭代输出方式会显示该次数,但所选的绘图函数不显示该次数。

输入参数

全部折叠

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

fminsearchx0 参数的形状将 x 传递给目标函数。例如,如果 x0 是 5×3 数组,则 fminsearchx 以 5×3 数组的形式传递给 fun

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

x = fminsearch(@myfun,x0)

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

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

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

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

示例: fun = @(x)-x*exp(-3*x)

数据类型: char | function_handle | string

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

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

数据类型: double

优化选项,指定为结构体,例如 optimset 返回的结构体。您可以使用 optimset 设置或更改 options 结构体中这些字段的值。有关详细信息,请参阅优化选项参考

Display

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

  • 'notify'(默认值)仅在函数未收敛时显示输出。

  • 'final' 仅显示最终输出。

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

  • 'iter' 在每次迭代时显示输出。

FunValCheck

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

MaxFunEvals

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

MaxIter

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

OutputFcn

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

PlotFcns

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

  • @optimplotx 绘制当前点。

  • @optimplotfunccount 绘制函数计数。

  • @optimplotfval 绘制函数值。

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

TolFun

关于函数值的终止容差,为正标量。默认值为 1e-4。请参阅容差和停止条件。与其他求解器不同,fminsearch同时满足 TolFunTolX 时停止运行。

TolX

关于正标量 x 的终止容差。默认值为 1e-4。请参阅容差和停止条件。与其他求解器不同,fminsearch同时满足 TolFunTolX 时停止运行。

示例: options = optimset('Display','iter')

数据类型: struct

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

字段名称条目

objective

目标函数

x0

x 的初始点

solver

'fminsearch'

options

options 结构体,例如 optimset 返回的结构体

数据类型: struct

输出参数

全部折叠

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

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

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

1

函数收敛于解 x

0

迭代次数超出 options.MaxIter 或函数计算次数超过 options.MaxFunEvals

-1

算法由输出函数终止。

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

iterations

迭代次数

funcCount

函数计算次数

algorithm

'Nelder-Mead simplex direct search'

message

退出消息

提示

  • fminsearch 仅对实数求最小值,即 x 只能由实数组成,并且 f(x) 必须只返回实数。当 x 具有复数值时,将 x 拆分为实部和虚部。

  • 使用 fminsearch 求解不可微分的问题或者具有不连续性的问题,尤其是在解附近没有出现不连续性的情况下。

  • fminsearch 通常不如 fminunc 效率高,尤其是对于维度大于 2 的问题。但是,当问题不连续时,fminsearch 可能比 fminunc 更稳健。

  • fminsearch 不是求解平方和问题的首选求解器,也就是说,不是求解以下形式问题的首选求解器

    minxf(x)22=minx(f1(x)2+f2(x)2+...+fn(x)2)

    对于以上形式的问题,请使用 lsqnonlin 函数,该函数针对以上形式的问题进行了优化。

算法

fminsearch 使用 Lagarias 等的单纯形搜索法。[1]。这是一种直接搜索方法,不像在 fminunc 中那样使用数值或解析梯度。fminsearch 算法 中详细地介绍了该算法。该算法不能保证收敛于局部最小值。

替代功能

App

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

参考

[1] Lagarias, J. C., J. A. Reeds, M. H. Wright, and P. E. Wright. “Convergence Properties of the Nelder-Mead Simplex Method in Low Dimensions.” SIAM Journal of Optimization. Vol. 9, Number 1, 1998, pp. 112–147.

扩展功能

版本历史记录

在 R2006a 之前推出