博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#版本拉格朗日插值算法
阅读量:6758 次
发布时间:2019-06-26

本文共 2215 字,大约阅读时间需要 7 分钟。

        实际中有时需要对数据进行分析, 最近就遇到了这样一个情况: 有一系列横坐标是时间, 纵坐标是记录值的一些数据, 但横坐标却不是等距记录的. 就是说在第一分钟记录一次, 第二分钟记录一次, 第四分钟记录一次...不等距. 需求是根据现在的这些数据进行计算, 获得等距时间所对应的记录值, 也就是说第三分钟没有记录, 得通过计算来获得第三分钟的值.

        原本想把这些数据显示在Chart控件中, 然后再从Chart控件中获取各个X坐标所对应的Y值, 但后来发现这样不可行, 只能得到有记录的数据点的值, 新点的值得不到悲伤. 只能使用来计算了, 下面是拉格朗日插值的算法(C#版本):

/// /// 根据离散点进行二次的拉格朗日插值/// http://www.cnblogs.com/technology/// class Lagrange{/// /// X各点坐标组成的数组/// public int[] x { get; set; }/// /// X各点对应的Y坐标值组成的数组/// public double[] y { get; set; }/// /// x数组或者y数组中元素的个数, 注意两个数组中的元素个数需要一样/// public int itemNum { get; set; }/// /// 初始化拉格朗日插值/// /// X各点坐标组成的数组/// X各点对应的Y坐标值组成的数组public Lagrange(int[] x, double[] y){    this.x = x; this.y = y;    this.itemNum = x.Length;}/// /// 获得某个横坐标对应的Y坐标值/// /// x坐标值/// 
public double GetValue(int xValue){ //用于累乘数组始末下标 int start, end; //返回值 double value = 0.0; //如果初始的离散点为空, 返回0 if (itemNum < 1) { return value; } //如果初始的离散点只有1个, 返回该点对应的Y值 if (itemNum == 1) { value = y[0]; return value; } //如果初始的离散点只有2个, 进行线性插值并返回插值 if (itemNum == 2) { value = (y[0] * (xValue - x[1]) - y[1] * (xValue - x[0])) / (x[0] - x[1]); return value; } //如果插值点小于第一个点X坐标, 取数组前3个点做插值 if (xValue <= x[1]) { start = 0; end = 2; } //如果插值点大于等于最后一个点X坐标, 取数组最后3个点做插值 else if (xValue >= x[itemNum - 2]) { start = itemNum - 3; end = itemNum - 1; } //除了上述的一些特殊情况, 通常情况如下 else { start = 1; end = itemNum; int temp; //使用二分法决定选择哪三个点做插值 while ((end - start) != 1) { temp = (start + end) / 2; if (xValue < x[temp - 1]) end = temp; else start = temp; } start--; end--; //看插值点跟哪个点比较靠近 if (Math.Abs(xValue - x[start]) < Math.Abs(xValue - x[end])) start--; else end++; } //这时已经确定了取哪三个点做插值, 第一个点为x[start] double valueTemp; //注意是二次的插值公式 for (int i = start; i <= end; i++) { valueTemp = 1.0; for (int j = start; j <= end; j++) if (j != i) valueTemp *= (double)(xValue - x[j]) / (double)(x[i] - x[j]); value += valueTemp * y[i]; } return value;}

        等时间距获取值的问题就这样解决了, 但要注意这是二次插值, 也就是拟合的是二次及二次方程以下的函数.

你可能感兴趣的文章
vuejs学习之 项目打包之后的首屏加载优化
查看>>
三十、小程序解析HTML(对富文本返回数据的处理)
查看>>
利用YUM搭建DNS
查看>>
好详细啊saltsatck超全配置
查看>>
安装LAMP环境遇到Sorry, I cannot run apxs
查看>>
centos7双网卡bond失败
查看>>
JNI AES文件及字符串加解密
查看>>
APUE读书笔记-16网络通信-01简介
查看>>
企业网络安全必需措施 保证高效工作环境
查看>>
apache站点稍大文件不完整原因及解决
查看>>
python的reduce函数
查看>>
细读shell-6
查看>>
ubuntu11.10安装php mysql wordpress
查看>>
一、2 基于wsgiref定义自己的web框架
查看>>
Ubuntu Server14.04 32位安装odoo8.0简单方法
查看>>
jQuery-easyui下的多表关联的增删改操作
查看>>
C库函数学习笔记之strstr
查看>>
我的友情链接
查看>>
大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整案例
查看>>
java中的自动装箱和自动拆箱
查看>>