6牛顿、拉格朗日或等距节点插值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int number;
cout<<"请输入x[i],y[i]的组数,number:"<<endl;//要求用户输入数据组数
cin>>number;
//获得各组数据
for(int i=0;i<number;i++)
{
cout<<"请输入第"<<i+1<<"组x的值:"<<endl;;
cin>>data[i].x;
cout<<"请输入第"<<i+1<<"组y的值:"<<endl;
cin>>data[i].y;
}
cout<<"请输入x的值:";//获得变量x的值
cin>>x;
y=Dengju(x,number);
cout<<"x="<<x<<"时,y="<<y<<endl;
}
四、运行结果
(1)拉格朗日插值
(2)牛顿插值
else
return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);
}
floatNewton(float x,int count)
{
int n;
cout<<"请输入n值(即n次插值):";//获得插值次数
cin>>n;
float t=1.0;
float y=d[0].y;
float yt=0.0;
数值分析实验报告(六)
(信息一班-----陈宣羽----20100810010107)
一、实验名称
牛顿、拉格朗日或等距节点插值
二、实验目的
用牛顿、拉格朗日或等距节点插值实现插值法
三、题目
已知插值点
利用牛顿、拉格朗日或等距节点求当x=3.6时y的值
四、程序
#include<iostream.h>
#include<math.h>
typedef struct data
{
float x;
float y;
}Data;
Data d[20];//最多二十组数据
float lagrange(float x,int count)
{
float y=0.0;
for(int k=0;k<count;k++)//这儿默认为count-1次插值
{
float p=1.0;
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;
cin>>d[i].y;
}
cout<<"请输入x的值:";//获得变量x的值
cin>>x;
cout<<"拉格朗日插值计算方法,其结果为:"<<endl;
y=lagrange(x,count);
cout<<"x="<<x<<"时,"<<"y="<<y<<endl;//输出最终结果
}
牛顿插值
#include<iostream.h>
for(int i=j;i<number;i++)
{
a[i][j]=a[i][j-1]-a[i-1][j-1];
}
}
for(int g=1;g<number;g++)
{
ji=(1.0/g)*ji*(t-g+1);
y=a[g][g]*ji;
}
return y;
}
void main()
{
double x,y;
{
double a[50][50],y=data[0].y,h,t,ji=1;
{ h=data[0].x-data[1].x;
t=(x-data[0].x)/h;
for(int k=0;k<number;k++)
{
a[k][0]=data[k].y;
}
for(int j=1;j<number;j++)
cout<<"x="<<x<<" , "<<"y="<<y<<endl;//输出最终结果ቤተ መጻሕፍቲ ባይዱ
}
等距插值
#include <iostream.h>
#include<math.h>
typedef struct data
{
double x;
double y;
}Data;
Data data[50];
double Dengju(double x,int number)
#include<math.h>
typedef struct data
{
float x;
float y;
} Data;
Data d[15];
float f(int s,int t)//牛顿插值法,用以返回插商
{
if(t==s+1)
return (d[t].y-d[s].y)/(d[t].x-d[s].x);
(3)等距插值
五、体会
牛顿、拉格朗日插值都是通过给定n+1个互异的插值节点,让你求一条n次代数曲线近似地表示待插值的函数曲线.这就叫做代数插值啦.Lagrange插值代数和Newton法插值都属于代数插值的范畴.等距插值是在以上插值的基础上利用等距节点实现的。本次实验我学会了插值的三种方法并通过实验完成了计算机上的实现。
int count;
cout<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数
cin>>count;
//获得各组数据
for(int i=0;i<count;i++)
{
cout<<"请输入第"<<i+1<<"组x的值:"<<endl;;
cin>>d[i].x;
cout<<"请输入第"<<i+1<<"组y的值:"<<endl;
for(int i=0;i<count;i++)
{
cout<<"请输入第"<<i+1<<"组x的值:";
cin>>d[i].x;
cout<<"请输入第"<<i+1<<"组y的值:";
cin>>d[i].y;
}
cout<<"请输入x的值:";//获得变量x的值
cin>>x;
y=Newton(x,count);
for(int j=1;j<=n;j++)
{
t=(x-d[j-1].x)*t;
yt=f(0,j)*t;
y=y+yt;
}
return y;
}
void main()
{
float x,y;
int count;
cout<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数
cin>>count;
相关文档
最新文档