C++插值内插和外推实现
时间: 2023-07-11 18:50:45 浏览: 108
插值内插和外推是数值分析中常用的技术,可以用来估计未知数据点的值。在C++中,可以使用插值函数来实现插值内插和外推。
以下是一个简单的示例代码,演示如何使用C++实现插值内插和外推:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义插值函数
double interpolate(vector<double> const& x, vector<double> const& y, double const& xi) {
int n = x.size();
double yi = 0.0;
// 判断数据点是否足够
if (n < 1) return yi;
if (n < 2) return y[0];
// 根据插值公式计算估计值
for (int i = 0; i < n; i++) {
double w = 1.0;
for (int j = 0; j < n; j++) {
if (i == j) continue;
w *= (xi - x[j]) / (x[i] - x[j]);
}
yi += w * y[i];
}
return yi;
}
// 定义外推函数
double extrapolate(vector<double> const& x, vector<double> const& y, double const& xi) {
int n = x.size();
// 判断数据点是否足够
if (n < 1) return 0.0;
if (n < 2) return y[0];
// 将数据点按照x值排序
vector<pair<double, double>> data(n);
for (int i = 0; i < n; i++) {
data[i] = make_pair(x[i], y[i]);
}
sort(data.begin(), data.end());
// 判断xi是否在数据范围内
if (xi < data[0].first) return data[0].second;
if (xi > data[n - 1].first) return data[n - 1].second;
// 根据插值公式计算估计值
int i = 0;
while (i < n && xi > data[i].first) {
i++;
}
double x1 = data[i - 1].first;
double x2 = data[i].first;
double y1 = data[i - 1].second;
double y2 = data[i].second;
double yi = y1 + (y2 - y1) * (xi - x1) / (x2 - x1);
return yi;
}
int main() {
// 定义数据点
vector<double> x = {0.0, 1.0, 2.0, 3.0};
vector<double> y = {1.0, 2.0, 3.0, 4.0};
// 使用插值函数估计未知数据点的值
double xi = 1.5;
double yi = interpolate(x, y, xi);
cout << "Interpolated value at " << xi << " is " << yi << endl;
// 使用外推函数估计未知数据点的值
xi = -1.0;
yi = extrapolate(x, y, xi);
cout << "Extrapolated value at " << xi << " is " << yi << endl;
xi = 4.0;
yi = extrapolate(x, y, xi);
cout << "Extrapolated value at " << xi << " is " << yi << endl;
return 0;
}
```
在上面的示例中,我们定义了一个插值函数 `interpolate` 和一个外推函数 `extrapolate`,它们都接受两个向量 `x` 和 `y`,分别表示已知的数据点的x和y值,以及一个未知数据点的x值 `xi`,并返回估计的未知数据点的y值。在 `interpolate` 函数中,我们使用拉格朗日插值公式来计算估计值;在 `extrapolate` 函数中,我们使用线性插值公式来计算估计值。在主函数中,我们使用这两个函数分别计算插值内插和外推的结果,并输出到控制台。