✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。
????个人主页:算法工程师的学习日志
一元非线性方程求解
fzero
函数可以用于求一个一元方程的根。通过用于指定起始区间的单元素起点或双元素向量调用该函数。如果为fzero
提供起点x0
,fzero
将首先搜索函数更改符号的点周围的区间。如果找到该区间,fzero
返回函数更改符号的位置附近的值。如果未找到此类区间,fzero
返回 NaN
。或者,如果知道函数值的符号不同的两个点,可以使用双元素向量指定该起始区间;fzero
保证缩小该区间并返回符号更改处附近的值。
以下部分包含两个示例,用于说明如何使用起始区间和起点查找函数的零元素。这些示例使用由 MATLAB提供的函数 humps.m
。下图显示了 humps
的图。
为 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
进行确认。
因此,可以将 [-1 1]
用作 fzero
的起始区间。
fzero
的迭代算法可求 [-1 1]
越来越小的子区间。对于每个子区间,humps
在两个端点的符号不同。由于子区间的端点彼此越来越近,因此它们收敛到 humps
的零位置。
要显示 fzero
在每个迭代过程中的进度,请使用 optimset
函数将 Display
选项设置为 iter
。
然后如下所示调用 fzero
:
每个值 x
代表迄今为止最佳的端点。Procedure
列向您显示每步的算法是使用对分还是插值。
可以通过输入以下内容验证 a
中的函数值是否接近零:
起点的使用
假定不知道 humps
的函数值符号不同的两点。在这种情况下,可以选择标量 x0
作为 fzero
的起点。fzero
先搜索函数更改符号的点附近的区间。如果 fzero
找到此类区间,它会继续执行上一部分中介绍的算法。如果未找到此类区间,fzero
返回 NaN
。
例如,将起点设置为 -0.2
,将 Display
选项设置为 Iter
,并调用 fzero
:
每个迭代中当前子区间的端点列在"a和b "下,而端点处的相应 humps
值分别列在 f(a)
和 f(b)
下。
注意:端点 a
和 b
未按任何特定顺序列出:a
可能大于 b
或小于 b
。
对于前 9 步,humps
的符号在当前子区间的两端点都为负号,如输出中所示。在第 10 步,humps
的符号在 a
(-0.10949
) 处为正号,但在 b
(-0.264
) 处为负号。从该点开始,如上一部分中所述,算法继续缩小区间 [-0.10949 -0.264]
,直到它达到值 -0.1316
。