1-拉格朗日插值法

作者在 2008-05-10 21:03:45 发布以下内容

#include "stdio.h"
#include "conio.h"
#define N 4
main()
{
    double x[N+1] = {0.4, 0.55, 0.8, 0.9, 1};
    double y[N+1] = {0.41075, 0.57815, 0.88811, 1.02652, 1.17520};
    double varx = 0.5;
    int checkvalid ( double x[], int n );
    double Lagrange (double x[], double y[], double varx, int n );
    void Print(double x[], double y[]);

    if (checkvalid ( x, N ) == 1 )
    {  printf("Ln(x)  =\n");
       Print( x , y);
       printf("\n\n插值结果: P(%f)=%f\n", varx , Lagrange( x , y, varx ,N));
    }
    else
       printf ("输入的插值节点的x值必须互异!");
      
    getch();
}

int checkvalid ( double x[], int n )
{

    int i , j;
    n = 4;

    for( i = 0;i <=n; i++)
      for( j = 0; j <= n; j++ )
        if((i!=j) && (x[i] == x[j]) )
           return -1;
          
    return 1;
}

void Print(double x[], double y[])
{
    int j,k;double p,q ;
    int n = 4;
    for(k = 0; k <= n; k++)
    {
        p =1.0;
        for( j = 0; j <= n; j++ )
        {
            if(j!=k)
              p = p*(x[k]-x[j]);
        }
        q = y[k]/p;
        printf("\t%f",q);
        for( j = 0; j <= n; j++ )
        {
            if(j!=k)
              printf("*(x-%f)",x[j]);
        }
        if(k!=n)
          printf("+\n");
    }
}

double Lagrange (double x[], double y[], double varx, int n )
{
    double sum = 0.0, p ;
    int j , k ;
    n = 4 ;
   
    for( k = 0;k <= n; k++ )
    {
        p = 1.0;
        for( j = 0;  j <= n; j++ )
        {
            if(j!=k)
             p = p*(    (varx - x[j])/(x[k] - x[j])   );
        }

        sum = sum + y[k]*p;
    }
    return (sum);
}

大小: 1.66 KB
版本: V1.0
出品: 本站原创
来源: 本地
语言: 简体中文
授权: 免费
默认分类 | 阅读 951 次
文章评论,共0条
游客请输入验证码
文章分类
文章归档