c++利用拉格朗日插值算法得到预测值与真实值相差较大
#include<iostream>
using namespace std;
int main()
{
double PI = 3.1415926535897932;
int n;
cout << "请输入您要输入的插值个数" << endl;
cin >> n;
double* a = new double[n];
double* b = new double[n];
cout << "请依次输入点的坐标值" << endl;
for (int i = 0; i < n; i++)
{
cin >> a[i] >> b[i];
}
cout << "您输入的点坐标分别为" << endl;
for (int i = 0; i < n; i++)
{
cout << "(" << a[i] << "," << b[i] << ") ";
}
double x;
cout << "请输入您要预测的x的值" << endl;
cin >> x;
double y=0;
double z = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j != i)
{
z *= (x - a[j]) / (a[i] - a[j]);
}
}
y += z * b[i];
}
cout << "预测值为:"<<y<<endl;
delete []a;
delete []b;
return 0;
}
预期值与真实结果相差太远
可以较为准确的得出预测值
拉格朗日插值算法是一种数值分析中的插值算法。它利用拉格朗日插值函数来逼近一组给定的数据点,从而求出这些点的函数值。它的基本思想是用拉格朗日插值函数来拟合一组给定的数据点,并用这个拟合函数来预测其他数据点的函数值。
下面是一个简单的 C++ 实现例子:
// 拉格朗日插值算法
// n: 数据点的个数
// x: 数据点的横坐标
// y: 数据点的纵坐标
// xi: 要求函数值的点的横坐标
double lagrange_interpolation(int n, double* x, double* y, double xi) {
double result = 0;
for (int i = 0; i < n; i++) {
double numerator = 1;
double denominator = 1;
for (int j = 0; j < n; j++) {
if (j != i) {
numerator *= xi - x[j];
denominator *= x[i] - x[j];
}
}
result += numerator / denominator * y[i];
}
return result;
}
在这个例子中,函数 lagrange_interpolation
接受三个参数:数据点的个数、数据点的横坐标和纵坐标,返回要求函数值的点的横坐标。