实际问题中碰到的函数 f ( x ) f(x) f(x) 是各种各样的,有的表达式很复杂,有的甚至给不出数学式子,只提供了一些离散数据,譬如某些点上的函数值和导数值。
由于问题的复杂性,直接研究函数 f ( x ) f(x) f(x) 可能很困难。面对这种情况,一个很自然的想法是,设法将所考察的函数 f ( x ) f(x) f(x) “简单化”,就是说,构造某个简单的函数 p ( x ) p(x) p(x) 作为 f ( x ) f(x) f(x) 的近似函数,然后通过处理 p ( x ) p(x) p(x) 获得关于 f ( x ) f(x) f(x) 的结果。
如果要求近似函数 p ( x ) p(x) p(x) 取给定的离散数据,则称之为 f ( x ) f(x) f(x) 的插值函数。
例:已知 100 = 10 , 121 = 11 , 144 = 12 \sqrt{100}=10, \sqrt{121}=11, \sqrt{144}=12 100=10,121=11,144=12,试用拉格朗日插值公式求解根号 115 的值。
运行示例:
程序源码:
#include <iostream>
#define MAX 10
using namespace std;
typedef struct Point
{
double x;
double y;
} point;
int main(void)
{
int n;
cout << "请输入插值节点的个数(<10):";
cin >> n;
point p[MAX];
for (int i = 1; i <= n; i++)
{
cout << "请输入第 " << i << " 个点的坐标:";
cin >> p[i].x;
cin >> p[i].y;
}
double x;
cout << "请输入 x 的值:";
cin >> x;
double sum = 0;
for (int i = 1; i <= n; i++)
{
double denominator = 1;
double numerator = 1;
// 实现拉格朗日基函数各分子、分母部分的求解
for (int j = 1; j <= n; j++)
{
if (i != j)
{
denominator *= p[i].x - p[j].x;
numerator *= x - p[j].x;
}
}
// 求解拉格朗日插值法的每一项,item 为每一项插值基函数与其对应函数值的乘积
double item = numerator / denominator * p[i].y;
sum += item;
}
cout << "运用拉格朗日基函数插值法求得 f(x) ≈ p(x) = " << sum << endl;
return 0;
}