向量的数值导数

4

我在计算一个向量 x (Nx1) 相对于另一个同样大小的向量 t (时间) 的数值导数时遇到了问题。我按照以下步骤进行计算(x 被选为正弦函数作为示例):

t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;

但是答案 xd 是 (N-1)x1,我发现它没有计算与 x 的第一个元素对应的导数。

还有其他计算这个导数的方法吗?


3
数字化是一种可行的方法。由于使用差分来逼近导数,自然会得到比原始值少一个的结果。请注意,翻译后的内容不包含解释或额外信息。 - Luis Mendo
我知道这个方法。还有其他计算的方式吗? - milad
2
从数值上来说,我所知道的唯一方法是基于差分。如果您知道函数的解析表达式,也可以进行符号计算。 - Luis Mendo
分析函数不可用,而x只是一系列数据点。 - milad
@milad - 我删除了我的回答,因为它并不是很有用。希望你能尽快解决你的问题! - rayryeng
相关:计算向量的导数 - horchler
3个回答

9

我猜你是在寻找数值gradient

t0 = 0;
ts = pi/10;
tf = 2*pi;

t  = t0:ts:tf;
x  = sin(t);
dx = gradient(x)/ts

这个函数的目的是不同的(矢量场),但它提供了diff没有的功能:相等长度的输入和输出向量。

gradient计算数据点之间的中心差异。对于每行具有N个值的数组、矩阵或向量,第i个值由以下公式定义

enter image description here

i=1和i=N时的梯度,是通过该行中端点值和下一个相邻值之间的单侧差异计算出来的。如果指定了两个或多个输出,则gradient还沿其他维度计算中心差异。与diff函数不同的是,gradient返回与输入具有相同元素数量的数组。


谢谢,但是对于数值数据,它在数学上是如何工作的? - milad
是的。中心差分。 - Yvon
1
@thewaywewalk - 非常好! - rayryeng

2

我知道我来晚了一点,但是你也可以通过获取通过数据的多项式(三次)样条插值的导数来得到数值导数的近似值:

function dy = splineDerivative(x,y)

% the spline has continuous first and second derivatives
pp = spline(x,y); % could also use pp = pchip(x,y);

[breaks,coefs,K,r,d] = unmkpp(pp);
% pre-allocate the coefficient vector
dCoeff = zeroes(K,r-1);

% Columns are ordered from highest to lowest power. Both spline and pchip
% return 4xn matrices, ordered from 3rd to zeroth power. (Thanks to the
% anonymous person who suggested this edit).
dCoeff(:, 1) = 3 * coefs(:, 1); % d(ax^3)/dx = 3ax^2;
dCoeff(:, 2) = 2 * coefs(:, 2); % d(ax^2)/dx = 2ax;
dCoeff(:, 3) = 1 * coefs(:, 3); % d(ax^1)/dx = a;

dpp = mkpp(breaks,dCoeff,d);

dy = ppval(dpp,x);

spline多项式在每个点处始终保证具有连续的一阶和二阶导数。我尚未测试并将其与使用pchip而不是spline进行比较,但这可能是另一个选择,因为它也在每个点处具有连续的一阶导数(但没有二阶导数)。

这样做的好处是不需要步长是均匀的要求。


谢谢你的解决方案!非常有效! - Scott G
对于 Octave 用户而言,中间部分可以替换为 dpp = ppder (pp)。这是 ppder 的文档。 - ederag
ppder也可以在Matlab样条工具箱中使用。 - Felipe G. Nievinski

0

有一些选项可以解决您的问题。

第一:您可以扩大域。使用N + 1网格点代替N

第二:根据感兴趣的端点,您可以使用

  1. 向前差分:F(x + dx) - F(x)
  2. 向后差分:F(x)- F(x-dx)

1
亲爱的gire,我有一组数据作为x值,但我没有解析函数。那么我该如何扩展定义域呢?我认为前向差分与“diff”相同。 - milad
@miladпјҢйҖҡиҝҮжү©еұ•еҹҹпјҢжҲ‘жҢҮзҡ„жҳҜпјҡеҰӮжһңдҪ зҡ„t = [0, 1]пјҢ并且дҪ еҜ№еҜјж•°dF(t = 0)е’ҢdF(t = 1)ж„ҹе…ҙи¶ЈпјҢйӮЈд№ҲдҪ еҸҜд»Ҙе°Ҷtжү©еұ•еҲ°t [-0.5, 1.5]пјҲе…¶дёӯFжҳҜдҪ зҡ„еҮҪж•°пјҢdFиЎЁзӨәж•°еҖјеҜјж•°пјүгҖӮ - gire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接