码迷,mamicode.com
首页 > 其他好文 > 详细

牛顿插值多项式

时间:2015-10-18 01:10:36      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:

 1 //题目要求:用牛顿差商公式进行插值  
 2 #include <iostream>
 3 #include <cmath>
 4 #include <cstring>
 5 using namespace std;
 6 #define numofx 20                //定义数据量的大小 
 7 struct data{
 8     double x;
 9     double fx;                   //定义进行运算的点(x,fx) 
10 }pointdata[numofx];
11 
12 //求差商f(x0,x1,x2...xn)的公式
13 long double chashang(int n){     //计算f[x0,x1,x2...xn]
14     if(n<=0){
15         return 0;
16     }
17     
18     long double result=0;
19     for(int i=0;i<=n;i++){
20         //计算这0~n的计算值的和 
21         long double resproduct=1;
22         for(int j=0;j<=n;j++){
23             if(j!=i){
24                 resproduct*=(pointdata[i].x-pointdata[j].x);                
25             }              
26         } 
27         long double temp=pointdata[i].fx/resproduct;
28         result+=temp;
29     }
30     return result;
31 } 
32                        
33 int main(){
34     int numofpoint; 
35     cout<<"将要输入的插值点的个数为:";
36     cin>>numofpoint;
37     cout<<"请依次输入x,fx的值:\n";    
38     for(int i=0;i<numofpoint;i++){
39         cin>>pointdata[i].x>>pointdata[i].fx;
40     }
41     
42     //打印输出牛顿差商公式 ,未简约 
43     cout<<"由以上插值点计算出的牛顿插值多项式为:\n"; 
44     cout<<"f(x)="<<pointdata[0].fx;
45     for(int i=1;i<numofpoint;i++){
46         long double temp4=chashang(i);
47         if(temp4>=0){
48             cout<<"+"<<temp4<<"*";
49         }
50         else{
51             cout<<temp4<<"*";
52         }
53         
54         for(int j=0;j<i;j++){
55             cout<<"(x-"<<pointdata[j].x<<")";
56         }
57     } 
58     
59     //计算某个x的牛顿插值多项式近似值 
60     double x;
61     cout<<"\n\n请输入所求变量x的值:";
62     cin>>x;
63     cout<<"牛顿插值多项式近似结果为:";
64      
65     long double res=pointdata[0].fx;        //牛顿差商公式的f(x0)项                                            
66     for(int i=0;i<numofpoint-1;i++){        //牛顿插值多项式项f[x0,x1...xn](x-x0)(x-x1)...(x-xn) n>=1 
67 
68         long double temp=1;
69         for(int j=0;j<=i;j++){
70             temp=temp*(x-pointdata[j].x); 
71         }
72         
73         res=res+chashang(i+1)*temp;
74     }
75     cout<<res<<endl;
76 } 

 

拉格朗日插值的程序:

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4 
 5 class lagrange{
 6 
 7     private:
 8         int i,j,n;
 9         double mult,sum,z;
10         double *x,*y;
11         
12     public:
13         void interpolation(){
14             ifstream fin("a.txt");
15             fin>>n;
16             x=new double[n];
17             y=new double[n];
18             for(i=0;i<n;i++){
19                 fin>>x[i]>>y[i];
20             }
21             fin.close();
22             cout<<"\n输入需要插值的点:";
23             cin>>z;
24             sum=0.0;
25             
26             for(i=0;i<n;i++){
27                 mult=1.0;
28                 for(j=0;j<n;j++){
29                     if(j!=i){
30                         mult*=(z-x[j])/(x[i]-x[j]);
31                     } 
32                 }
33                 sum+=mult*y[i];
34             } 
35             cout<<"\n插补的值="<<sum<<endl; 
36                         
37         }
38         
39         ~lagrange(){
40             delete[] x,y;
41         }
42     
43 };
44 
45 int main(){
46     lagrange interp;
47     interp.interpolation();
48 } 

 

牛顿插值多项式

标签:

原文地址:http://www.cnblogs.com/liugl7/p/4888692.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!