#include<stdioh>
#include<stdlibh>
#include<iostreamh>
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=10;
float y=d[0]y;
float yt=00;
//计算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=00;
for(int k=0;k<count;k++)//这儿默认为count-1次插值
{
float p=10;//初始化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+pd[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;//输出最终结果
}
问题补充,因字数限制,挪到这
1拉格朗日插值简介:
对给定的n个插值节点x1,x2,…,xn,及其对应的函数值y1=f(x1), y2=f(x2),…, yn=f(xn);使用拉格朗日插值公式,计算在x点处的对应的函数值f(x);
2一维拉格朗日插值c语言程序:
Int lagrange(x0, y0, n, x, y)
Float xo[], yo[], x;
Int n;
Float y
{
Int i, j;
Float p;
y=0;
If (n>1)
{
For(i=0;i<n;i++)
{
P=1;
For(j=1;j<n;j++)
{
If(i!=J)
P=p(x-x0[j]/x0[i]-x0[j]);
}
y=y+py0[i];
Return(0);
}
Else
Return(-1);
}
3例题。已知函数如下表所示,求x=0472处的函数值:
X 046 047 048 049
Y 0484655 04903745 0502750 0511668
计算这个问题的c语言程序如下:
#minclude stdio
#includeM<nathh>
Main()
{
Float x0[4]={ 046, 047,048,049};
Float y0[4]={ 0484655 ,04903745 ,0502750 ,0511668};
Float x, y;
Int n, rtn;
N=4;
X=0472;
Rth=lagrange(x0,y0,n,x,&y);
If(rtn=0)
{
Prinf(“Y(0472)=:%f\n”,y);
}
Else
{
Prinf(“n must be larger than 1\n”);
}
}
计算结果:Y(0472)=:0495553
4问题补充
我的问题与上面的例子类似,计算三维空间一点(x,y,z)对应的函数值(Vx,Vy,Vz)不同的是自变量(point_coordinatetxt)为三维空间散乱点(不是正方体的顶点),因变量(point_datatxt)为矢量(向量 )。插值算法比较多,常数法,拉格朗日插值,埃特金插值,三阶样条插值等。最简单的就是常数法,查找离目标点(x,y,z)距离最近的已知自变量(Xi,Yi,Zi),把该点的函数值赋给目标点做函数值,求高手帮忙写写。
本问题有些难度,且内插有两种不同的算法,结果会有些差别。
第一种算法,根据行和列两个方向分别在行和列找到在哪两个数据中间,取4个数据进行内插,一般的手工计算法就是这样的,但按这种算法,在Excel中却比下面第二种算法要复杂得多。
公式:
B13=TREND(CHOOSE({1;2},TREND(CHOOSE({1;2},INDEX(B2:C10,MATCH(A13,A2:A10),MATCH(B12,B1:C1)),INDEX(B2:C10,MATCH(A13,A2:A10)+1,MATCH(B12,B1:C1))),SUBTOTAL(9,OFFSET(A1,ROW(INDIRECT(MATCH(A13,A2:A10)&":"&MATCH(A13,A2:A10)+1)),)),A13),TREND(CHOOSE({1;2},INDEX(B2:C10,MATCH(A13,A2:A10),MATCH(B12,B1:C1)+1),INDEX(B2:C10,MATCH(A13,A2:A10)+1,MATCH(B12,B1:C1)+1)),SUBTOTAL(9,OFFSET(A1,ROW(INDIRECT(MATCH(A13,A2:A10)&":"&MATCH(A13,A2:A10)+1)),)),A13)),SUBTOTAL(9,OFFSET(A1,,ROW(INDIRECT(MATCH(B12,B1:C1)&":"&MATCH(B12,B1:C1)+1)))),B12)
同时按Ctrl+Shift+Enter三键输入数组公式
第二种算法,把二维数据视为两个方向都是线性的,直接用Excel的回归函数来计算,相对于第一种算法要简单很多,当然也是有难度的。本算法更为合理,因为它兼顾全部数据影响。
公式:
B14=TREND(CHOOSE({1,2},TREND(OFFSET(A2:A10,,MATCH(B12,B1:C1)),A2:A10,A13),TREND(OFFSET(A2:A10,,MATCH(B12,B1:C1))+1,A2:A10,A13)),B1:C1,B12)
同样数组公式。
第二种方法的值大很多,是因为数据源A列值越大,对应的数据增加越快,所以数据参与插值回归计算时,加大了下面数值较大的权重。
PS:上面两种计算方法的公式都可根据A列或第行数据的多少来修改公式,如第1行还有多列时,只要修改公式中的C列到最后的列标号,A列数据也一样,只要修改公式中的行号。
以如此难度的公式,加上对内插计算的讲解,也该加些悬赏吧。如果当面传授,周末这顿晚饭也应该没问题吧,哈哈。
以上就是关于用C语言编一个线性插值的小程序,很着急全部的内容,包括:用C语言编一个线性插值的小程序,很着急、高分悬赏 求三维数据点C语言插值计算程序、excel查找数值范围并内插计算 A=1.4,B=10.25,返回内插值,公式应该怎么写呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)