fminsearch
使用无导数法计算无约束的多变量函数的最小值
非线性规划求解器。搜索由以下公式指定的问题的最小值:
minxf(x)
f(x) 是返回标量的函数,x 是向量或矩阵。
语法
x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(problem)
[x,fval] = fminsearch(___)
[x,fval,exitflag] = fminsearch(___)
[x,fval,exitflag,output] = fminsearch(___)
说明
示例
计算 Rosenbrock 函数的最小值
计算 Rosenbrock 函数的最小值,对于许多算法来说,这是极难的优化问题:
该函数的最小值在 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.0000 1.0000
监视优化过程
设置选项,以监视 fminsearch
尝试定位最小值的过程。
设置选项,以在每次迭代时绘制目标函数图。
options = optimset('PlotFcns',@optimplotfval);
将目标函数设置为 Rosenbrock 函数,
该函数的最小值在 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)
x = 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
:
此函数在 、
处具有最小值 0。假如
,您可以通过创建匿名函数将该参数包含在您的目标函数中。
创建目标函数并将其额外形参作为额外实参。
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 = 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.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 min 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
- 要计算最小值的函数
函数句柄 | 函数名称
要计算最小值的函数,指定为函数句柄或函数名称。fun
是一个接受向量或数组 x
的函数,并返回实数标量 f
(在 x
处计算的目标函数值)。
将 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
- 初始点
实数向量 | 实数数组
options
- 优化选项
结构体,例如 optimset
返回的结构体
优化选项,指定为结构体,例如 optimset
返回的结构体。您可以使用 optimset
设置或更改 options 结构体中这些字段的值。有关详细信息,请参阅设置选项。
| 显示级别(请参阅迭代显示):
|
FunValCheck | 检查目标函数值是否有效。当目标函数返回的值是 |
| 允许的函数求值的最大次数,为正整数。默认值为 |
| 允许的迭代最大次数,为正整数。默认值为 |
OutputFcn | 以函数句柄或函数句柄的元胞数组的形式来指定优化函数在每次迭代时调用的一个或多个用户定义函数。默认值是“无”( |
| 绘制算法执行过程中的各个进度测量值。从预定义绘图中选择,或者自行编写。传递函数句柄或函数句柄的元胞数组。默认值是“无”(
有关编写自定义绘图函数的信息,请参阅绘图函数。 |
| 关于函数值的终止容差,为正整数。默认值为 |
| 关于正标量 |
示例: options = optimset('Display','iter')
数据类型: struct
problem
- 问题结构体
结构体
问题结构体,指定为含有以下字段的结构体。
字段名称 | 条目 |
---|---|
| 目标函数 |
| x 的初始点 |
| 'fminsearch' |
| Options 结构体,例如 optimset 返回的结构体 |
数据类型: struct
输出参数
fval
- 解处的目标函数值
实数
解处的目标函数值,以实数形式返回。通常,fval
= fun(x)
。
exitflag
- fminsearch
停止的原因
整数
fminsearch
停止的原因,以整数形式返回。
| 函数收敛于解 |
| 迭代次数超出 |
| 算法由输出函数终止。 |
output
- 有关优化过程的信息
结构体
有关优化过程的信息,以包含下列字段的结构体形式返回:
iterations | 迭代次数 |
funcCount | 函数计算次数 |
algorithm |
|
message | 退出消息 |
提示
fminsearch
仅对实数求最小值,即向量或数组 x 只能由实数组成,并且 f(x) 必须只返回实数。当 x 具有复数值时,将 x 拆分为实部和虚部。使用
fminsearch
解决不可微分的问题或者具有不连续性的问题,尤其是在解附近没有出现不连续性的情况下。
算法
fminsearch
使用 Lagarias 等的单纯形搜索方法。[1]这是一种直接搜索方法,不像在 fminunc
中那样使用数值或解析梯度。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.
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
对于 C/C++ 代码生成:
fminsearch
会忽略Display
选项,且不会给出迭代显示或退出消息。要检查解的质量,请检查退出标志。输出结构体不包含
algorithm
或message
字段。fminsearch
忽略OutputFcn
和PlotFcns
选项。