我的矢量的数值导数是x:Nx1,相对于x的相同大小的另一个矢量t(时间)存在问题。 我做了以下(x被选为正弦函数作为例子):
t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;
但答案xd是(N-1)x1,我发现它不计算与x的第一个元素相对应的导数。
有没有其他方法来计算这种衍生物?
答案 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个值为 由
计算终点处的梯度,其中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
网格点。
第二:根据感兴趣的终点,您可以使用
F(x + dx) - F(x)
F(x) - F(x - dx)