点击上方公众号名称关注,获得更多内容
✎ 编 者 悟 语生活有时要得就是一股劲,进行一次次的冲锋。
文 章 导 读
今天给大家介绍下线性插值法的用法,用C标准库函数中的qsort排序函数进行排序,并用比较法确定插值的亮点范围,抛转引玉,大家可以根据需要进行算法的优化哈,希望对小伙伴们有所帮助哈,!
1线性插值法简介线性插值法是一种简单实用的数值预测方式。
插值法示意图如下。
简单来说,线性插值法就是两点决定一条直线,通过两点可以求出直线方程,如果已知x就可以求y,已知y也可以求x。
但在实际中,决定直线的点有很多,可以求出很多方程,此时就需要根据坐标来确定就近的两点确定直线去求值,就近两点的确定,下面用排序比较法来确定。
2C标志库中的插值函数1)函数功能
函数qsort对一个包含nmemb个数组对象进行排序,其第一元素由base指向,数值中的每个元素的大小由size指定。
2)函数原型
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void*,const void *))
3)头文件
#include
4)参数说明
base:指向第一元素。
nmemb:排序对象的个数。
size:每个元素的大小。
compar:它指向的比较函数将数组内容排成升序。
函数的参数分别指向两个数组元素的指针。
如果第一个元素小于、等于或大于第二个元素,则函数分别返回小于0、等于0和大于0的整数。
如果比较的两个元素相等,则没有指定它们在排列后的数值中的
5)返回值
无返回值。
3代码实现线性插值法求值实现代码如下:
#include
#include// 数值点的个数
#define NUM 6// 函数声明int cmp(const void *a,const void *b);float linear_interpolation(float *x);// 全局变量x的值float xval = 4.5;int main(){
float ret;
printf("\nx = %f\n\n",xval);
ret = linear_interpolation(&xval);
printf("\n\ny = y0 + ( (y1 - y0) / (x1 - x0) ) * (x - x0) = %f",ret);return 0;
}float linear_interpolation(float *x){
int i, j, k, t = 2;float *x0,*y0;float *x1,*y1;float *y = (float*)malloc(sizeof(float));// 数值点的值float array[NUM][2]={
{
7,6},
{
2,1},
{
5,9},
{
3,5},
{
7,9},
{
4,2}
};// 打印原数据for(i=0;i {
for(j=0;j<2;j++)
{
printf("%8.2f ",array[i][j]);
}
printf("\n");
}
printf("\n");
qsort(array,NUM,sizeof(array[0]),cmp);// 打印排序后的新数据 for(i = 0; i {
for(j = 0; j 2;j++)
{
printf("%8.2f ",array[i][j]);
}
printf("\n");
}for(k = 0; k {
// 找到插值位置 if(array[k][0] >= xval)
{
t = k; // 记录下标 break;
}
}
printf("\nt = %d\n\n",t);
y0 = &array[t][1];
x0 = &array[t][0];
printf("x0 = %f\t",*x0);
printf("y0 = %f\n",*y0);if(t == 0) //等于零向上查找
{
y1 = &array[t+1][1];
x1 = &array[t+1][0];
printf("x1 = %f\t",*x1);
printf("y1 = %f\n",*y1);
} else //不等于零向下查找
{
y1 = &array[t-1][1];
x1 = &array[t-1][0];
printf("x1 = %f\t",*x1);
printf("y1 = %f\n",*y1);
} if(*x1 == *x0)
{
printf("\n除数不能为0!");
}else
{
*y = *y0 + ( (*y1 - *y0) / (*x1 - *x0) ) * (*x - *x0);
}return *y;
}int cmp(const void *a,const void *b){
int *c = (int *)a;int *d = (int *)b;if(*c != *d)
{
return *c - *d;
}else
{
return *(d+1) - *(c+1);
}
}
运行结果如下图所示。
总结
进用C标准库中的qsort函数验证了一下线性插值法的使用,大家可以根据自己的项目进行算法优化哈,后面还会有C语言相关的内容,大家敬请期待哈,。
有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。
相关文章:
编程意识篇——用结构存储数据以减少函数二次调用,能替代return返回值吗
C代码实现16位和32位数据字节序转换
C语言中一个分号的奇迹(预处理、指针、结构体、内存分配)——一段暗藏玄机的代码
malloc为什么不能在函数体外给全局变量分配内存
宏分类的妙用(排版开始用模板)
用结构体和指针模拟配置芯片引脚输出高低电平
进化论——从函数指针到被结构封装的函数指针及参数的应用举例
专辑推荐:
Python技能专辑
C语言专辑
IDE调试专辑
软件推荐专辑
软实力专辑
Linux专辑
扫码关注我们
❖ Game Over!