Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

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,以及包含有关求解过程的信息的输出结构体。

示例

全部折叠

通过求正弦函数在 3 附近的零点计算 π

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

求余弦函数在 12 之间的零点。

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

请注意,cos(1)cos(2) 的符号不同。

求函数 f(x) = x3 – 2x – 5. 的零值

首先,编写一个名为 f.m 的文件。

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

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

求 f(x) 在 2 附近的零点。

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

因为 f(x) 是一个多项式,所以可以使用 roots 命令求出相同的实数零点和一对复共轭零点。

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});

运行 fzero,且含带 options 参数。

x = fzero(fun,x0,options)

Figure Optimization Plot Function contains 2 axes objects. Axes object 1 with title Current Point, xlabel Variable number, ylabel Current point contains an object of type bar. Axes object 2 with title Current Function Value: -3.21625e-16, xlabel Iteration, ylabel Function value contains an object of type scatter.

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

求出 exp(-exp(-x)) = x 处的点,并显示有关求解过程的信息。

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]'

正如所期望的那样,fval = 0 表示 fun(x) = 0

输入参数

全部折叠

要求解的函数,指定为标量值函数的句柄或此类函数的名称。fun 接受标量 x 并返回标量 fun(x)

fzerofun(x) = 0 求解。要对方程 fun(x) = c(x) 求解,请改为对 fun2(x) = fun(x) - c(x) = 0 求解。

要在函数中包括额外参数,请参阅示例具有额外参数的函数的根参数化函数部分。

示例: 'sin'

示例: @myFunction

示例: @(x)(x-a)^5 - 3*x + a - 1

数据类型: char | function_handle | string

初始值,指定为实数标量或二元素实数向量。

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

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

提示

用区间(含有两个元素的 x0)调用 fzero 通常比用标量 x0 调用速度更快。

示例: 3

示例: [2,17]

数据类型: double

求解过程的选项,指定为结构体。使用 optimset 创建或修改 options 结构体。fzero 使用下列 options 结构体字段。

Display

显示级别:

  • 'off' 不显示输出。

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

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

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

FunValCheck

检查目标函数值是否有效。

  • 当目标函数返回的值是 complexInfNaN 时,'on' 显示错误。

  • 默认值 'off' 不会显示错误。

OutputFcn

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

PlotFcns

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

  • @optimplotx 绘制当前点。

  • @optimplotfval 绘制函数值。

有关编写自定义绘图函数的信息,请参阅优化求解器绘制函数

TolX

关于正标量 x 的终止容差。默认值为 eps 2.2204e–16。

示例: options = optimset('FunValCheck','on')

数据类型: struct

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

objective

目标函数

x0

x 的初始点,为实数标量或二元素向量

solver

'fzero'

options

通常使用 optimset 创建的 options 结构体

有关示例,请参阅 对问题结构体求解

数据类型: struct

输出参量

全部折叠

根或变号位置,以标量形式返回。

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

对退出条件编码的整数,表示 fzero 停止其迭代的原因。

1

函数收敛于解 x

-1

算法由输出函数或绘图函数终止。

-3

在搜索含有变号的区间时遇到 NaNInf 函数值。

-4

在搜索含有变号的区间时遇到复数函数值。

-5

算法可能收敛于一个奇异点。

-6

fzero 未检测到变号。

有关求根过程的信息,以结构体形式返回。结构体字段有:

intervaliterations

求包含根的区间所采取的迭代次数

iterations

求零点迭代次数

funcCount

函数计算次数

algorithm

'bisection, interpolation'

message

退出消息

算法

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

替代功能

App

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

参考

[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.

扩展功能

版本历史记录

在 R2006a 之前推出