题目一:线性最小二乘拟合程序
某系统输入输出呈线性关系:Y=日×+b,但参数
a、b未知。通过对系统输入(叉)和输出(Y)的数据统计,应用最小二乘估计确定a和b的值。现有一次
测量活动得到如下10组[义,Y]数据:
[1,9.762]
[2, 12.719]
[3, 15.497]
【4,18.143]
[5, 18.982]
[6, 21.008]
[7, 24.596]
[8, 26.285]
[9, 29.369]
[10,31.17]
请编程实现:输入上述测量数据后,输出参数a和b的值,以及10个测量值的离差(离差:应用拟合函数计算的Y值与测量的Y值之差)。
程序要求:
()一切计算过程全部用程序实现,具备通用性,即可以拟合任意Y=aX+b型线性关系;
(2) 自主查找资料,通过编程实现,尽量不要使用网
可以查询到的解析表达式
(3)计算完成后,可将数据导入Excel显示测量数据
(散点)和拟合后的直线,并将该显示图形加入到结题报告中;
(4) 输出数据可以输出到文本文件
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
// 输入10组测量数据
int x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double y[10] = {9.762, 12.719, 15.497, 18.143, 18.982, 21.008, 24.596, 26.285, 29.369, 31.17};
// 计算和
double sumx = 0, sumy = 0, sumxy = 0, sumxx = 0;
for (int i = 0; i < 10; i++)
{
sumx += x[i];
sumy += y[i];
sumxy += x[i] * y[i];
sumxx += x[i] * x[i];
}
// 计算参数a和b
double a = (10 * sumxy - sumx * sumy) / (10 * sumxx - sumx * sumx);
double b = (sumxx * sumy - sumxy * sumx) / (10 * sumxx - sumx * sumx);
// 输出参数a和b的值
cout << "a = " << a << endl;
cout << "b = " << b << endl;
// 计算10个测量值的离差
cout << "The residuals are:"
for (int i = 0; i < 10; i++)
{
cout << y[i] - (a * x[i] + b) << endl;
}
return 0;
}
(以上代码均由chatGPT自动生成)
最小二乘法线性拟合
https://blog.csdn.net/yangziluomu/article/details/103503387