嵌入式常用算法_note_1
目录
折线插值
#include<stdio.h>
#define N 10 //折线由10段线段组成(即有11个插值节点)
float w=10.0; //插值节点间隔为10.0℃ (即 w=y1-y0=10.0)
float w0=0.0; //起点温度为0.0℃
float wn=100.0; //终点温度为100.0℃
int adc[N+1]={86,376,687,1021,1379,1760,2164,2592,3043,3515,4008}; //记录11个标定节点的A/D转换结果
float line(int x) //折线插值算法,x 为A/D转换结果,返回对应温度值
{
int i;
if( x < adc[0]) return(w0); //A/D转换结果过低,返回起点温度
if( x >= adc[N]) return(wn); //A/D转换结果过高,返回终点温度
for( i = 0; i < N;i++)
{
if( x < adc[i+1]) break; //判断x 所在区间
}
return(w*i+w*(x-adc[i])/(adc[i+1]-adc[i])); //用点斜式线性插值算法计算温度值
}
main( ) //折线插值算法验证程序
{
int x;
float y;
while(1)
{
printf("\n输入A/D转换结果:");
scanf("%d",&x);
if(x==0) break; //输入0时结束验证
y = line(x); //执行折线插值算法
printf("\n对应温度为 :%2.2f℃",y); //显示对应温度(显示两位小数)
}
}
抛物线插值
#include<stdio.h>
float x0,y0; //第1个插值节点的坐标
float x1,y1; //第2个插值节点的坐标
float x2,y2; //第3个插值节点的坐标
float x0t,y0t; //第1个插值节点坐标的备份
float x1t,y1t; //第2个插值节点坐标的备份
float L01,L02,L012; //中间变量
float line(float x) //点斜式线性插值算法
{
return ( y0 + ( y1 - y0 ) * ( x - x0 ) / ( x1 - x0 ));
}
float qins(float x) //以线性插值算法为基础的抛物线插值算法
{
L01 = line(x); //过点(x0,y0)和(x1,y1)作直线L01
x1t = x1; y1t = y1; //备份(x1,y1)的坐标数据
x1 = x2; y1 = y2; //将(x2,y2)复制到(x1,y1)中,以便重复使用线性插值函数
L02 = line(x); //过点(x0,y0)和(x2,y2)作直线L02
x0t = x0; y0t= y0; //备份(x0,y0)的坐标数据
x0 = x1t; y0 = L01; //将(x1,L01)复制到(x0,y0)中
x1 = x2; y1 = L02; //将(x2,L02)复制到(x1,y1)中
L012 = line(x); //过“点”(x1,L01)和(x2,L02)作“直线”L012,完成抛物线插值
x0 = x0t; y0 = y0t; //恢复(x0,y0)的坐标数据
x1 = x1t; y1 = y1t; //恢复(x1,y1)的坐标数据
return(L012); //返回抛物线插值计算结果
}
main( ) //抛物线插值算法验证程序
{
float x,y;
printf("\n输入三个插值节点的坐标:");
printf("\nx0=");
scanf("%f",&x0);
printf("\ny0=");
scanf("%f",&y0);
printf("\nx1=");
scanf("%f",&x1);
printf("\ny1=");
scanf("%f",&y1);
printf("\nx2=");
scanf("%f",&x2);
printf("\ny2=");
scanf("%f",&y2);
while(1)
{
printf("\n输入插值点的x坐标值:");
scanf("%f",&x);
if(x==0) break; //输入0时结束验证
y= qins(x); //执行抛物线插值算法
printf("\n对应的y坐标值为:%f",y); //显示对应的y值
}
}