现在的位置: 首页 > 综合 > 正文

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

2019年02月20日 ⁄ 综合 ⁄ 共 1026字 ⁄ 字号 评论关闭
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 100
double 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,按照一定的顺序排列,错了~

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

【上篇】
【下篇】

抱歉!评论已关闭.