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

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

#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,返回内插值,公式应该怎么写呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10219620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存