mapi 发表于 2009-3-5 01:50:31

离散点组成的曲线的求导?

曲线不是很光滑那种(附件),我用gradient求一阶两阶导,结果都不知道对不对。
dataq=xlsread('flow','A2:B89');
qto=dataq(:,1); qo=dataq(:,2);

for i=1:800
    qt(i)=(i-1)*0.765/n;
    q(i)=interp1(qto,qo,qt(i),'linear');
end
dq=gradient(q,qt);
dq2=gradient(dq,qt);

figure(4)
plot(qto,qo,'o',qt,q,'+',qt,dq,'-',qt,dq2,'--')

ljelly 发表于 2009-3-5 09:07:38

gradient是用来求梯度、方向导数的
不是用来求一阶导数的函数
应该考虑其他方法

mapi 发表于 2009-3-5 11:22:49

请问什么函数比较好?谢先。

messenger 发表于 2009-3-5 13:23:43

没有现成的函数,要编程,根据导数的定义,不是很难

mapi 发表于 2009-3-5 13:53:10

不是很明白,现在只知道离散点 f(xi), 那怎么表达导数?

messenger 发表于 2009-3-5 14:52:16

y=f(x),则x(i)点处的导数为(y(i+1)-y(i-1))/(x(i+1)-x(i-1))

ljelly 发表于 2009-3-5 17:00:23

请问什么函数比较好?谢先。
mapi 发表于 2009-3-5 11:22 http://forum.simwe.com/images/common/back.gif
diff 函数
与6楼是一样的方法
缺点是少点

mapi 发表于 2009-3-6 09:11:25

y=f(x),则x(i)点处的导数为(y(i+1)-y(i-1))/(x(i+1)-x(i-1))
messenger 发表于 2009-3-5 14:52 http://forum.simwe.com/images/common/back.gif

如果这样,那就可以用gradient.

mapi 发表于 2009-3-6 09:12:33


diff 函数
与6楼是一样的方法
缺点是少点
ljelly 发表于 2009-3-5 17:00 http://forum.simwe.com/images/common/back.gif

diff没有gradient精确

bainhome 发表于 2009-3-6 12:53:58

gradient算出的不是真正的梯度,因为没有考虑坐标的问题.等间距网格下实际梯度值应为:fx=fx/Δx;
fy=fy/Δy但是在网格间距比较大时误差很大.另外也可以采用样条先拟合再求导.
印象中这个问题早就讨论过了.

mapi 发表于 2009-3-6 13:25:17

我的数据点不到100个(假设为准确的值),我是先插值,得到更多点(比如1500)。然后用gradient来求:gradient(y,x) =(y(i+1)-y(i-1))/(x(i+1)-x(i-1)), 如6楼所说的表达式。只是在最后一个和最前一个点采用向后和向前差分。
当然要是数据不是准确的,那就先拟合,如10楼所说。

realyyy 发表于 2010-10-18 18:51:28

我刚好有朋友遇到这个问题,翻出这个帖子,学习先。
页: [1]
查看完整版本: 离散点组成的曲线的求导?