矢量的数值导数

时间:2014-08-11 14:11:34

标签: matlab numerical derivative

我的矢量的数值导数是x:Nx1,相对于x的相同大小的另一个矢量t(时间)存在问题。 我做了以下(x被选为正弦函数作为例子):

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

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

有没有其他方法来计算这种衍生物?

3 个答案:

答案 0 :(得分:8)

您正在寻找我认为的数字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.   端点值与下一个值之间的单边差异   行内的相邻值。如果指定了两个或更多输出,   梯度还计算沿其他维度的中心差异。   与diff函数不同,gradient返回一个具有相同的数组   元素数量作为输入。

答案 1 :(得分: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进行比较,但这可能是另一种选择,因为它在每个点上都有连续的一阶导数(但不是二阶导数)。

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

答案 2 :(得分:0)

有一些方法可以解决您的问题。

首先:您可以扩大您的域名。而不是N,请使用N+1网格点。

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

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