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。