我在计算一个向量 x (Nx1) 相对于另一个同样大小的向量 t (时间) 的数值导数时遇到了问题。我按照以下步骤进行计算(x 被选为正弦函数作为示例):
t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;
但是答案 xd 是 (N-1)x1,我发现它没有计算与 x 的第一个元素对应的导数。
还有其他计算这个导数的方法吗?
我在计算一个向量 x (Nx1) 相对于另一个同样大小的向量 t (时间) 的数值导数时遇到了问题。我按照以下步骤进行计算(x 被选为正弦函数作为示例):
t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;
但是答案 xd 是 (N-1)x1,我发现它没有计算与 x 的第一个元素对应的导数。
还有其他计算这个导数的方法吗?
我猜你是在寻找数值gradient
。
t0 = 0;
ts = pi/10;
tf = 2*pi;
t = t0:ts:tf;
x = sin(t);
dx = gradient(x)/ts
gradient计算数据点之间的中心差异。对于每行具有N个值的数组、矩阵或向量,第i个值由以下公式定义
i=1和i=N时的梯度,是通过该行中端点值和下一个相邻值之间的单侧差异计算出来的。如果指定了两个或多个输出,则gradient还沿其他维度计算中心差异。与diff函数不同的是,gradient返回与输入具有相同元素数量的数组。
我知道我来晚了一点,但是你也可以通过获取通过数据的多项式(三次)样条插值的导数来得到数值导数的近似值:
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
进行比较,但这可能是另一个选择,因为它也在每个点处具有连续的一阶导数(但没有二阶导数)。
这样做的好处是不需要步长是均匀的要求。
有一些选项可以解决您的问题。
第一:您可以扩大域。使用N + 1
网格点代替N
。
第二:根据感兴趣的端点,您可以使用
F(x + dx) - F(x)
F(x)- F(x-dx)
t = [0, 1]
пјҢ并且дҪ еҜ№еҜјж•°dF(t = 0)
е’ҢdF(t = 1)
ж„ҹе…ҙи¶ЈпјҢйӮЈд№ҲдҪ еҸҜд»Ҙе°Ҷt
жү©еұ•еҲ°t [-0.5, 1.5]
пјҲе…¶дёӯF
жҳҜдҪ зҡ„еҮҪж•°пјҢdF
иЎЁзӨәж•°еҖјеҜјж•°пјүгҖӮ - gire