# fzero

## 语法

``x = fzero(fun,x0)``
``x = fzero(fun,x0,options)``
``x = fzero(problem)``
``[x,fval,exitflag,output] = fzero(___)``

## 说明

``x = fzero(fun,x0)` 尝试求出 `fun(x) = 0` 的点 `x`。此解是 `fun(x)` 变号的位置 - `fzero` 无法求函数（例如 `x^2`）的根。`

``x = fzero(fun,x0,options)` 使用 `options` 修改求解过程。`

``x = fzero(problem)` 对 `problem` 指定的求根问题求解。`

``[x,fval,exitflag,output] = fzero(___)` 返回 `fun(x)`（在 `fval` 输出中）、对 `fzero` 停止的原因编码的 `exitflag`，以及包含有关求解过程的信息的输出结构体。`

## 示例

```fun = @sin; % function x0 = 3; % initial point x = fzero(fun,x0)```
```x = 3.1416 ```

```fun = @cos; % function x0 = [1 2]; % initial interval x = fzero(fun,x0)```
```x = 1.5708 ```

```function y = f(x) y = x.^3 - 2*x - 5;```

`f.m` 保存到 MATLAB® 路径中。

```fun = @f; % function x0 = 2; % initial point z = fzero(fun,x0)```
```z = 2.0946```

`roots([1 0 -2 -5])`
``` ans = 2.0946 -1.0473 + 1.1359i -1.0473 - 1.1359i```

```myfun = @(x,c) cos(c*x); % parameterized function c = 2; % parameter fun = @(x) myfun(x,c); % function of x alone x = fzero(fun,0.1)```
```x = 0.7854 ```

```fun = @(x)sin(cosh(x)); x0 = 1;```

`options = optimset('PlotFcns',{@optimplotx,@optimplotfval});`

`x = fzero(fun,x0,options)`

```x = 1.8115 ```

```problem.objective = @(x)sin(cosh(x)); problem.x0 = 1; problem.solver = 'fzero'; % a required part of the structure problem.options = optimset(@fzero); % default options```

`x = fzero(problem)`
```x = 1.8115 ```

```fun = @(x) exp(-exp(-x)) - x; % function x0 = [0 1]; % initial interval options = optimset('Display','iter'); % show iterations [x fval exitflag output] = fzero(fun,x0,options)```
``` Func-count x f(x) Procedure 2 1 -0.307799 initial 3 0.544459 0.0153522 interpolation 4 0.566101 0.00070708 interpolation 5 0.567143 -1.40255e-08 interpolation 6 0.567143 1.50013e-12 interpolation 7 0.567143 0 interpolation Zero found in the interval [0, 1] ```
```x = 0.5671 ```
```fval = 0 ```
```exitflag = 1 ```
```output = struct with fields: intervaliterations: 0 iterations: 5 funcCount: 7 algorithm: 'bisection, interpolation' message: 'Zero found in the interval [0, 1]' ```

## 输入参数

`fzero``fun(x) = 0` 求解。要对方程 `fun(x) = c(x)` 求解，请改为对 `fun2(x) = fun(x) - c(x) = 0` 求解。

• 标量 - `fzero``x0` 开始并尝试找到 `fun(x1)` 具有相反符号 `fun(x0)` 的点 `x1`。随后 `fzero` 迭代收缩 `fun` 变号的区间以得到一个解。

• 二元素向量 - `fzero` 检查 `fun(x0(1))``fun(x0(2))` 的符号是否相反，如果不相反，则返回错误。它随后迭代收缩 `fun` 变号的区间以得到一个解。区间 `x0` 必须是有限的；它不能包含 ±`Inf`

 `Display` 显示级别：`'off'` 不显示输出。`'iter'` 在每次迭代时显示输出。`'final'` 仅显示最终输出。`'notify'`（默认值）仅在函数未收敛时显示输出。 `FunValCheck` 检查目标函数值是否有效。当目标函数返回的值是 `complex`、`Inf` 或 `NaN` 时，`'on'` 显示错误。默认值 `'off'` 不会显示错误。 `OutputFcn` 以函数句柄或函数句柄的元胞数组的形式来指定优化函数在每次迭代时调用的一个或多个用户定义函数。默认值是“无”(`[]`)。请参阅 优化求解器输出函数。 `PlotFcns` 绘制算法执行过程中的各个进度测量值。从预定义绘图中选择，或者自行编写。传递函数名称、函数句柄或者函数名称或句柄的元胞数组。默认值是“无”(`[]`)： `@optimplotx` 绘制当前点。`@optimplotfval` 绘制函数值。 有关编写自定义绘图函数的信息，请参阅优化求解器绘制函数。 `TolX` 关于正标量 `x` 的终止容差。默认值为 `eps` 2.2204e–16。

 `objective` 目标函数 `x0` `x` 的初始点，为实数标量或二元素向量 `solver` `'fzero'` `options` 通常使用 `optimset` 创建的 options 结构体

## 输出参量

`x` 处的函数值，以标量形式返回。

 `1` 函数收敛于解 `x`。 `-1` 算法由输出函数或绘图函数终止。 `-3` 在搜索含有变号的区间时遇到 `NaN` 或 `Inf` 函数值。 `-4` 在搜索含有变号的区间时遇到复数函数值。 `-5` 算法可能收敛于一个奇异点。 `-6` `fzero` 未检测到变号。

 `intervaliterations` 求包含根的区间所采取的迭代次数 `iterations` 求零点迭代次数 `funcCount` 函数计算次数 `algorithm` `'bisection, interpolation'` `message` 退出消息

## 算法

`fzero` 命令是一个函数文件。此算法由 T. Dekker 创建，它结合使用了对分法、正割法和逆二次插值方法。[1] 中给出了 Algol 60 版及一些改进。[2] 中给出了 `fzero` 所基于的 Fortran 版本。

## 参考

[1] Brent, R., Algorithms for Minimization Without Derivatives, Prentice-Hall, 1973.

[2] Forsythe, G. E., M. A. Malcolm, and C. B. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, 1976.