主要内容

fnder

求函数的导数

说明

fprime = fnder(f,dorder) 返回函数在 f 处的第 dorder 阶导数。dorder 的默认值为 1。对于负的 dorder,返回特定的 |dorder| 次不定积分,该积分在基本区间的左端点处以 |dorder| 倍消失。

输出与输入具有相同的格式,它们要么都是 pp 型,要么都是 B 型,要么都是 st 型。

如果 f 中的函数为 m 变量,则必须给定 dorder,且其长度必须为 m

另外:

  • 如果 f 为 pp 型,或为 B 型且其最后一个节点具有足够高的多重性,则在舍入误差范围内,ffnder(fnint(f)) 相同。

  • 如果 f 为 pp 型,且 fa 是函数在基本区间左端点 f 处的值,则在舍入误差范围内,ffnint(fnder(f),fa) 相等,除非由 f 描述的函数存在跳跃不连续点。

  • 如果 f 包含 f 的 B 型,且 t1 是其最左侧的节点,则在舍入误差范围内,fnint(fnder(f)) 包含 ff(t1) 的 B 型。然而,其最左侧的节点将失去一个多重性(如果它最初具有大于 1 的多重性)。此外,即使在 ff 的 B 型的最右侧节点没有满重数,其最右侧节点仍将具有满重数。要验证这一点,请创建一个样条曲线 sp = spmak([0 0 1], 1)。该样条曲线在其基本区间 [0..1] 上是一条直线,当值为 0 时,曲线值为 1;当值为 1 时,曲线值为 0。现在对其导数进行积分:spdi = fnint(fnder(sp))spdi 中的样条函数具有相同的基本区间,但在该区间上,它与在 0 处为 0、在 1 处 为 -1 的直线一致。

示例

fnder(f)fnder(f,1) 相同。

示例

全部折叠

本例演示如何计算三个 B 样条(阶数分别为 2、3 和 4)的一阶和二阶导数函数。然后它绘制样条曲线及其导数,并比较结果。

% Create the knots sequences
t1 = [0 .8 2];
t2 = [3 4.4 5  6];
t3 = [7  7.9  9.2 10 11];
tt = [t1 t2 t3];

% Accessory variables and commands for plotting purposes
cl = ['g','r','b','k','k'];
v = 5.4; d1 = 2.5; d2 = 0; s1 = 1; s2 = .5;
ext = tt([1 end])+[-.5 .5];
plot(ext([1 2]),[v v],cl(5))
hold on
plot(ext([1 2]),[d1 d1],cl(5))
plot(ext([1 2]),[d2 d2],cl(5))
ts = [tt;tt;NaN(size(tt))];
ty = repmat(.2*[-1;0;NaN],size(tt));
plot(ts(:),ty(:)+v,cl(5))
plot(ts(:),ty(:)+d1,cl(5))
plot(ts(:),ty(:)+d2,cl(5))

% Spline 1 (linear)
b1 = spmak(t1,1);
p1 = [t1;0 1 0];
% Calculate the first and second derivative of spline 1
db1 = fnder(b1);
p11 = fnplt(db1,'j');
p12 = fnplt(fnder(db1));
lw = 2;
plot(p1(1,:),p1(2,:)+v,cl(2),'LineWidth',lw)
plot(p11(1,:),s1*p11(2,:)+d1,cl(2),'LineWidth',lw)
plot(p12(1,:),s2*p12(2,:)+d2,cl(2),'LineWidth',lw)

% Spline 2 (quadratic)
b1 = spmak(t2,1);
p1 = fnplt(b1);
% Calculate the first and second derivative of spline 2
db1 = fnder(b1);
p11 = [t2;fnval(db1,t2)];
p12 = fnplt(fnder(db1),'j');
plot(p1(1,:),p1(2,:)+v,cl(3),'LineWidth',lw)
plot(p11(1,:),s1*p11(2,:)+d1,cl(3),'LineWidth',lw)
plot(p12(1,:),s2*p12(2,:)+d2,cl(3),'LineWidth',lw)

% Spline 3 (cubic)
b1 = spmak(t3,1);
p1 = fnplt(b1);
% Calculate the first and second derivative of spline 3
db1 = fnder(b1);
p11 = fnplt(db1);
p12=[t3;fnval(fnder(db1),t3)];
plot(p1(1,:),p1(2,:)+v,cl(4),'LineWidth',lw)
plot(p11(1,:),s1*p11(2,:)+d1,cl(4),'LineWidth',lw)
plot(p12(1,:),s2*p12(2,:)+d2,cl(4),'LineWidth',lw)

% Formatting the plot
tey = v+1.5;
text(t1(2)-.5,tey,'linear','FontSize',12,'Color',cl(2))
text(t2(2)-.8,tey,'quadratic','FontSize',12,'Color',cl(3))
text(t3(3)-.5,tey,'cubic','FontSize',12,'Color',cl(4))
text(-2,v,'B','FontSize',12)
text(-2,d1,'DB','FontSize',12)
text(-2,d2,'D^2B')
axis([-1 12 -2 7.5])
title({'B-splines with Simple Knots and Their Derivatives'})
axis off
hold off

Figure contains an axes object. The hidden axes object with title B-splines with Simple Knots and Their Derivatives contains 21 objects of type line, text.

输入参数

全部折叠

pp 型、B 型或 st 型样条函数,定义为包含以下字段的结构体:

样条函数的形式,以 ppB-tp00 形式返回。pp 表示样条函数以分段多项式形式给出,B 表示样条函数以 B 形式给出,tp00 表示样条函数以 st 形式给出。

样条的节点位置,以向量或多元数据的向量元胞数组形式返回。向量包含严格递增的元素,这些元素代表定义多项式段的每个区间的开始点和结束点。

每段的多项式系数,以矩阵或多元数据的数组形式返回。

描述样条的多项式的段数,以标量形式或包含多元数据每个变量中段数的向量形式返回。

描述样条的每个多项式段的多项式函数的阶,以标量形式或包含多元数据中每个变量阶的向量形式返回。

目标函数的维度,以标量形式返回。

函数 f 的导数阶数,指定为标量或向量(对于多元函数)。

数据类型: single | double

输出参量

全部折叠

pp 型、B 型或 st 型 f 样条函数的导数函数,以具有以下字段的结构体形式返回:

样条的形式,以 ppB-tp00 形式返回。导数函数的形式与 f 函数的形式相同。pp 表示样条函数以分段多项式形式给出,B 表示样条函数以 B 形式给出,tp00 表示样条函数以 st 形式给出。

样条的节点位置,以向量或多元数据的向量元胞数组形式返回。向量包含严格递增的元素,这些元素代表定义多项式段的每个区间的开始点和结束点。

每段的多项式系数,以矩阵或多元数据的数组形式返回。

描述样条的多项式的段数,以标量形式或包含多元数据每个变量中段数的向量形式返回。

描述样条的每个多项式段的多项式函数的阶,以标量形式或包含多元数据中每个变量阶的向量形式返回。

目标函数的维度,以标量形式返回。

限制

  • fnder 函数不适用于有理样条。要处理有理样条,请改用 fntlr 函数。

  • fnder 函数仅在有限范围内适用于 st 型:如果类型为 tp00,则 dorder 可为 [1,0][0,1]

算法

对于任意多项式形式的求导,fnder 函数以分段多项式意义求导。该函数分别对每个多项式段求导,并在求导过程中忽略多项式段之间的跳跃不连续性。

对于 B 型,该函数采用 [PGS; (X.10)] 公式进行求导。

对于stform,微分依赖于知道特定类型基函数相关导数的公式。

版本历史记录

在 R2006a 之前推出