插值方法实现(拉格朗日插值和牛顿插值)

来源:互联网 发布:qq三国js技能必学 编辑:程序博客网 时间:2024/05/16 10:24
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<stack>#include<string>#include<cmath>#include<algorithm>using namespace std;#define maxn 100double Langrange(double x[],double y[],int n,double xx){double ans=0;for(int i=0;i<=n;i++){double tmp=1;for(int j=0;j<=n;j++){if(i==j)continue;tmp*=(xx-x[j])/(x[i]-x[j]);}ans+=tmp*y[i];}return ans;}double Newton(double x[],double y[],int n,double xx){double ma[maxn][maxn];memset(ma,0,sizeof(ma));for(int i=0;i<=n;i++)ma[i][0]=y[i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ma[i][j]=(ma[i][j-1]-ma[i-1][j-1])/(x[i]-x[i-j]);double ans=0,tmp=1;for(int i=0;i<=n;i++){ans+=tmp*ma[i][i];tmp*=(xx-x[i]);}return ans;}double x[maxn],y[maxn];int main(){int n;while(true){scanf("%d",&n);if(n==0)break;for(int i=0;i<=n;i++)scanf("%lf",&x[i]);for(int i=0;i<=n;i++)scanf("%lf",&y[i]);double xx;scanf("%lf",&xx);double ans1=Langrange(x,y,n,xx);double ans2=Newton(x,y,n,xx);printf("%lf %lf\n",ans1,ans2);}return 0;}

今天在马原课上写的。。。。。

代码里面的n代表的是x0,x1,x2,x3……xn的n

刚开始以为牛顿插值前提必须是x0,x1,x2……xn,按照一定的顺序排列,错了~

实测数据不多。估计会有错误。

0 0