声明:仅为个人笔记,相关知识仅供参考。
Lagrange插值属 n 次多项式插值,其成功之处在于用构造插值基函数的方法解决了求 n 次多项式插值函数的问题。
在实际应用中的函数y=f(x)有可能出现这样的问题:函数没有解析表达式,只有一系列离散的测量点组成的表格。如下表格:
这里直接引出n次拉格朗日插值:
不难发现 :理论上,随着节点数n的增加,Lagrange插值就越精确。
为什么说理论上呢,因为在实际操作中肯定是不一样的。计算机中用有限位的浮点数存储数据导致储存值与真实值存在误差,这便是舍入误差。随着随着节点数n增加,运算次数显著增加,舍入误差积累变大。因此节点数n达到一定值后,增加反而对导致误差越开越大,甚至会超过我们预期。一般我们在计算插值时所选节点数不超过8个。
大致思路:
这里啰嗦多两句(针对萌新讲的,自行选择跳过)预先解释一下代码思路:
#include
using namespace std;
double Lagrange(double x[],double f[],double t,const int n,int m=8){
if (n < m) {
cout << "节点数过多或者数据不足!" << endl;
return -1;
}
//选取节点
int start, end;
for (int i = 0; i < n; i++) {
if (x[i] > t) {
if (i - m / 2 < 0) {
start = 0;
end = m-1;
break;
}
else start = i - m / 2;
if ((i + m / 2 - (m - 1) % 2) > n - 1) {
start = n - m ;
end = n - 1;
break;
}
else end = i + m / 2 - (m - 1) % 2;
break;
}
}
//核心步骤:累加计算含有f(Xi)对应的项的值
double sum = 0, temp;
for (int i = start; i <= end; i++) {
temp = f[i];
for (int j = start; j <= end; j++) {
if (i != j) temp *= ((t - x[j]) / (x[i] - x[j]));
}
sum += temp;
}
return sum;
}
int main(){
//样表数据
double x[] = {
0.10,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,
0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.00,1.05};
double f[] = {
0.1103329,0.1736223,0.2426552,0.3176729,0.3989105,
0.4865951,0.5809439,0.6821617,0.7904390,0.9059492,
1.0288456,1.1592592,1.2972951,1.4430292,1.5965053,
1.7577308,1.9266733,2.1032563,2.2873552,2.4787929};
double t;
cout << "请输入带求点X值:" << endl;
cin >> t;
//执行该点的1-7次插值
for (int i = 2; i <= 8; i++)
cout <<"该点的" << i - 1 << "次拉格朗日插值为:" << Lagrange(x, f, t, 20, i) << endl;
system("pause");
return 0;
}