1. 首页 > 科技

求大佬帮忙编一个IF组合线性插值的公式 线性插值法c语言程序

求大佬帮忙编一个IF组合线性插值的公式线性插值法c语言程序

用C语言编写一个线性插值程序

#include"string.h"

#include <stdio.h>

main()

{char a[100],x;

int len,i,wz;

printf("input:\n");

scanf("%d%c%s",&wz,&x,a);

len=strlen(a);

printf("\n");

for(i=len-1;i>=wz-1;i--)

a[i+1]=a[i];

a[wz-1]=x ;

a[len+1]='\0';

printf("%s\n",a) ;

}

输入的时候注意了,回车结束,例如输入:4dabcef 结果:abcdef 希望有所帮助 ,WZ表示位置,x表示要插入的字符,a表示字符串,当然你可以判断输入的位置是否超过字符串的长度,我就不写了,推荐下,如果是数组,先排序,在插值,比较简单,就不写了,写个字符的插入^_^

插值法公式

以下是我的个人观点:

首先你得分清楚插值和拟合这两个的区别,

拟合是指你做一条曲线或直线,使得你的数据点跟这条线的“误差”最小。注意,这个要求并不要求所有的数据点在我们的拟合曲线上。

插值是指你做一条曲线或直线完全经过这些点,就是说数据点一定都要在插值曲线上。

插值也有好多种:比如拉格朗日插值,分段插值,样条插值(样条插值要求你还要知道这些数据点的一阶导数)

我们知道两点确定一条直线(一次多项式),三点确定一条抛物线(二次多项式),试想一下有10个点是不是可以确定一个9次多项式(9次多项式里面还有一个常数项,就是10个未知数,我们有10个数据点,刚好可以求解)

(**)拉格朗日插值就是上面的这种插值。但是它就是把这些多项式系数重新表示了一下(就是不用去求上面所说的10个系数)。你求出这些系数后,只要将你想要的x的值往里一代,马上就得到你想要的函数值。但这种插值在头尾附近会出现一些不好的振荡现象(龙格现象)

(**)分段插值,还是按照上面的原则,比如说,我两个点两个点地确定一条直线(比如1,2点连起来,2,3点连起来),最后所有直线的集合(这时应当是一系列的折线)这个分段函数也是经过所有的数据点。当然你也可以三个点三个点地确定一条抛物线。用这一方面时,你要先确定你想要的x值在哪一个区间里,然后用这一区间的表达式来计算出函数值就可以了。本方法不会出现龙格现象

(***)样条插值,上面提到分段插值是一系列折线,折线使得不光滑,样条就是用其导数值,使得它们变光滑。

下面说计算方法吧!至于表达式,你如果理解了上面,你去找本“计算方法”或“数值计算”的书,上面都有表达式。应当不难。

另外你还可以借助于MATLAB这样的软件来计算。

比如你的原始数据是X,Y,你想要求y(x=5)的值

X=[2,6,10,14,18,22,26,30,34,38,41,42,45,49,53,57,61,65,69,73,77,81]; %自变量的值

Y=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]; %自变量相应的函数值

X0=5; %你想要的点的值

N=22; %这个是点的个数

Doc=2; %分段插值中你想用几个点插值

你可以用下面的语句得到y(x=5);

Y1=lagrange(X,Y,X0) %拉格朗日插值

Y2=interp1(X,Y,X0,'linear') %分段两点线性插值

Y2=interp1(X,Y,X0,'spline') %分段两点线性插值

可能说的不好,你如果想系统地学点,可能得看一下相关的书。

用C语言编一个线性插值的小程序,很着急

#include<stdio.h>

#include<stdlib.h>

#include<iostream.h>

typedef struct data

{

float x;

float y;

}Data;//变量x和函数值y的结构

Data d[20];//最多二十组数据

float f(int s,int t)//牛顿插值法,用以返回插商

{

if(t==s+1)

return (d[t].y-d[s].y)/(d[t].x-d[s].x);

else

return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);

}

float Newton(float x,int count)

{

int n;

while(1)

{

cout<<"请输入n值(即n次插值):";//获得插值次数

cin>>n;

if(n<=count-1)// 插值次数不得大于count-1次

break;

else

system("cls");

}

//初始化t,y,yt。

float t=1.0;

float y=d[0].y;

float yt=0.0;

//计算y值

for(int j=1;j<=n;j++)

{

t=(x-d[j-1].x)*t;

yt=f(0,j)*t;

//cout<<f(0,j)<<endl;

y=y+yt;

}

return y;

}

float lagrange(float x,int count)

{

float y=0.0;

for(int k=0;k<count;k++)//这儿默认为count-1次插值

{

float p=1.0;//初始化p

for(int j=0;j<count;j++)

{//计算p的值

if(k==j)continue;//判断是否为同一个数

p=p*(x-d[j].x)/(d[k].x-d[j].x);

}

y=y+p*d[k].y;//求和

}

return y;//返回y的值

}

void main()

{

float x,y;

int count;

while(1)

{

cout<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数

cin>>count;

if(count<=20)

break;//检查输入的是否合法

system("cls");

}

//获得各组数据

for(int i=0;i<count;i++)

{

cout<<"请输入第"<<i+1<<"组x的值:";

cin>>d[i].x;

cout<<"请输入第"<<i+1<<"组y的值:";

cin>>d[i].y;

system("cls");

}

cout<<"请输入x的值:";//获得变量x的值

cin>>x;

while(1)

{

int choice=3;

cout<<"请您选择使用哪种插值法计算:"<<endl;

cout<<" (0):退出"<<endl;

cout<<" (1):Lagrange"<<endl;

cout<<" (2):Newton"<<endl;

cout<<"输入你的选择:";

cin>>choice;//取得用户的选择项

if(choice==2)

{

cout<<"你选择了牛顿插值计算方法,其结果为:";

y=Newton(x,count);break;//调用相应的处理函数

}

if(choice==1)

{

cout<<"你选择了拉格朗日插值计算方法,其结果为:";

y=lagrange(x,count);break;//调用相应的处理函数

}

if(choice==0)

break;

system("cls");

cout<<"输入错误!!!!"<<endl;

}

cout<<x<<" , "<<y<<endl;//输出最终结果

}

根据线性插值法求得分,如何设置公式?

=IF(A1>480,100+ROUND((A1-480)/200*50,2),IF(A1>=260,60+ROUND((A1-260)/220*40,2),0))