首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量的数值导数

向量的数值导数
EN

Stack Overflow用户
提问于 2014-08-11 22:11:34
回答 3查看 11.2K关注 0票数 4

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

代码语言:javascript
复制
t=t0:ts:tf;
x=sin(t);
xd=diff(x)/ts;

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

有没有其他方法来计算这个导数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-11 22:44:58

我假设您正在寻找数值。

代码语言:javascript
复制
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返回的数组的元素数与输入的元素数相同。

票数 9
EN

Stack Overflow用户

发布于 2014-08-13 00:43:50

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-08-11 22:25:55

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

首先:你可以让你的域名变得更大。使用N+1网格点而不是N

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

正向差分:F(x + dx) - F(x)

  • Backward difference:F(x) - F(x - dx)

  1. Forward difference
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25245365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档