扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
我的程序是牛顿插值和拉格朗日插值合起来,你自己看下,用的是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();
}
问题补充,因字数限制,挪到这
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),把该点的函数值赋给目标点做函数值,求高手帮忙写写。
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;
}
#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;//输出最终结果
}
#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);
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流