当前位置:首页 > 6牛顿、拉格朗日或等距节点插值
数值分析实验报告(六)
(信息一班-----陈宣羽----20100810010107)
一、实验名称
牛顿、拉格朗日或等距节点插值 二、实验目的
用牛顿、拉格朗日或等距节点插值实现插值法 三、题目 已知插值点
?f(?1)?2??f(1)?1 ?f(2)?1?利用牛顿、拉格朗日或等距节点求当x=3.6时y的值 四、程序
#include
float x; float y; }Data;
Data d[20];//最多二十组数据 float lagrange(float x,int count) {
float y=0.0;
for(int k=0;k float p=1.0; for(int j=0;j 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; cout<<\请输入x[i],y[i]的组数,不得超过20组:\要求用户输入数据组数 cin>>count; //获得各组数据 for(int i=0;i cout<<\请输入第\组x的值:\ cin>>d[i].x; cout<<\请输入第\组y的值:\ cin>>d[i].y; } cout<<\请输入x的值:\获得变量x的值 cin>>x; cout<<\拉格朗日插值计算方法,其结果为:\ y=lagrange(x,count); cout<<\时,\输出最终结果 } 牛顿插值 #include 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); else return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x); } float Newton(float x,int count) { int n; cout<<\请输入n值(即n次插值):\获得插值次数 cin>>n; float t=1.0; float y=d[0].y; float yt=0.0; 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; for(int i=0;i cout<<\请输入第\组x的值:\ cin>>d[i].x; cout<<\请输入第\组y的值:\ cin>>d[i].y; } cout<<\请输入x的值:\获得变量x的值 cin>>x; y=Newton(x,count); cout<<\输出最终结果 } 等距插值 #include double x; double y; }Data; Data data[50]; double Dengju(double x,int number) { 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 return y; } void main() { double x,y; int number; cout<<\请输入x[i],y[i]的组数,number:\要求用户输入数据组数 cin>>number; //获得各组数据 for(int i=0;i cout<<\请输入第\组x的值:\ cin>>data[i].x; cout<<\请输入第\组y的值:\ cin>>data[i].y; } cout<<\请输入x的值:\获得变量x的值 cin>>x; y=Dengju(x,number); cout<<\时,y=\ } 四、运行结果 (1)拉格朗日插值 (2)牛顿插值 (3)等距插值 五、体会 牛顿、拉格朗日插值都是通过给定n+1个互异的插值节点,让你求一条n次代数曲线近似地表示待插值的函数曲线.这就叫做代数插值啦.Lagrange插值代数和Newton法插值都属于代数插值的范畴.等距插值是在以上插值的基础上利用等距节点实现的。本次实验我学会了插值的三种方法并通过实验完成了计算机上的实现。
共分享92篇相关文档