线性插值c++
时间: 2023-06-29 16:04:17 浏览: 249
线性插值是一种常用的数据插值方法,可以根据已知的一些数据点,在两个已知数据点之间插值得到一个新的点。C++实现线性插值的代码如下:
```cpp
#include <iostream>
using namespace std;
// 线性插值函数
double linear_interpolation(double x, double x1, double y1, double x2, double y2) {
return y1 + (x - x1) * (y2 - y1) / (x2 - x1);
}
int main() {
double x = 2.5; // 需要插值的点
double x1 = 2.0, y1 = 1.0; // 第一个已知点
double x2 = 3.0, y2 = 2.0; // 第二个已知点
double y = linear_interpolation(x, x1, y1, x2, y2);
cout << "插值结果为:" << y << endl;
return 0;
}
```
在上面的代码中,我们定义了一个`linear_interpolation`函数,其中`x`表示需要插值的点,`x1`和`y1`表示第一个已知点的坐标,`x2`和`y2`表示第二个已知点的坐标。插值函数的计算公式为:
$$y = y_1 + \frac{(x - x_1)(y_2 - y_1)}{(x_2 - x_1)}$$
最后输出插值结果即可。
相关问题
基于拉格朗日插值线性插值c++
以下是基于拉格朗日插值的线性插值 C++ 代码示例:
```c++
#include <iostream>
#include <vector>
using namespace std;
double lagrange(const vector<double>& x, const vector<double>& y, const double& xi) {
double yi = 0;
for (int i = 0; i < x.size(); ++i) {
double li = 1;
for (int j = 0; j < x.size(); ++j) {
if (i != j) {
li *= (xi - x[j]) / (x[i] - x[j]);
}
}
yi += y[i] * li;
}
return yi;
}
int main() {
vector<double> x = {0, 1}; // x 坐标
vector<double> y = {1, 2}; // y 坐标
double xi = 0.5; // 待插值的 x 坐标
double yi = lagrange(x, y, xi); // 插值结果
cout << "x = " << xi << " 时,y = " << yi << endl;
return 0;
}
```
这个示例实现了一个简单的线性插值,其中 `x` 和 `y` 分别表示已知的数据点的 x 和 y 坐标,`xi` 表示待插值的 x 坐标,`yi` 表示对应的插值结果。函数 `lagrange` 实现了拉格朗日插值算法,其中 `li` 表示第 `i` 个拉格朗日基函数的值,通过循环计算得到插值结果 `yi`。
分段线性插值,分段二次插值,全区间拉格朗日插值C++代码写完整
分段线性插值C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
double linearInterpolation(double x, vector<double> X, vector<double> Y) {
int n = X.size();
for (int i = 0; i < n - 1; i++) {
if (x >= X[i] && x <= X[i+1]) {
double y = Y[i] + (Y[i+1] - Y[i]) / (X[i+1] - X[i]) * (x - X[i]);
return y;
}
}
return 0;
}
int main() {
vector<double> X = {1, 2, 3, 4, 5};
vector<double> Y = {2, 4, 5, 4, 1};
double x = 2.5;
double y = linearInterpolation(x, X, Y);
cout << "x = " << x << ", y = " << y << endl;
return 0;
}
```
分段二次插值C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
double quadraticInterpolation(double x, vector<double> X, vector<double> Y) {
int n = X.size();
for (int i = 0; i < n - 1; i++) {
if (x >= X[i] && x <= X[i+1]) {
double x1 = X[i], x2 = X[i+1];
double y1 = Y[i], y2 = Y[i+1];
double a = (y1 - y2) / (x1 - x2) / (x1 - x2);
double b = -2 * a * x1;
double c = y1 - a * x1 * x1 - b * x1;
double y = a * x * x + b * x + c;
return y;
}
}
return 0;
}
int main() {
vector<double> X = {1, 2, 3, 4, 5};
vector<double> Y = {2, 4, 5, 4, 1};
double x = 2.5;
double y = quadraticInterpolation(x, X, Y);
cout << "x = " << x << ", y = " << y << endl;
return 0;
}
```
全区间拉格朗日插值C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
double lagrangeInterpolation(double x, vector<double> X, vector<double> Y) {
int n = X.size();
double y = 0;
for (int i = 0; i < n; i++) {
double Li = 1;
for (int j = 0; j < n; j++) {
if (i != j) {
Li *= (x - X[j]) / (X[i] - X[j]);
}
}
y += Li * Y[i];
}
return y;
}
int main() {
vector<double> X = {1, 2, 3, 4, 5};
vector<double> Y = {2, 4, 5, 4, 1};
double x = 2.5;
double y = lagrangeInterpolation(x, X, Y);
cout << "x = " << x << ", y = " << y << endl;
return 0;
}
```
阅读全文