数值分析/计算方法
仅供参考
#include <iostream>
using namespace std;
//定义拉格朗日插值多项式函数,在输入想预测的自变量后返回预测值
//先定义x数组和y数组,num为想要预测的自变量x值,n为拉格朗日多项式次数、
double Lagrange(double *x,double *y,double num,int n)
{
if((sizeof(x)/sizeof(x[0]))!=(sizeof(y)/sizeof(y[0])))//数组所占字节数除以每个元素所占字节数等于数组长度
{
cout<<"x数组,y数组长度不一致,请重新输入"<<endl;
return 99999;
}
if(sizeof(x)/sizeof(x[0])>n)
{
return 99999;
}//给定n+1个节点最多构造出n次拉格朗日插值基函数
double *A =new double[n+1];//用指针定义一个数组,存放拉格朗日的n次基本插值多项式
int k,j;
for(k=0;k<=n;k++)
{
double z=1;
for(int j=0;j<=n;j++)
{
if(j==k){continue;}
z=z*(num-x[j])/(x[k]-x[j]);
}
A[k]=z;
}//构造拉格朗日插值节点基函数
double Ln=0;
for(int k=0;k<=n;k++)
{
Ln=Ln+A[k]*y[k];
}
return Ln;
}
int main()//该程序未写截断误差,如果要算,用真值减去预测值即可
{
char ch='n';
while(ch != 'q')//可以循环多次,根据不同数量节点算预测的值
{
int n;
cout<<"请输入拉格朗日多项式次数(节点数减一)";
cin>>n;
double x[100];
double y[100];
int i,j;
cout<<"请依次输入"<<n+1<<"个节点的横纵坐标"<<endl;
for(i=0;i<n+1;i++)
{
cin>>x[i];
cin>>y[i];
}
double num;
cout<<"请输入要预测的自变量的横坐标";
cin>>num;
cout<<"预测值为:"<<Lagrange(x,y,num,n)<<endl;
cout<<"是否继续?按q退出,按其他字母继续";
cin>>ch;
}
system("pause");
return 0;
}