拉格朗日插值多项式的算法就比前面的简单些,30行代码左右可以搞定,不过为了通俗易懂,这里我写了比较多的注释.题目:已知下列函数表:
x | 0.56160 | 0.56280 | 0.56401 | 0.56521 |
y | 0.82741 | 0.82659 | 0.82577 | 0.82495 |
具体思路:依据书上的解题步骤,首先我们输入插值点的个数n,然后我们输入插值点的信息,x值是多少,y值是多少,我们用一个结构体定义,最后依据拉格朗日插值公式转化成相应的代码即可.
下面上代码:
/*************************************************************************
> File Name: Lagrange.c
> Author:chendiyang
> School:WUST_CST_1501班
> Myblog:www.chendsir.com
> Mail:1441353519@qq.com
> Created Time: 2017年04月19日 星期三 8时06分35秒
************************************************************************/
#include <stdio.h>
#define MAX 20
//输入点的结构
typedef struct stPoint
{
double x;
double y;
} Point;
int main()
{
int n;
int i,j;
Point points[MAX];
double x,tmp,lagrange=0;//这个x是你将要计算的f(x)插值点,tmp是拉格朗日基函数,larange是根据拉格朗日函数得出f(x)的值
printf("请输入被插值点的个数:(它是从0开始的,所以输入3代表4个点)");
scanf("%d",&n);
if(n>MAX)
{
printf("您输入的个数过多.");
return 1;
}
if(n<=0)
{
printf("您输入的点数太少.");
return 1;
}
//输入插值点的x值和y值
printf("请输入插值点的x值和y值:\n");
for(i=0;i<=n;i++)
scanf("%lf%lf",&points[i].x,&points[i].y);
//输入计算拉格朗日插值多项式的x值
printf("\n请输入计算拉格朗日插值多项式的x值:");
scanf("%lf",&x);
//利用拉格朗日插值公式计算函数x值的对应f(x)
for(i=0;i<=n;i++)
{
for(j=0,tmp=1;j<=n;j++)
{
if(j==i) //去掉xi与xj相等的情况
continue; //范德蒙行列式下标就是j!=k,相等分母为0就没意义了
tmp=tmp*(x-points[j].x)/(points[i].x-points[j].x);//这个就是套公式,没什么难度
//tmp是拉格朗日基函数
}
lagrange=lagrange+tmp*points[i].y; //最后计算基函数*y,全部加起来,就是该x项的拉格朗日函数了
}
//拉格朗日函数计算完毕,代入所求函数x的值,求解就ok了
printf("\n拉格朗日函数f(%lf)=%lf\n",x,lagrange);
return 0;
}
运行结果如图:
程序运行的结果:当x的值是0.5635时的插值函数值是:0.826116,不知道是对是错,有心人可以手算帮忙验证一下..结果不对的话可以给我留言,方便及时改正.