文档

fnzeros

求函数在给定区间内的零点

语法

Z = fnzeros(f,[a b])
Z = fnzero (f)

描述

Z = fnzeros(f,[a b])是单变量样条曲线的零的有序列表吗f在间隙中[一个..b]。

Z = fnzero (f)在样条的基本区间内是否有一个0的列表f

样条曲线为零是一个最大的闭合区间,在此区间上样条曲线为零,或者是一个零点交叉点(样条曲线改变符号的点)。

0的列表,z是一个有两行的矩阵。第一行是区间的左端点,第二行是右端点。每一列z (:, j)包含单个间隔的左端点和右端点。

这些间隔有三种:

  • 如果端点不同,则函数在整个区间上为零。在这种情况下,给出了最大的区间,而不管区间内部可能有什么结点。

  • 如果端点相同且与一个结重合,则函数在f在这一点是0。样条曲线在这一点上可以穿过零,接触零或不连续。

  • 如果端点相同且不与结重合,则样条曲线在该点有一个零点相交。

如果样条曲线,f,在一个不是结但不是结的点上触零交叉0,那么这个0可能找不到。如果它被发现,那么它可能被发现两次。

例子

例1。下面的代码构造并绘制了一个分段线性样条,该样条具有三种类型的零:接触零、交叉零和间隔为零。fnzeros计算所有的零,然后代码在图上绘制结果。

Sp = spmak(augknt(1:7,2),[1,0,1,-1,0,0,1]);Fnplt (sp) z = fnzeros(sp) nz = size(z,2);抓住情节(z(1:), 0(新西兰),“>”,z(2:), 0(新西兰),“<”),推迟

这给出了以下零列表:

Z = 2.000 3.5000 5.0000 2.000 3.5000 6.0000

在这个简单的示例中,即使对于第二种零,两个端点在所有位置都一致。

例2。下面的代码生成并绘制具有多个极值的样条函数,并通过计算样条函数一阶导数的零点来定位所有极值。

F = spmak(1:21, rand(1,15)-0.5);Interval = fnbrk(f, ' Interval ');Z = fnzeros(fender (f));Z = Z (1,:);Values = fnval(f, [interval, z]);Min (values) fnplt(f) hold on plot(z), fnval(f,z),'ro') hold off

你的情节将不同于下面的例子,因为使用兰德生成随机系数。

例3。我们构造了一个在跳变不连续处为零的b型样条曲线,并在超出其基本区间的区间内求出所有样条曲线的零。

Sp = spmak([0 0 1 1 2],[1 0 - 2]);Fnplt (sp) z = fnzeros(sp,[.](1,size(z,2));等等,故事情节(z(: 1)、zy,“>”,z (2:), zy,“<”),推迟

这给出了以下零列表:

Z = 1.0000 2.0000 1.0000 2.7000

注意得到的零区间[2..2.7],因为根据定义,b形式的样条曲线在其基本区间[0..2]之外等于零。

例4。的用法fnzeros一个不连续函数。下面的代码创建并绘制了一个不连续的分段线性函数,并找到了零点。

Sp = spmak([0 0 1 1 2 2],[-1 1 -1]);fnplt (sp);fnzeros (sp)

这给出了以下0列表,在(1..2)和(0..1)中,以及在1处跳过0:

Ans = 0.5000 1.0000 1.5000 0.5000 1.0000 1.5000

算法

fnzeros首先将函数转换为b形式。该函数对不连续点进行预处理,然后使用Mørken和Reimers算法。

参考文献:Knut Mørken和Martin Reimers,一种计算样条和多项式零的无条件收敛方法,数学。p. 76:845—865,2007。

另请参阅

|

这个话题有帮助吗?