vipdm 发表于 2006-8-14 11:17

请教: 样条插值积分

我想对一列有误差的加速度值进行样条函数插值积分以求得位移(使用已知解析表达式的函数是为了验证用此方法的正确性),以下为我的程序,但是结果不正确,请各位高手帮忙看看,我的思路有问题还是函数用的不对?多谢多谢!
n=1024;
t=0:1/fs:n/fs
y1=50*sin(4*pi*t)+100*sin(10*pi*t);    %各采样得到的加速度值
sp1=csapi(t,y2);                                 %三次样条插值
Cformint=fnint(sp1,0);       %对插值得到的函数进行积分
varCformint=fnval(Cformint,t);       %得到积分后在各时间点的值(速度值)
sp2=csapi(t,varCformint);      %对插值得到的速度值再次进行三次样条插值
Cformint2=fnint(sp2,0);      %对插值得到函数进行积分以求得位移
varCformint2=fnval(Cformint2,t);   %得到积分后位移在各时间点的值
figure
plot(t,varCformint2)

得到的结果不是正弦曲线而是一条斜率为正的直线,这是为什么呢,请各位高手帮忙解答一下,感激不尽!

yejet 发表于 2006-8-14 21:42

估计是积分造成的,希望给出完整的代码

vipdm 发表于 2006-8-15 15:12

实在不好意思,我为了尽量减少帖子的字数,删减了原来程序的一部分内容,没想到把有用的部分也给删掉了,以下的程序是可以运行的:

n=1024;
fs=20;
t=0:1/fs:n/fs;
y1=100*sin(10*pi*t);   
sp1=csapi(t,y1);                                 
Cformint=fnint(sp1,0);      
varCformint=fnval(Cformint,t);      
sp2=csapi(t,varCformint);      
Cformint2=fnint(sp2,0);   
varCformint2=fnval(Cformint2,t);   
figure
plot(t,varCformint2)

我的问题是y1这个正弦函数如果进行两次积分的话,得到的结果应该还是正弦函数,
但是我对其用样条函数进行插值,然后进行数值积分,得到却不是正弦函数曲线,自己找不出原因,请各位高手多加指点,多谢多谢!

happy 发表于 2006-8-15 17:19

Cformint=fnint(sp1,0);

是这个语句造成的
实际积分的结果应该是F(x)+C,你用这个语句表示的是C=0
而实际上C并不等于零,换句话说就是在你第一次积分的过程中引入了直流量

所以第二次积分的时候这个直流量就是就变成了斜线量

由于这个量在数值上远大于波动量,所以看上去是斜线,实际上放大看的话也应该是波动的

这就需要将程序中将着一直流量滤掉

vipdm 发表于 2006-8-17 09:53

非常感谢您的解答!能否再请问您该如何去除这个直流项?
因为我既使将   Cformint=fnint(sp1,0);   这个语句改成    Cformint=fnint(sp1,-100/10/pi); 其中,-100/10/pi是当t=0时使位移为0,得到的积分常数C的值, 再运行程序,得到的结果仍然是斜直线。 这是怎么回事呢?请多多指教!

happy 发表于 2006-8-17 17:07

一般采用滤波的方法,这个问题论坛讨论过好多

比如:http://forum.vibunion.com/forum/viewthread.php?tid=20424
http://forum.vibunion.com/forum/viewthread.php?tid=329

[ 本帖最后由 happy 于 2006-8-17 17:08 编辑 ]

vipdm 发表于 2006-8-18 10:07

谢谢!

谢谢您的回复,我会找相关讨论来好好学习的!再次感谢!
页: [1]
查看完整版本: 请教: 样条插值积分