newton插值 lagrange 插值

时间:2021-01-22 20:39:53

Code:
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. typedef  struct data   
  5. {   
  6.    float x;   
  7.    float y;   
  8. }Data ;   
  9. Data d[20];   
  10.   
  11. /*****************Newton插值法*************/  
  12. float getDivDiference(int s,int t)//Define the function of get divided difference   
  13. {   
  14.     if(t == s+1)   
  15.     {   
  16.         return (d[t].y-d[s].y)/(d[t].x-d[s].x);   
  17.     }   
  18.     else  
  19.     {   
  20.         return (getDivDiference(s+1,t)-getDivDiference(s,t-1))/(d[t].x-d[s].x);   
  21.     }   
  22. }   
  23. float newtonfoo(float x,int count)   
  24. {   
  25.   int n;   
  26.   for(; ; )   
  27.     {   
  28.        cout<<"请输入n 的值(即插值次数):";   
  29.        cin>>n;   
  30.        if(n <= count -1)   
  31.        {   
  32.             break;   
  33.        }   
  34.        else  
  35.        {   
  36.            cout<<"Error ,please input another iterator value "<<endl;   
  37.        }   
  38.     }   
  39.     float t =1.0;   
  40.     float y = d[0].y;   
  41.     float yt = 0.0;   
  42.     for(int j = 1; j<= n; j++)   
  43.     {   
  44.         t=(x-d[j-1].x)*t;   
  45.         yt = getDivDiference(0,j)*t;   
  46.         y=y+yt;   
  47.     }   
  48.     return y;   
  49. }   
  50.   
  51. /**Newton插值法(end*************/  
  52.   
  53. /*****************lagrange插值法************/  
  54. float lagrangefoo(float x,int count)   
  55. {   
  56.     float y =0.0;   
  57.     for(int k =0;k<count; k++)   
  58.     {   
  59.         float p=1.0;   
  60.         for(int j = 0; j<count; j++)   
  61.         {   
  62.             if(k==j)   
  63.             {   
  64.                 continue;   
  65.             }   
  66.             else  
  67.             {   
  68.                p = p*(x-d[j].x)/(d[k].x-d[j].x);   
  69.             }   
  70.         }   
  71.         y = y+ p*d[k].y;   
  72.     }   
  73.     return y;   
  74. }   
  75. /*****lagrange插值法(end******/  
  76. float initfooArray()   
  77. {   
  78.       int count ;   
  79.       while (1)   
  80.       {   
  81.           cout<<"请输入弦x[i],y[i]的组数,不得超过30组:";   
  82.           cin>>count;   
  83.           if(count<=30)   
  84.           break;   
  85.       }   
  86.       for(int i= 0; i<count; i++)   
  87.       {   
  88.           cout<<"请输入第"<<i+1<<"组x的值:";   
  89.           cin>>d[i].x;   
  90.           cout<<"请输入第"<<i+1<<"组y的值:";   
  91.           cin>>d[i].y;   
  92.       }   
  93.       return count;   
  94. }   
  95. void help()   
  96. {   //cout<<" Define what you want do!/n";   
  97.     cout<<"*****Created by husiwen******/n";   
  98.     cout<<"--------------------------------/n";   
  99.     cout<<"**  *1.Newton插值法           **/n";   
  100.     cout<<"**  *2.lagrange插值法         **/n";   
  101.     cout<<"**  *0.退出                   **/n";   
  102.     cout<<"--------------------------------/n";   
  103. }   
  104. void seek()   
  105. {   
  106.   int flag;   
  107.   cout<<"请选择你要进行的操作:";   
  108.   cin>>flag;   
  109.   while(0!=flag)   
  110.   {   
  111.       switch(flag)   
  112.       {   
  113.           case  1:   //Newton插值法   
  114.           {   
  115.               cout<<"    你选择的是Newton插值法"<<endl;   
  116.                 float newtonnum ,calcx,newtonResult;   
  117.                 newtonnum = initfooArray();   
  118.                 cout<<"请输入你要计算x的值:";   
  119.                 cin>>calcx;   
  120.                 newtonResult=newtonfoo(calcx,newtonnum);   
  121.                 cout<<"变量x="<<calcx<<"的Newton插值结果为:";   
  122.                 cout<<newtonResult<<endl;   
  123.           }   
  124.           flag = 0;   
  125.           seek();   
  126.           break;   
  127.           case  2:   //lagrange插值法   
  128.           {   
  129.               cout<<"  你选择的是lagrange插值法"<<endl;   
  130.                float lagnum,calcx,lagResult;   
  131.                lagnum = initfooArray();   
  132.                cout<<"请输入你要计算x的值:";   
  133.                cin>>calcx;   
  134.                lagResult=lagrangefoo(calcx,lagnum);   
  135.           }   
  136.           flag = 0;   
  137.           seek();   
  138.           break;   
  139.           default:   
  140.           cout<<"erro/n";   
  141.           seek();// 输入错误 ,再次调用 seek 函数 提示用户输入选择操作;   
  142.           break;   
  143.       }   
  144.   }   
  145.   return ;   
  146. }   
  147. int main()   
  148. {   
  149.     help();   
  150.     seek();   
  151.     return 0;   
  152. }