拉格朗日插值(C++版)
该版本可根据输入的插值点自动选取其周围的8个点进行7次插值运算
i xi yi i xi yi
1 0.10 0.1103329 11 0.60 1.0288456
2 0.15 0.1736223 12 0.65 1.1592592
3 0.20 0.2426552 13 0.70 1.2972951
4 0.25 0.3176729 14 0.75 1.4430292
5 0.30 0.3989105 15 0.80 1.5965053
6 0.35 0.4865951 16 0.85 1.7577308
7 0.40 0.5809439 17 0.90 1.9266733
8 0.45 0.6821617 18 0.95 2.1032563
9 0.50 0.7904390 19 1.00 2.2873552
10 0.55 0.9059492 20 1.05 2.4787929
#include<iostream>
using namespace std;
double Lagrange(double x[], double y[], double t, int n)
//函数参数说明:x[]和y[]为一维数组形参,表示表格中的数据;t为待求点;n为表格中的结点数
{
double result = 0;
double L;
double t0 = t;
int q = 0;
if (t <= x[4]) {//小于第5个点
q = 8;
for (int j = 0; j < q; j++) {
L = y[j];
for (int k = 0; k < q; k++) {
if (j == k) {
continue;
}
L *= (t0 - x[k]) / (x[j] - x[k]);
}
result += L;
}
return result;
}
else if (t >= x[n - 5]) {//大于第n-4个点
q = n - 9;
for (int j = q; j < n; j++) {
L = y[j];
for (int k = q; k < n; k++) {
if (j == k) {
continue;
}
L *= (t0 - x[k]) / (x[j] - x[k]);
}
result += L;
}
return result;
}
else {//在这之间
for (int i = 5; i < n; i++) {
if (t >= x[i - 1] && t <= x[i]) { q = i+4; break;}
}
for (int j = q-8; j < q; j++) {
L = y[j];
for (int k = q-8; k < q; k++) {
if (j == k) {
continue;
}
L *= (t0 - x[k]) / (x[j] - x[k]);
}
result += L;
}
return result;
}
}
void main() {
double x[20] = { 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 y[20] = { 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 };
int n = 20;
double t = 0;
cout << "请输入插值点:";
cin >> t;
cout << "近似结果为:" << Lagrange(x, y, t, n) << endl;
system("pause");
}