c++最小二乘拟合水位改正代码
时间: 2024-06-23 07:02:07 浏览: 77
最小二乘拟合的C++源代码
在C++中,最小二乘法是一种常用的方法来进行数据拟合,比如在水位改正(水位测量误差修正)的问题中,我们可以使用它来找到最能描述实际水位变化趋势的最佳线性模型。以下是一个简单的最小二乘拟合的代码示例,假设我们有一个二维数组(时间,测量水位),目标是找到一条直线y = ax + b来拟合这些数据:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
// 定义线性回归函数
std::pair<double, double> leastSquaresFit(const std::vector<std::pair<double, double>>& data) {
double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
int n = data.size();
for (const auto& point : data) {
sumX += point.first;
sumY += point.second;
sumXY += point.first * point.second;
sumX2 += pow(point.first, 2);
}
// 计算斜率a和截距b
double a = (n * sumXY - sumX * sumY) / (n * sumX2 - pow(sumX, 2));
double b = (sumY - a * sumX) / n;
return {a, b};
}
int main() {
std::vector<std::pair<double, double>> waterLevels = {{0, 0}, {1, 1}, {2, 2}, {3, 3}}; // 假设这是测量数据
std::pair<double, double> fitParams = leastSquaresFit(waterLevels);
std::cout << "拟合的直线方程为: y = " << fitParams.first << "x + " << fitParams.second << std::endl;
// 对每个时间点进行水位改正
for (const auto& point : waterLevels) {
double correctedLevel = point.second - fitParams.first * point.first;
std::cout << "时间 " << point.first << " 的改正后水位: " << correctedLevel << std::endl;
}
return 0;
}
```
阅读全文