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)

x = 1.8115

求解通过 Optimization 工具定义并导出的问题。

在 Optimization 工具中定义一个问题。输入 optimtool('fzero'),如图所示填写问题信息。

注意

Optimization 工具会显示警告,说明它将在以后的版本中被删除。

选择 “File > Export to Workspace”,并如图所示将问题导出到名为 problem 的变量。

在命令行中输入以下内容。

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

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

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

  • 2 元素向量 - 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

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

PlotFcns

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

  • @optimplotx 绘制当前点。

  • @optimplotfval 绘制函数值。

自定义绘图函数使用与输出函数相同的语法。请参阅Output Functions for Optimization Toolbox™Output Function and Plot Function Syntax

TolX

关于正标量 x 的终止容差。默认值为 eps 2.2204e–16。请参阅容差和停止条件

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

数据类型: struct

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

objective

目标函数

x0

x 的初始点,标量或二维向量

solver

'fzero'

options

选项结构体,通常使用 optimset 创建

您可以通过从 Optimization 工具导出来生成 problem。请参阅导入和导出您的工作求解导出的问题

数据类型: 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] 提出了一个 Fortran 版本,它是 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 之前推出