前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab求解非线性方程的根

Matlab求解非线性方程的根

作者头像
用户9925864
发布2022-07-27 08:38:36
7120
发布2022-07-27 08:38:36
举报
文章被收录于专栏:算法工程师的学习日志

一元非线性方程求解

fzero函数可以用于求一个一元方程的根。通过用于指定起始区间的单元素起点或双元素向量调用该函数。如果为fzero提供起点x0fzero将首先搜索函数更改符号的点周围的区间。如果找到该区间,fzero返回函数更改符号的位置附近的值。如果未找到此类区间,fzero 返回 NaN。或者,如果知道函数值的符号不同的两个点,可以使用双元素向量指定该起始区间;fzero 保证缩小该区间并返回符号更改处附近的值。

以下部分包含两个示例,用于说明如何使用起始区间和起点查找函数的零元素。这些示例使用由 MATLAB提供的函数 humps.m。下图显示了 humps 的图。

代码语言:javascript
复制
x = -1:.01:2;
y = humps(x);
plot(x,y)
xlabel('x');
ylabel('humps(x)')
grid on

fzero 设置选项

可以通过设置选项控制 fzero 函数的多个方面。使用 optimset 设置选项。常用选项包括:

Parameter

Value

Description

Display

'off' | 'iter' | 'final' | 'notify'

'off' 表示不显示输出; 'iter' 显示每次迭代的结果; 'final' 只显示最终结果; 'notify' 只在函数不收敛的时候显示结果.

MaxFunEvals

positive integer

函数求值运算(Function Evaluation)的最高次数

MaxIter

positive integer

最大迭代次数.

TolFun

positive scalar

函数迭代的终止误差.

TolX

positive scalar

结束迭代的X值.

使用起始区间

humps 的图指示 x = -1 时函数为负数,x = 1 时函数为正数。可以通过计算这两点的 humps 进行确认。

代码语言:javascript
复制
humps(1)
ans = 16
humps(-1)
ans = -5.1378

因此,可以将 [-1 1] 用作 fzero 的起始区间。

fzero 的迭代算法可求 [-1 1] 越来越小的子区间。对于每个子区间,humps 在两个端点的符号不同。由于子区间的端点彼此越来越近,因此它们收敛到 humps 的零位置。

要显示 fzero 在每个迭代过程中的进度,请使用 optimset 函数将 Display 选项设置为 iter

代码语言:javascript
复制
options = optimset('Display','iter');

然后如下所示调用 fzero

代码语言:javascript
复制
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

每个值 x 代表迄今为止最佳的端点。Procedure 列向您显示每步的算法是使用对分还是插值。

可以通过输入以下内容验证 a 中的函数值是否接近零:

代码语言:javascript
复制
humps(a)
ans = 8.8818e-16

起点的使用

假定不知道 humps 的函数值符号不同的两点。在这种情况下,可以选择标量 x0 作为 fzero 的起点。fzero 先搜索函数更改符号的点附近的区间。如果 fzero 找到此类区间,它会继续执行上一部分中介绍的算法。如果未找到此类区间,fzero 返回 NaN

例如,将起点设置为 -0.2,将 Display 选项设置为 Iter,并调用 fzero

代码语言:javascript
复制
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

每个迭代中当前子区间的端点列在"a和b "下,而端点处的相应 humps 值分别列在 f(a)f(b) 下。

注意:端点 ab 未按任何特定顺序列出:a 可能大于 b 或小于 b

对于前 9 步,humps 的符号在当前子区间的两端点都为负号,如输出中所示。在第 10 步,humps 的符号在 a (-0.10949) 处为正号,但在 b (-0.264) 处为负号。从该点开始,如上一部分中所述,算法继续缩小区间 [-0.10949 -0.264],直到它达到值 -0.1316

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一元非线性方程求解
    • 为 fzero 设置选项
      • 起点的使用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档