# Roots of Scalar Functions

**Solving a Nonlinear Equation in One Variable**

The `fzero`

function attempts to find a root of one equation with one variable. You can call this function with either a one-element starting point or a two-element vector that designates a starting interval. If you give `fzero`

a starting point `x0`

, `fzero`

first searches for an interval around this point where the function changes sign. If the interval is found, `fzero`

returns a value near where the function changes sign. If no such interval is found, `fzero`

returns `NaN`

. Alternatively, if you know two points where the function value differs in sign, you can specify this starting interval using a two-element vector; `fzero`

is guaranteed to narrow down the interval and return a value near a sign change.

The following sections contain two examples that illustrate how to find a zero of a function using a starting interval and a starting point. The examples use the function `humps.m`

, which is provided with MATLAB®. The following figure shows the graph of `humps`

.

x = -1:.01:2; y = humps(x); plot(x,y) xlabel('x'); ylabel('humps(x)') grid on

**Setting Options for **`fzero`

`fzero`

You can control several aspects of the `fzero`

function by setting options. You set options using `optimset`

. Options include:

Choosing the amount of display

`fzero`

generates — see Set Optimization Options, Using a Starting Interval, and Using a Starting Point.Choosing various tolerances that control how

`fzero`

determines it is at a root — see Set Optimization Options.Choosing a plot function for observing the progress of

`fzero`

towards a root — see Optimization Solver Plot Functions.Using a custom-programmed output function for observing the progress of

`fzero`

towards a root — see Optimization Solver Output Functions.

### Using a Starting Interval

The graph of `humps`

indicates that the function is negative at `x = -1`

and positive at `x = 1`

. You can confirm this by calculating `humps`

at these two points.

humps(1)

ans = 16

humps(-1)

ans = -5.1378

Consequently, you can use `[-1 1]`

as a starting interval for `fzero`

.

The iterative algorithm for `fzero`

finds smaller and smaller subintervals of `[-1 1]`

. For each subinterval, the sign of `humps`

differs at the two endpoints. As the endpoints of the subintervals get closer and closer, they converge to zero for `humps`

.

To show the progress of `fzero`

at each iteration, set the `Display`

option to `iter`

using the `optimset`

function.

options = optimset('Display','iter');

Then call `fzero`

as follows:

a = fzero(@humps,[-1 1],options)

Func-count x f(x) Procedure 2 -1 -5.13779 initial 3 -0.513876 -4.02235 interpolation 4 -0.513876 -4.02235 bisection 5 -0.473635 -3.83767 interpolation 6 -0.115287 0.414441 bisection 7 -0.115287 0.414441 interpolation 8 -0.132562 -0.0226907 interpolation 9 -0.131666 -0.0011492 interpolation 10 -0.131618 1.88371e-07 interpolation 11 -0.131618 -2.7935e-11 interpolation 12 -0.131618 8.88178e-16 interpolation 13 -0.131618 8.88178e-16 interpolation Zero found in the interval [-1, 1]

a = -0.1316

Each value `x`

represents the best endpoint so far. The `Procedure`

column tells you whether each step of the algorithm uses bisection or interpolation.

You can verify that the function value at `a`

is close to zero by entering

humps(a)

ans = 8.8818e-16

**Using a Starting Point**

Suppose you do not know two points at which the function values of `humps`

differ in sign. In that case, you can choose a scalar `x0`

as the starting point for `fzero`

. `fzero`

first searches for an interval around this point on which the function changes sign. If `fzero`

finds such an interval, it proceeds with the algorithm described in the previous section. If no such interval is found, `fzero`

returns `NaN`

.

For example, set the starting point to `-0.2`

, the `Display`

option to `Iter`

, and call `fzero`

:

options = optimset('Display','iter'); a = fzero(@humps,-0.2,options)

Search for an interval around -0.2 containing a sign change: Func-count a f(a) b f(b) Procedure 1 -0.2 -1.35385 -0.2 -1.35385 initial interval 3 -0.194343 -1.26077 -0.205657 -1.44411 search 5 -0.192 -1.22137 -0.208 -1.4807 search 7 -0.188686 -1.16477 -0.211314 -1.53167 search 9 -0.184 -1.08293 -0.216 -1.60224 search 11 -0.177373 -0.963455 -0.222627 -1.69911 search 13 -0.168 -0.786636 -0.232 -1.83055 search 15 -0.154745 -0.51962 -0.245255 -2.00602 search 17 -0.136 -0.104165 -0.264 -2.23521 search 18 -0.10949 0.572246 -0.264 -2.23521 search Search for a zero in the interval [-0.10949, -0.264]: Func-count x f(x) Procedure 18 -0.10949 0.572246 initial 19 -0.140984 -0.219277 interpolation 20 -0.132259 -0.0154224 interpolation 21 -0.131617 3.40729e-05 interpolation 22 -0.131618 -6.79505e-08 interpolation 23 -0.131618 -2.98428e-13 interpolation 24 -0.131618 8.88178e-16 interpolation 25 -0.131618 8.88178e-16 interpolation Zero found in the interval [-0.10949, -0.264]

a = -0.1316

The endpoints of the current subinterval at each iteration are listed under the headings `a`

and `b`

, while the corresponding values of `humps`

at the endpoints are listed under `f(a)`

and `f(b)`

, respectively.

**Note: **The endpoints `a`

and `b`

are not listed in any specific order: `a`

can be greater than `b`

or less than `b`

.

For the first nine steps, the sign of `humps`

is negative at both endpoints of the current subinterval, which is shown in the output. At the tenth step, the sign of `humps`

is positive at `a`

, `-0.10949`

, but negative at `b`

, `-0.264`

. From this point on, the algorithm continues to narrow down the interval `[-0.10949 -0.264]`

, as described in the previous section, until it reaches the value `-0.1316`

.

## Related Topics

- Roots of Polynomials
- Optimizing Nonlinear Functions
- Systems of Nonlinear Equations (Optimization Toolbox)