#include <iostream>
#include <vector>
#include <cmath>
#include <string.h>
using namespace std;
template <class T>
class Lagrange
{
public:
void lagrange(const int &n, const int &p, T *x, T *y, vector<T> &xi, vector<T> &fx) //输入一组已知点,计算未知点,p为未知点个数,n+1为已知点个数
{
for (int m = 0; m < p; m++)
{
for (int k = 0; k <= n; k++)
{
for (int j = 0; j <= n; j++)
{
if (j != k)
l = l * (x[m] - xi.at(j)) / (xi.at(k) - xi.at(j));
}
y[m] = y[m] + l * fx.at(k);
l = 1.0;
}
}
}
private:
double l = 1.0;
};
int main()
{
int n = 5;
vector<double> xi[4], fx[3];
vector<double> ex[3];
Lagrange<double> lag;
for (int q = 0; q < 3; q++)
{
if (q == 0)
n = 5;
if (q == 1)
n = 10;
if (q == 2)
n = 20;
for (int i = 0; i <= n; i++)
{
xi[q].push_back((-5.0 + i * 10.0 / n));
fx[q].push_back(1.0 / (1.0 + xi[q].at(i) * xi[q].at(i)));
}
}
double y[4][5] = {}, x[5] = {0.75, 1.75, 2.75, 3.75, 4.75};
cout << endl
<< endl
<< "问题1:" << endl;
for (int p = 0; p < 3; p++)
{
if (p == 0)
n = 5;
if (p == 1)
n = 10;
if (p == 2)
n = 20;
lag.lagrange(n, 5, x, y[p], xi[p], fx[p]);
}
cout.precision(10);
cout << "1/(1+x^2),插值区间[-5,5]" << endl;
for (int t = 0; t < 3; t++)
{
cout << "____________________________________________" << endl;
if (t == 0)
{
cout << "n = 5:" << endl;
}
if (t == 1)
{
cout << "n = 10:" << endl;
}
if (t == 2)
{
cout << "n = 20:" << endl;
}
for (int i = 0; i < 5; i++)
std::cout << "x = " << x[i] << ", "
<< "y = " << y[t][i] << std::endl;
}
cout << "===========================================";
cout << endl
<< "真实值为" << endl;
for (int i = 0; i < 5; i++)
{
cout << "x = " << x[i] << "y = " << (1.0 / (1.0 + x[i] * x[i])) << endl;
}
for (int i = 0; i < 3; i++)
{
xi[i].clear();
}
for (int i = 0; i < 5; i++)
{
x[i] = 0;
}
for (int i = 0; i < 3; i++)
{
for (int v = 0; v < 5; v++)
y[i][v] = 0;
}
for (int q = 0; q < 3; q+
哈尔滨某985拉格朗日插值法实验C++代码
最新推荐文章于 2024-03-18 14:00:28 发布
本文分享了哈尔滨一所985大学的实验项目,使用C++编程实现了拉格朗日插值法。通过这段代码,读者可以了解到如何在实际问题中应用数学的插值理论。
摘要由CSDN通过智能技术生成