Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210184
  • 博文数量: 89
  • 博客积分: 2531
  • 博客等级: 少校
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-19 10:10
文章分类
文章存档

2011年(6)

2010年(26)

2009年(35)

2008年(22)

我的朋友
最近访客

分类: LINUX

2009-10-27 23:19:53

  插值法是一种古老的数学方法,它来自于生产实践,但它的基本理论和结果却是在微积分产生之后才逐步完善的,特别是在计算机广泛使用之后,应用很快增多,在航空,造船,精密机械加工中运用广泛。
  插值法有很多种,像Lagrange插值,Newton插值,和Hermite插值等等。今天介绍的是Lagrange插值的算法实现。有必要知道一些基础知识。

对于个互不相同的插值节点,由次插值多项式的惟一性,可对每个插值节点作出相应的次插值基函数

  要求,的零点,因此可设

  

  由代入,得到

      (5.5)

  作其组合:

                                (5.6)

  那么不高于次且满足,故就是关于插值点的插值多项式,这种插值形式称为拉格朗日插值多项式。称为关于节点的拉格朗日基函数。

据此得到算法如下:


//Author:DengJin

#include<stdio.h>
#include<stdarg.h>
#include<stdlib.h>

double Lagrange(double x,/*需要知道函数值的节点坐标*/
                int n,/*已知坐标的个数*/
                ...);/*可变动参数获取各已知节点和其值*/
                
int
main(void){
    
     /*for testing*/
     double value = Lagrange(1.5,5,1.0,1.3,1.6,1.9,2.2,0.7651977,0.6200860,0.4554022,0.2818186,0.1103623);
     /*以上用f(1.0) = 0.7651977
     f(1.3) = 0.6200860等等进行测试*/

     printf("%9.7lf\n",value);
     
     system("pause");
     return EXIT_SUCCESS;
}

double Lagrange(double x,
                int n,
                ...){

    int i = 0,j = 0;
    double *px = malloc(sizeof(double)*n);
    double *py = malloc(sizeof(double)*n);
    double result = 0;
    double *ppx = px,*ppy = py;
    double numerator = 1,denominator = 1;
    va_list arg;
    
    va_start(arg,n);
    
    for(i=0;i<n;i++)
        *ppx++ = va_arg(arg,double);/*获取已知节点X坐标 */
    
    for(i=0;i<n;i++)
        *ppy++ = va_arg(arg,double);/*获取已知节点函数值 */
    
    va_end(arg);
    
    for(i=0;i<n;i++){
            numerator = denominator = 1;
        for(j=0;j<n;j++){
            if(i == j) continue;
            numerator *= (x-px[j]);
            denominator *= (px[i]-px[j]);
            /*printf("px[i] = %9.7lf px[j] = %9.7lf\n",px[i],px[j]);
            printf("fenzi = %9.7lf fenmu = %9.7lf\n",fenzi,fenmu);*/

        }
        result += numerator/denominator*py[i];
    }
    
    
    return result;

}


阅读(6581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~