最小二乘法实现圆的拟合

 示例1:

#include 
#include 
#include 
#include 
// 二维点结构体
struct Point2D {
    double x;
    double y;
};
 
// 圆结构体(结果容器)
struct Circle {
    Point2D center;
    double radius;
    bool valid = false; // 拟合有效性标志
};
 
// 最小二乘圆拟合核心算法
Circle fitCircleLeastSquares(const std::vector& points) {
    Circle result;
    const int N = points.size();
    
    // 异常情况处理
    if (N < 3) {
        throw std::invalid_argument("至少需要3个点进行圆拟合");
    }
 
    // 初始化统计量
    double sum_x = 0.0, sum_y = 0.0;
    double sum_x2 = 0.0, sum_y2 = 0.0;
    double sum_x3 = 0.0, sum_y3 = 0.0;
    double sum_xy = 0.0, sum_x1y2 = 0.0, sum_x2y1 = 0.0;
 
    // 遍历点集计算统计量
    for (const auto& p : points) {
        const double x = p.x;
        const double y = p.y;
        const double x2 = x * x;
        const double y2 = y * y;
        
        sum_x += x;
        sum_y += y;
        sum_x2 += x2;
        sum_y2 += y2;
        sum_x3 += x2 * x;
        sum_y3 += y2 * y;
        sum_xy += x * y;
        sum_x1y2 += x * y2;
        sum_x2y1 += x2 * y;
    }
 
    // 构建线性方程组系数
    const double C = N * sum_x2 - sum_x * sum_x;
    const double D = N * sum_xy - sum_x * sum_y;
    const double E = N * (sum_x3 + sum_x1y2) - (sum_x2 + sum_y2) * sum_x;
    const double G =

你可能感兴趣的:(笔记,最小二乘法,算法,机器学习)