大家好,又见面了,我是你们的朋友全栈君。
在网上找了一下,有是有但是我下载下来用的时候结果不对。想修改一下但是搞得迷迷糊糊的,就干脆写了一个,不过只有最简单的线性插值的实现,新手可以直接拿过去用。也希望老鸟也可以不吝赐教,提高一下效率或者优化下结构。
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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134540.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...