以下是一个简单的C++程序,使用最小二乘法来拟合一组数据并计算误差。

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 定义最小二乘函数
void leastSquares(const vector<double>& x, const vector<double>& y, double& a, double& b) {
    double x_avg = 0.0;
    double y_avg = 0.0;
    for (int i = 0; i < x.size(); i++) {
        x_avg += x[i];
        y_avg += y[i];
    }
    x_avg /= x.size();
    y_avg /= y.size();

    double sum_xy = 0.0;
    double sum_x2 = 0.0;
    for (int i = 0; i < x.size(); i++) {
        sum_xy += (x[i] - x_avg) * (y[i] - y_avg);
        sum_x2 += (x[i] - x_avg) * (x[i] - x_avg);
    }

    a = sum_xy / sum_x2;
    b = y_avg - a * x_avg;
}

int main() {
    // 假设有一组数据
    vector<double> x = { 1.0, 2.0, 3.0, 4.0, 5.0 };
    vector<double> y = { 2.0, 3.0, 4.0, 5.0, 6.0 };

    // 使用最小二乘法计算拟合曲线
    double a, b;
    leastSquares(x, y, a, b);

    // 输出拟合曲线的参数
    cout << "y = " << a << "x + " << b << endl;

    // 计算误差
    double error = 0.0;
    for (int i = 0; i < x.size(); i++) {
        double diff = y[i] - a * x[i] - b;
        error += diff * diff;
    }
    error = sqrt(error / x.size());

    // 输出误差
    cout << "误差为:" << error << endl;

    return 0;
}

这个程序首先定义了一个leastSquares函数,用于计算最小二乘拟合曲线的参数。它接受两个向量xy,分别代表输入的数据点的x和y坐标,以及两个引用变量ab,分别代表拟合曲线的斜率和截距。函数中的计算公式与最小二乘法的公式一致。

main函数中,我们定义了一组数据,然后调用leastSquares函数计算拟合曲线的参数。我们将这些参数输出到控制台,然后计算误差。误差的计算使用了均方根误差的公式。最后,我们将误差输出到控制台。

这个程序可以在Visual Studio 2022中编译运行

采用最小二乘法找到数一些数据的拟合曲线计算误差。用Visual Studio 2022表示

原文地址: https://www.cveoy.top/t/topic/flMV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录