33(插值法)牛顿插值多项式

牛顿插值多项式(插值法)

【问题描述】考虑[0,3]内的函数y=f(x)=cos(x)。利用多个(最多为6个)节点构造牛顿插值多项式。

【输入形式】在屏幕上依次输入在区间[0,3]内的一个值x*,构造插值多项式后求其P(x*)值,和多个节点的x坐标。

【输出形式】输出牛顿插值多项式系数向量,差商矩阵,P(x*)值(保留6位有效数字),和与真实值的绝对误差(使用科学计数法,保留小数点后6位有数字)。

【样例1输入】

0.8

0 0.5 1

【样例1输出】

-0.429726

-0.0299721

1

1 0 0

0.877583 -0.244835 0

0.540302 -0.674561 -0.429726

0.700998

4.291237e-03

【样例1说明】

输入:x*为0.8,3个节点为(k, cos(k)),其中k = 0, 0.5, 1。

输出:

牛顿插值多项式系数向量,表示P2(x)=-0.429726x^2 - 0.0299721x + 1;

3行3列的差商矩阵;

当x*为0.8时,P2(0.8)值为0.700998

与真实值的绝对误差为:4.291237*10^(-3)

【评分标准】根据输入得到的输出准确
33(插值法)牛顿插值多项式_第1张图片

33(插值法)牛顿插值多项式_第2张图片

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
double xx;//待求值0.8
int n;//n=len(x)就是3  
int k;
double x[100];//存放几个点的x值  0 0.5 1 
double y[100];//存放数组x[]各数的cos值 
double d[100][100]={0};//差商矩阵
vector<double>c;//存放系数向量 
void newton()
{
	for(int i=0;i<n;i++)//差商矩阵第一列初始化
	{
		d[i][0]=y[i];
	 } 
	//计算差商矩阵
	for (int i = 1; i < n; i++)//i表示列
	{
		for (int j = i; j < n; j++)//j表示行
		{
			//差商矩阵是一列一列更新的
			d[j ][i ] = (d[j ][i-1] - d[j-1][i-1]) / (x[j] - x[j -i]);
		}
	}
    //计算差值多项式系数向量 
    c.push_back(d[n-1][n-1]);
    for(int i=n-2;i>=0;i--)
    {
    	double e=-x[i];
    	vector<double> nc=c;
    	int m=c.size();
    	nc.push_back(0);
    	for(int j=0;j<m;++j)
    	{
    		nc[j+1]+=c[j]*e;
		}
		c=nc;
		c[m]+=d[i][i];
	}
	//输出系数向量
	for(int i=0;i<n;i++)
	{
		cout<<c[i]<<endl;
	}
	//输出差商矩阵
	for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<d[i][j]<<" ";
        }
        cout<<endl;
    } 
    
	//计算P(xx)
	double s = 0;
    for(int i=0;i<n;i++)
    {
        s += c[i] * pow(xx, n - i - 1);
    }
    cout<<s<<endl; 
	double ss=cos(xx);
	double err=abs(s-ss);
	printf("%.6e",err);
}
int main()
{
	cin>>xx;
	double number;
	//输入x值  例:0 0.6 1.2 
	while(cin>>number)
	{
		x[n++]=number;
		if(cin.get()=='\n')
			break;
	} 
	for(int i=0;i<n;i++)//计算y=cos(x)
	{
		y[i]=cos(x[i]);
	}
	newton(); 
 } 

你可能感兴趣的:(计算方法,算法)