| 導購 | 订阅 | 在线投稿
分享
 
 
 

牛顿和拉格朗日插值算法

2008-06-01 02:11:12  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
  /*近日浏览文章时发现在这个网站上有好几篇问关于牛顿插值和拉格朗日插值的文章。本人正好写了这个代码,将它公布,希望对一些朋友有帮助。如程序中有什么问题请与我联系。QQ:421404493E-mail:wbaobao#zj.com*/

  //编译平台:2000+vc6.0

  //实验一

  //作者:计算机科学与技术02级2班宝宝421404493

  #include<stdio.h>

  #include<stdlib.h>

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

   cin>>n;

   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;

   //cout<<f(0,j)<<endl;

   y=y+yt;

  }

  return y;

  }

  float lagrange(float x,int count)

  {

  float y=0.0;

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

  {

   float p=1.0;//初始化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+p*d[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;//输出最终结果

  

  }
 
 
 
/*近日浏览文章时发现在这个网站上有好几篇问关于牛顿插值和拉格朗日插值的文章。本人正好写了这个代码,将它公布,希望对一些朋友有帮助。如程序中有什么问题请与我联系。QQ:421404493 E-mail:wbaobao#zj.com*/ //编译平台:2000+vc6.0 //实验一 //作者:计算机科学与技术02级2班 宝宝 421404493 #include<stdio.h> #include<stdlib.h> #include<iostream.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次插值):";//获得插值次数 cin>>n; 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; //cout<<f(0,j)<<endl; y=y+yt; } return y; } float lagrange(float x,int count) { float y=0.0; for(int k=0;k<count;k++)//这儿默认为count-1次插值 { float p=1.0;//初始化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+p*d[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;//输出最终结果 }
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号 wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味著赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有