拉格朗日插值的实现
程序员文章站
2022-06-07 09:58:44
...
- 问题描述:
对于要求选取11个等距插值节点,用拉格朗日插值,计算x为0.5, 4.5处的函数值并将结果与精确值进行比较。
输入:区间长度,n(即n+1个节点),预测点
输出:预测点的近似函数值,精确值,及误差
- 朗格朗日插值公式:
- 朗格朗日插值公式流程图:
- 程序实现
#include <iostream>
#include <cstdio>
using namespace std;
//产生的节点数
int N;
//保存生成的节点横坐标
double dataX[1000];
//保存生成的节点纵坐标
double dataY[1000];
//生成坐标点
void produceData(double startX,double endX,int N);
//计算误差
double calcDeviation(double accuracy,double calcValue);
//拉格朗日计算插值
double calc(double x);
int main()
{
double x;
double startX,endX;
char ch = 'n';
cout<<"插值函数为:1/(1+x*x)"<<endl;
cout<<"请输入插值数:";
cin>>N;
cout<<"请输入左右区间范围:";
cin>>startX;
cin>>endX;
produceData(startX,endX,N);
while(ch != 'y')
{
cout<<"请输入要计算的x值:";
cin>>x;
double correctValue = 1.0/(1 + x*x);
double calcValue = calc(x);
cout<<"精确值为:"<<correctValue<<" "<<"拉格朗日插值结果为:"<<calcValue<<" "<<"误差为:"<<calcDeviation(correctValue,calcValue)<<endl;
cout<<"是否继续?按y退出:";
cin>>ch;
}
return 0;
}
//生成坐标点
void produceData(double startX,double endX,int N)
{
double x=startX;
double dX = (endX - startX) /(N-1) ;
dataX[0] = x;
dataY[0] = 1.0 / (1 + x*x);
for(int i=1;i<N;i++)
{
x+=dX ;
dataX[i] = x;
dataY[i] = 1.0 / (1 + x*x);
}
}
//计算误差
double calcDeviation(double accuracy,double calcValue)
{
return (accuracy - calcValue);
}
//拉格朗日计算插值
double calc(double x)
{
double result=0;
for(int k=0;k<N;k++)
{
double temp = dataY[k];
for(int j = 0;j < N;j++)
{
if(k!=j)
{
temp = temp*(x-dataX[j]);
temp = temp/(dataX[k]-dataX[j]);
}
}
result += temp;
}
return result;
}
- 运行截图
推荐阅读
-
BZOJ3453: tyvj 1858 XLkxc(拉格朗日插值)
-
BZOJ2655: calc(dp 拉格朗日插值)
-
拉格朗日插值学习小结
-
python数据分析与挖掘实战---拉格朗日插值法
-
BZOJ4559: [JLoi2016]成绩比较(dp 拉格朗日插值)
-
洛谷P4593 [TJOI2018]教科书般的*(拉格朗日插值)
-
计算方法实验(一):拉格朗日插值多项式
-
插值多项式的拉格朗日形式
-
插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值
-
lagrange插值法:求拉格朗日插值多项式matlab实现(内附代码及例题)