c语言插值函数lag12 c语言插值函数库

拉格朗日插值法用C语言表示

我的程序是牛顿插值和拉格朗日插值合起来,你自己看下,用的是C++

创新互联建站专注于喀左企业网站建设,成都响应式网站建设公司,成都商城网站开发。喀左网站建设公司,为喀左等地区提供建站服务。全流程按需策划设计,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务

#include iostream

#include iomanip

#include stdlib.h

using namespace std;

#define N 100

void lagrange()

{

int n,k,m,q=1;

float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;

cout"请输入X的个数:";

cinn;

for(k=0;k=n-1;k++)

{

cout"请输入X"k"的值:";

cinx[k];

cout"请输入Y"k"的值:";

ciny[k];

}

system("cls");

cout"则Xi与Yi表格如下:"endl;

cout"Xi"" ";for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)x[k];

coutendl;

cout"Yi"" ";for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)y[k];

coutendl;

while(q)

{

cout"请输入所求x的值:";

cinxx;

while(xxx[k-1]||xxx[0])

{

cout"输入错误,请重新输入:";

cinxx;

}

for(k=0;k=n-1;k++)

{

if(xxx[k])

{

m=k-1;

k=n-1;

}

}

yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m]));

cout"则拉格朗日分段线性插值为:"yyy1endl;

for(k=0;k=n-1;k++)

{

if(xxx[k])

{

m=k-1;

k=n-1;

}

}

if((xx-x[m])(x[m+1]-xx))m=m+1;

else m=m;

yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1]));

yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1]));

yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m]));

yyy2=yy1+yy2+yy3;

cout"则拉格朗日分段二次插值为:"yyy2endl;

cout"是否输入其余要求x的值[是(1),否(0)]:";

cinq;

}

system("cls");

}

void main()

{

lagrange();

}

高分悬赏 求三维数据点C语言插值计算程序

问题补充,因字数限制,挪到这

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 (n1)

{

For(i=0;in;i++)

{

P=1;

For(j=1;jn;j++)

{

If(i!=J)

P=p*(x-x0[j]/x0[i]-x0[j]);

}

*y=*y+p*y0[i];

Return(0);

}

Else

Return(-1);

}

3.例题。已知函数如下表所示,求x=0.472处的函数值:

X 0.46 0.47 0.48 0.49

Y 0.484655 0.4903745 0.502750 0.511668

计算这个问题的c语言程序如下:

#minclude stdio

#includeMnath.h

Main()

{

Float x0[4]={ 0.46, 0.47,0.48,0.49};

Float y0[4]={ 0.484655 ,0.4903745 ,0.502750 ,0.511668};

Float x, y;

Int n, rtn;

N=4;

X=0.472;

Rth=lagrange(x0,y0,n,x,y);

If(rtn=0)

{

Prinf(“Y(0.472)=:%f\n”,y);

}

Else

{

Prinf(“n must be larger than 1.\n”);

}

}

计算结果:Y(0.472)=:0.495553

4.问题补充

我的问题与上面的例子类似,计算三维空间一点(x,y,z)对应的函数值(Vx,Vy,Vz).不同的是自变量(point_coordinate.txt)为三维空间散乱点(不是正方体的顶点),因变量(point_data.txt)为矢量(向量 )。插值算法比较多,常数法,拉格朗日插值,埃特金插值,三阶样条插值等。最简单的就是常数法,查找离目标点(x,y,z)距离最近的已知自变量(Xi,Yi,Zi),把该点的函数值赋给目标点做函数值,求高手帮忙写写。

C语言拉格朗日插值法,求帮忙看一下程序哪里出错了,0 error但是运行出不来结果……

ncludestdio.h

#includemath.h

#includestdlib.h

#includeiostream

int main()

{

double t, z=0, tmp;

double x[12] = { 0, 8.8, 20.2, 30.0, 39.7, 48.9, 59.2, 70.0, 80.3, 90.3, 95.0, 100.0 };

double y[12] = { 110.6, 106.1, 102.2, 98.6, 95.2, 92.1, 89.4, 86.8, 84.4, 82.3, 81.2, 80.2 };

t = 45.0;

int i, j, k, p;

k = 0;

p = 12;

for (i = k; i  k + p; i++)

{

tmp = 1;

for (j = k; jp+k; j++)

if (j == i)//j=i??

tmp = tmp*(t - x[j]) / (x[i] - x[j]);//j=i?x[i] - x[j]=0?0作为分母??

z = z + tmp*y[i];//z没有初始化

}

//return z;//遇到return 后面的就不会执行

printf("%2.5f°C\n", z);

return 0;

}

用C语言实现拉格朗日插值、牛顿插值、等距结点插值算法

#includestdio.h

#includestdlib.h

#includeiostream.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次插值):";//获得插值次数

cinn;

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;

//coutf(0,j)endl;

y=y+yt;

}

return y;

}

float lagrange(float x,int count)

{

float y=0.0;

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

{

float p=1.0;//初始化p

for(int j=0;jcount;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组:";//要求用户输入数据组数

cincount;

if(count=20)

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

system("cls");

}

//获得各组数据

for(int i=0;icount;i++)

{

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

cind[i].x;

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

cind[i].y;

system("cls");

}

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

cinx;

while(1)

{

int choice=3;

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

cout" (0):退出"endl;

cout" (1):Lagrange"endl;

cout" (2):Newton"endl;

cout"输入你的选择:";

cinchoice;//取得用户的选择项

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;

}

coutx" , "yendl;//输出最终结果

}

拉格朗日插值用c语言怎么编程?各位高手帮帮忙啦

#includestdio.h

#includestring.h

#define N 100

typedef struct tag{

double x;

double y;

}POINT;

void main()

{

int i,j,n;

double x,temp,Ln=0;

POINT pt[N];

printf("请输入你要输入点的个数,,1=n=%d:\n",N);

printf("n=");

scanf("%d",n);

printf("\n");

printf("\n请输入对应的点数\n");

for(i=0;in;i++)

scanf("%lf,%lf",pt[i].x,pt[i].y);

printf("\n");

printf("输入插值点x的值:\n");

scanf("%lf",x);

printf("\n");

for(i=0;in;i++)

{

for(j=0,temp=1;jn;j++)

{

if(j!=i)

temp=temp*(x-pt[j].x)/(pt[i].x-pt[j].x);

}

Ln=Ln+temp*pt[i].y;

}

printf("输出:\nLn(%lf)=%lf\n",x,Ln);

}


当前文章:c语言插值函数lag12 c语言插值函数库
当前URL:http://ybzwz.com/article/docsjsi.html