各位朋友好,最近编程时需要对加速度传感器采集到的加速度数据进行积分来得到相应时间内的位移。
先贴出自己做的连续函数二次积分与自我尝试的离散一次积分请大家挑刺,顺便求如何对离散加速度进行二次积分,我感觉自己对二重积分的理解还不够到位,一次积分后不知道如何再去积分。网上查的都是比较复杂的Matlab的傅里叶变换。有没有稍微简单的误差不很大的算法。
需求:加速度积分相对位移
条件:初始速度为0,初试位移为0,时间间隔约为0.01s且均匀(即各点之间时间间隔相等),应该能够进行近似。
连续函数二次积分:
#include <stdio.h>
#define min 0
#define max 3.0
double f(double x)
{
return x;
}
double Ladder(int n)//用梯形法求积分
{
double width=(max-min)/n;
double sum=0;
double d;
for (d=min;d<max-width/2;d+=width)
{
sum+=(f(f(d))+f(f(d+width)))*width/2;
}
return sum;
}
void main()
{
int n;
printf("利用梯形法求 xdx 在(0,3)上的二次定积分\n");
printf("请输入划分小图形个数n(n越大,积分越准确):");
while (1)
{
scanf("%d",&n);
if (n>0)
break;
printf("输入错误,请重新输入:");
}
printf("梯形法积分为:%lf\n", Ladder(n));
}
离散数据的一次积分
#include <stdio.h>
double Ladder(int i_first,int i_second) //积分程序
{
double width=0.01;
double integral=0;
integral=(i_first+i_second)*width/2; //梯形面积
return integral;
}
void main()
{
FILE *fx=fopen("x1.txt","r"); //打开文本x
unsigned int i_first,i_second;
double final=0;
fscanf(fx,"%d",&i_first);
while(!feof(fx)) //是否读取完毕
{
fscanf(fx,"%d\t",&i_second); //读取赋值
final+=Ladder(i_first,i_second); //积分累加
i_first=i_second;
}
fclose(fx); //关闭文本x
printf("积分为:%lf\n",final );
}
在此先感谢各位大大了。 |