c++中使用加权最小二乘法,使用正弦函数来拟合曲线的完整代码
时间: 2024-10-21 10:09:31 浏览: 14
在C++中,我们可以使用加权最小二乘法(Weighted Least Squares Regression)来拟合一条正弦曲线。下面是一个基本的示例,假设我们有一组数据点(x, y),权重w,并想通过给定的周期、幅度和相位拟合一条正弦函数y = A * sin(B * x + C)。请注意,这只是一个简化的版本,实际应用中可能会更复杂,涉及向量操作和矩阵计算。
```cpp
#include <iostream>
#include <cmath>
// 定义正弦函数的拟合模型
double weighted_sine(double x, double A, double B, double C, double w) {
return A * std::sin(B * x + C);
}
// 加权最小二乘法优化函数
std::tuple<double, double, double> least_squares_fit(std::vector<std::pair<double, double>>& data, std::vector<double>& weights) {
const int N = data.size();
double sum_x = 0.0, sum_y = 0.0, sum_wx = 0.0, sum_wxy = 0.0, sum_w = 0.0;
for (int i = 0; i < N; ++i) {
sum_x += weights[i] * x;
sum_y += weights[i] * y;
sum_wx += weights[i] * x * x;
sum_wxy += weights[i] * x * y;
sum_w += weights[i];
}
double A = (N * sum_wxy - sum_x * sum_y) / (N * sum_w * std::cos(C) - sum_x * sum_wx);
double B = 1.0;
double C = std::atan2(sum_y - A * sum_x, sum_wx - A * sum_x);
return {A, B, C};
}
int main() {
// 示例数据
std::vector<std::pair<double, double>> data = {{0.0, 1.0}, {1.0, 1.5}, {2.0, 2.0}};
std::vector<double> weights = {1.0, 1.0, 1.0}; // 假设所有数据权重相等
// 拟合函数
auto fit = least_squares_fit(data, weights);
double A = std::get<0>(fit), B = std::get<1>(fit), C = std::get<2>(fit);
std::cout << "拟合的正弦函数: y = " << A << "*sin(" << B << "*x + " << C << ")" << std::endl;
return 0;
}
```
在这个例子中,`least_squares_fit` 函数计算了拟合的参数 A、B 和 C。然后,在 `main` 函数中,我们创建了一个简单的数据集并应用拟合函数。
阅读全文