原创 分段线性插值函数C及VB实现

2011-5-15 16:48 6253 10 11 分类: MCU/ 嵌入式
        由于分段线性插值在每个样点小区间上相对于原函数都有很强的收敛性,数值稳定性好且容易在计算机上编程实现,在工程中得到了较为广泛的应用。在实际项目应用中编写了以下分段线性插值函数,第一个为C语言版本,第二个为VB版本。


/****************************************************************************************
*NAME:       double LinearInterpolation(double *ScaleX,double *ScaleY,int ScalePointCount,double x)
*FUNCTION:   根据样点求x值的分段线性插值
*Parameter:  ScaleX:数组指针,指向样点x维参数,ScaleY:数组指针,指向样点y维参数,ScalePointCount:样点数,x:待求插值的参数值
*RETURN:     返回x值的分段线性插值
*****************************************************************************************/
double LinearInterpolation(double *ScaleX,double *ScaleY,int ScalePointCount,double x)      
{
    double y;
    int i,j;
    y=0;
    for(j=0;j<ScalePointCount-1;j++)
      {
       if(x>=ScaleX[j]&&x<=ScaleX[j+1])
         {
          i=j;
          goto a;
         }
      }
    i=ScalePointCount-2;
a:  y=ScaleY*(x-ScaleX[i+1])/(ScaleX-ScaleX[i+1])+ScaleY[i+1]*(x-ScaleX)/(ScaleX[i+1]-ScaleX);        
    return y;          
}

'****************************************************************************************
'NAME:       Public Function LinearInterpolation(ScaleX() As Single, ScaleY() As Single, ByVal x As Single) As Single
'FUNCTION:   根据样点求x值的分段线性插值
'Parameter:  ScaleX:样点x维数组,ScaleY:样点y维数组,x:待求插值的参数值
'RETURN:     返回x值的分段线性插值
'****************************************************************************************
Public Function LinearInterpolation(ScaleX() As Single, ScaleY() As Single, ByVal x As Single) As Single
   Dim i, j As Integer
   For j = 0 To UBound(ScaleX) - 1
       If x >= ScaleX(j) And x <= ScaleX(j + 1) Then
          i = j
          GoTo a
       End If
   Next
   If x > ScaleX(UBound(ScaleX)) Then
      i = UBound(ScaleX) - 1
   Else
      i = 0
   End If
   If UBound(ScaleX) = 0 Or UBound(ScaleY) = 0 Then
      If x = ScaleX(0) Then
         LinearInterpolation = ScaleX(0)
      Else
         LinearInterpolation = 0
      End If
      Exit Function
   End If
a: LinearInterpolation = ScaleY(i) * (x - ScaleX(i + 1)) / (ScaleX(i) - ScaleX(i + 1)) + ScaleY(i + 1) * (x - ScaleX(i)) / (ScaleX(i + 1) - ScaleX(i))

End Function

青山Blog http://blog.ednchina.com/qingshan


文章评论1条评论)

登录后参与讨论

用户377235 2012-10-13 08:23

谢谢

相关推荐阅读
用户377227 2013-02-20 17:40
OLED SSD1303显示驱动 for MSP430
RiTdisplay公司128*64点阵OLED(RGS101280640W003) SSD1303显示驱动 for MSP430,文中仅列出驱动接口、控制文档和函数声明,详细的源代码请看附件,开...
用户377227 2012-07-30 17:41
CPLD/FPGA的UART接口设计之系统时钟(晶振)和波特率关系探讨
        UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是一种广泛使用的异步串行数据通信协议。目前大多数MCU、串口通信I...
用户377227 2012-05-21 21:40
单色8*8点阵LED让人易困惑的那些事
       一般到市面上买单色8*8点阵LED,店家会问要共阳的还是共阴的,很多初学者搞不清楚什么是共阳的,什么是共阴的。         其实单色点阵LED本无所谓共阳还是共阴,如此命名多...
用户377227 2011-07-21 17:21
随笔:关于PL2303型号命名之乱
    使用PL2303这款芯片制作USB转串口时,相信很多人对PL2303生产商都有一样的困惑和不满,即尽管引脚定义和使用方式都有很大的不同,可是芯片仍采用相同的型号来命名(只是在后面加个版本号)。...
用户377227 2011-07-21 15:44
转:单片机C语言中_nop_函数的使用及C语言的延时计算
本文转载自http://hi.baidu.com/xiaowu191/blog/item/ca9b0b2913cd12f7e7cd4039.html,原作者不详,在此向作者致谢意。本文转载自网络标准的...
用户377227 2011-06-21 21:18
美科学家研制出世界上第一束生物激光(转载)
本文转自:http://news.sciencenet.cn/sbhtmlnews/2011/6/245486.html?id=245486,在此向原作者致谢意。作者:赵路 来源:科学时报 发布...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条