Interp1 c++实现

在网上找了一下,有是有但是我下载下来用的时候结果不对。想修改一下但是搞得迷迷糊糊的,就干脆写了一个,不过只有最简单的线性插值的实现,新手可以直接拿过去用。也希望老鸟也可以不吝赐教,提高一下效率或者优化下结构。
cpp文件

//---------------------------------------------------------------------------
#pragma hdrstop

#include "Interpfun.h"

//---------------------------------------------------------------------------
#include"interpfun.h"
Interp::Interp()
{
strMethod1 ="lgr";
strMethod2 = "lg3";
strMethod3 = "spl";
}
Interp::~Interp()
{

}
double Interp::lgr(double *x,double *y,int n,double t)                  //X原位置Y原数据,n数据长度,t插入位置
{
	int i,j,m;
	double k,z,s;
	z= 0.0f;
	if(n<1)
	{
	 	return(z);
	}
	if(n==1)
	{
		z=y[0];
		return(z);
	}
	if(n==2)
	{
		k=y[1]-y[0]/x[1]-x[0];
		z=k*t+y[1]-k*x[1];
		return(z);
	}
	if(n>2){
	  for(i=0;i<n-1;i++){
	  if(x[i]==t){
		z=y[i];
		return(y[i]);
      }
	  if((x[i]<t)&&(x[i+1]>t)){
		k=(y[i+1]-y[i])/(x[i+1]-x[i]);
		z=k*(t-x[i+1])+y[i+1];
		return(z);
	  }
	  }
	  return(x[n-1]);
	}
}
void Interp::interp_onePoint(double *x,double *y,int n,double t,double *fval,char *method)
{

	if(method== NULL )
	*fval = lgr(x,y,n,t);
	else if(strcmpi(method,strMethod1) == 0)
	*fval = lgr(x,y,n,t);
	else
	*fval = lgr(x,y,n,t);
}


void Interp::interp_multiPoint(double *x,double *y,int n,double *t,double *fval,int m,char *method)
{
	if(t == NULL)
	{return;}
	double tempVal = 0.0;
	for(int k=0;k<m;k++){
	interp_onePoint(x,y,n,t[k],&tempVal,method);
	fval[k] = tempVal;
	}
}
#pragma package(smart_init)

h文件

//---------------------------------------------------------------------------

#ifndef InterpfunH
#define InterpfunH
//---------------------------------------------------------------------------
#include"math.h"
#include<stdio.h>
#include <string.h> 
#ifndef SafeDeleteVec
#define SafeDeleteVec(X) { if((X)) delete (X); (X)=NULL;}
#endif
class Interp
{
public:
	char *strMethod1;
	char *strMethod2;
	char *strMethod3;
public:
	Interp();
	~Interp();
/*****以下两个函数为插值函数**/
void interp_onePoint(double *x,double *y,int n,double t,double *fval,char *method);//返回单个点的值
void interp_multiPoint(double *x,double *y,int n,double *t,double *fval,int m,char *method);//返回多个点的值,点的个数为m
private:
//拉格朗日线性插值
double lgr(double *x,double *y,int n,double t);
};
#endif
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值