/**
  牛顿插值法

  牛顿递推公式:Nk(x) = Nk-1(x) + tk(x) / f [x0,x1,..,xk]

  基函数递推公式: ti (x)  = (x - x i ) * ti-1 (x) 

  属性:插值计算法
  
   《数值计算方法与算法》第二版 - 科学出版社 P25

  代码维护:2007.04.18   pengkuny
**/

#include <iostream>
using namespace std;

float NewtonInterpolate(float px[], float py[], int n, float x)
{//px,py;插值点(Xi,Yi) n:插值点个数  x:待计算的点
    float *= new float[n+1];

    
//计算差商表个g[k],k=0,1,,n
    for (int i=0; i<n+1; i++)
    
{
        g[i] 
= py[i];
    }

    
for (int k=1; k<n+1; k++)
    
{
        
for (int i=n; i>=k; i--)
        
{
            g[i] 
= (g[i] - g[i-1]) / (px[i] - px[i-k]);//g[i]用来暂时存放f[X(i-k), X(i)]
        }

    }


    
float t = 1;//基函数
    float newton = py[0];
    
for (int i=1; i<n; i++)
    
{
        t 
= (x - px[i-1]) * t;//基函数的递推式
        newton = newton +  t * g[i];
    }


    delete g;
    
return newton;
}


int main()
{
    
float x;//插值
    float px[10];//已知(x0,y0),(x1,y1)
    float py[10];
    
int n;//输入已知插值组数

    cout
<<"输入插值组数:"<<endl;
    cin
>>n;
    cout
<<"输入"<<n<<"组已知插值数(X,Y)"<<endl;
    
for(int i=0; i<n; i++)
    
{
        cin
>>px[i]>>py[i];
    }

    cout
<<"输入插值:"<<endl;
    cin
>>x;

    cout
<<"牛顿插值结果:"<<NewtonInterpolate(px, py, n, x)<<endl;

    system(
"pause");
    
return 0;
}
posted on 2007-04-20 10:55 哈哈 阅读(3441) 评论(5)  编辑 收藏 引用

评论:
# re: 牛顿插值法 2008-06-30 17:46 | trt
好  回复  更多评论
  
# re: 牛顿插值法 2008-07-09 15:15 | 法庭突
执行错误啊,大哥啊
  回复  更多评论
  
# re: 牛顿插值法 2008-07-09 20:03 | pengkuny
@法庭突
没有啊 我又检查了一遍  回复  更多评论
  
# re: 牛顿插值法 2008-10-26 21:03 | 莫非
抗议!
{//px,py;插值点(Xi,Yi) n:插值点个数 x:待计算的点
这个N根本就不是插值点的个数!是插值点的个数再减1!  回复  更多评论
  
# re: 牛顿插值法 2009-12-14 13:01 | else
for (int i=0; i<n+1; i++)
{
g[i] = py[i];
}

====

请问这里的 g[n] 是什么?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理