[计算机数值分析]直线拟合的最小二乘法

在这里插入图片描述
在这里插入图片描述

  • 运行示例:

在这里插入图片描述

  • 源码:
#include<iostream>
using namespace std;

#define MAX 10

typedef struct Point   //坐标点信息结构体
{
    
    
	double x;
	double y;
}point;

int main(void)
{
    
    
	int n;   //点的个数
	point p[MAX];   //坐标点信息结构体数组

	cout << "请输入点的个数:";
	cin >> n;

	//输入点信息,存入结构体数组
	for (int i = 1; i <= n; i++)
	{
    
    
		cout << "请输入第" << i << "个点的坐标:";
		cin >> p[i].x;
		cin >> p[i].y;
	}

	double N, sumX, sumY, sumX2, sumXY;   //分别表示N,∑x,∑y,∑x²,∑xy
	double a, b;   //拟合直线系数、常数项

	//赋初值
	N = n;
	sumX = sumY = sumX2 = sumXY = 0;

	//计算系数
	for (int i = 1; i <= n; i++)
	{
    
    
		sumX += p[i].x;
		sumY += p[i].y;
		sumX2 += p[i].x * p[i].x;
		sumXY += p[i].x * p[i].y;
	}

	//输出一元二次方程
	cout << "\n一元二次方程方程如下:" << endl;
	if (sumX > 0)  //控制输出 + - 号
	{
    
    
		cout << N << " * a + " << sumX << " = " << sumY << endl;
	}
	else
	{
    
    
		cout << "\n" << N << " * a " << sumX << " = " << sumY << endl;
	}
	
	cout << sumX << " * a + " << sumX2 << " = " << sumXY << endl;

	//根据以上定义,原一元二次方程变为以下形式
	//N * a + sumX * b = sumY;
	//sumX * a + sumX2 * b =sumXY;
	//则可解出a,b,得到拟合直线的方程

	b = (sumXY * N - sumX * sumY) / (sumX2 * N - sumX * sumX);
	a = (sumY / N) - (sumX * sumXY * N - sumX * sumX * sumY) / (sumX2 * N * N - sumX * sumX * N);

	cout << "\n拟合直线y = " << b << "x " << a << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_51008866/article/details/116059867