读书笔记:嵌入式常用算法_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值
	}
}

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

002237

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值