# fminbnd

## 语法

``x = fminbnd(fun,x1,x2)``
``x = fminbnd(fun,x1,x2,options)``
``x = fminbnd(problem)``
``[x,fval] = fminbnd(___)``
``[x,fval,exitflag] = fminbnd(___)``
``[x,fval,exitflag,output] = fminbnd(___)``

## 说明

`fminbnd` 是一个一维最小值，用于求由以下条件指定的问题的最小值：

x、x1 和 x2 是有限标量，f(x) 是返回标量的函数。

``x = fminbnd(fun,x1,x2)` 返回一个值 `x`，该值是 `fun` 中描述的标量值函数在区间 `x1 < x < x2` 中的局部最小值。`

``x = fminbnd(fun,x1,x2,options)` 使用 `options` 所指定的优化选项执行最小化。使用 `optimset` 可设置这些选项。`
``x = fminbnd(problem)` 求 `problem` 的最小值，它是 `problem` 中所述的一个结构体。`

`对于任何输入参量，`[x,fval] = fminbnd(___)` 返回目标函数在 `fun` 的解 `x` 处计算出的值。`
``[x,fval,exitflag] = fminbnd(___)` 还返回描述退出条件的值 `exitflag`。`

``[x,fval,exitflag,output] = fminbnd(___)` 还返回一个包含有关优化的信息的结构体 `output`。`

## 示例

$\mathrm{sin}\left(x\right)$ 函数在 $0 范围内的最小值的点。

```fun = @sin; x1 = 0; x2 = 2*pi; x = fminbnd(fun,x1,x2)```
```x = 4.7124 ```

`3*pi/2`
```ans = 4.7124 ```

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

```x = fminbnd(@scalarobjective,1,3) ```
```x = 2.0061 ```

```a = 9/7; fun = @(x)sin(x-a); x = fminbnd(fun,1,2*pi)```
```x = 5.9981 ```

`3*pi/2 + 9/7`
```ans = 5.9981 ```

```fun = @sin; x1 = 0; x2 = 2*pi; options = optimset('Display','iter'); x = fminbnd(fun,x1,x2,options)```
``` Func-count x f(x) Procedure 1 2.39996 0.67549 initial 2 3.88322 -0.67549 golden 3 4.79993 -0.996171 golden 4 5.08984 -0.929607 parabolic 5 4.70582 -0.999978 parabolic 6 4.7118 -1 parabolic 7 4.71239 -1 parabolic 8 4.71236 -1 parabolic 9 4.71242 -1 parabolic Optimization terminated: the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 ```
```x = 4.7124 ```

$\mathrm{sin}\left(x\right)$ 的最小值的位置以及在 $0 区间内的最小值。

```fun = @sin; [x,fval] = fminbnd(fun,1,2*pi)```
```x = 4.7124 ```
```fval = -1.0000 ```

```fun = @sin; x1 = 0; x2 = 2*pi; options = optimset('PlotFcns',@optimplotfval); [x,fval,exitflag,output] = fminbnd(fun,x1,x2,options)```

```x = 4.7124 ```
```fval = -1.0000 ```
```exitflag = 1 ```
```output = struct with fields: iterations: 8 funcCount: 9 algorithm: 'golden section search, parabolic interpolation' message: 'Optimization terminated:...' ```

## 输入参数

`fun` 指定为文件的函数句柄：

`x = fminbnd(@myfun,x1,x2)`

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

`x = fminbnd(@(x)norm(x)^2,x1,x2);`

 `Display` 显示级别（请参阅迭代输出）： `'notify'`（默认值）仅在函数未收敛时显示输出。`'off'` 或 `'none'` 不显示输出。`'iter'` 在每次迭代时显示输出。`'final'` 仅显示最终输出。 `FunValCheck` 检查目标函数值是否有效。当目标函数返回的值为 `complex` 或 `NaN` 时，默认 `'off'` 允许 `fminbnd` 继续。当目标函数返回的值是 `complex` 或 `NaN` 时，`'on'` 设置会引发错误。 `MaxFunEvals` 允许的函数计算的最大次数，为正整数。默认值为 `500`。请参阅容差和停止条件和迭代和函数计算次数。 `MaxIter` 允许的迭代最大次数，为正整数。默认值为 `500`。请参阅容差和停止条件和迭代和函数计算次数。 `OutputFcn` 以函数句柄或函数句柄的元胞数组的形式来指定优化函数在每次迭代时调用的一个或多个用户定义函数。默认值是“无”(`[]`)。请参阅Output Function and Plot Function Syntax。 `PlotFcns` 绘制算法执行过程中的各个进度测量值。从预定义绘图中选择，或者自行编写。传递函数名称、函数句柄或者函数名称或句柄的元胞数组。默认值是“无”(`[]`)： `@optimplotx` 绘制当前点`@optimplotfunccount` 绘制函数计数`@optimplotfval` 绘制函数值 自定义绘图函数使用与输出函数相同的语法。请参阅Optimization Toolbox 的输出函数和Output Function and Plot Function Syntax。 `TolX` 关于正标量 `x` 的终止容差。默认值为 `1e-4`。请参阅容差和停止条件。

`objective`

`x1`

`x2`

`solver`

`'fminbnd'`

`options`

options 结构体，例如 `optimset` 返回的结构体

## 输出参量

`fminbnd` 停止的原因，以整数形式返回。

 `1` 函数收敛于解 `x`。 `0` 迭代次数超出 `options.MaxIter` 或函数计算次数超过 `options.MaxFunEvals`。 `-1` 由输出函数或绘图函数停止。 `-2` 边界不一致，这意味着 `x1 > x2`。

 `iterations` 执行的迭代次数 `funcCount` 函数计算次数 `algorithm` `'golden section search, parabolic interpolation'` `message` 退出消息

## 局限性

• 要计算最小值的函数必须是连续的。

• `fminbnd` 只能给出局部解。

• 当解在区间的边界上时，`fminbnd` 可能表现出慢收敛。在这种情况下，`fmincon` 通常会更快地给出更准确的解。

## 算法

`fminbnd` 是一个函数文件。算法基于黄金分割搜索和抛物线插值方法。除非左端点 x1 非常靠近右端点 x2，否则 `fminbnd` 从不计算 `fun` 在端点处的值，因此只需要为 x 在区间 x1 < x < x2 中定义 `fun`

## 参考

[1] Forsythe, G. E., M. A. Malcolm, and C. B. Moler. Computer Methods for Mathematical Computations. Englewood Cliffs, NJ: Prentice Hall, 1976.

[2] Brent, Richard. P. Algorithms for Minimization without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973.