我有一个问题,一个向量的数值导数是x: Nx1相对于另一个与x大小相同的向量t(时间)。我做了以下操作(例如,x被选为正弦函数):
t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;但答案xd是(N-1)x1,我发现它不会计算与x的第一个元素对应的导数。
有没有其他方法来计算这个导数?
发布于 2014-08-11 22:44:58
我假设您正在寻找数值。
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返回的数组的元素数与输入的元素数相同。
发布于 2014-08-13 00:43:50
我知道我在这里有点晚了,但是你也可以通过取遍历数据的多项式(三次)样条的导数来获得数值导数的近似值:
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进行测试和比较,但这可能是另一种选择,因为它在每个点都有连续的一阶导数(但不是二阶导数)。
这样做的好处是,没有要求步长是均匀的。
发布于 2014-08-11 22:25:55
有一些选项可以解决您的问题。
首先:你可以让你的域名变得更大。使用N+1网格点而不是N。
第二:根据感兴趣的端点,您可以使用
正向差分:F(x + dx) - F(x)
F(x) - F(x - dx)
https://stackoverflow.com/questions/25245365
复制相似问题