题目
1.基本要求:
[1]编写多项式函数的参数辨识系统,多项式函数的形式为:y = a0 + a1·x + a2·x2 + …+ an·xn式中,x为自变量 (xmin≤x≤xmax),y为因变量,a0, a1, a2, …, an为多项式的系 数,n为多项式的次数。
[2]每个多项式包括以下信息:多项式名称(根据n的值命名, 如2次多项式、3次多项式,… )、自变量的上限 xmax和下 限xmin,多项式的次数(C++)即n的值)、多项式系 数的 真实值a0, a1, a2, …, an,多项式系数的辨识结果:a’0, a’1, a’2, …, a’n、辨识结果的评价指标。
2.基本管理功能:
[1]多项式基本信息的输入:从键盘输入多项式的次数、自变
量的上限和下限,以及多项式系数的真实值。
[2]样本数据的产生、保存与读取:根据输入的多项式信息,在 [xmin, xmax]范围内均匀产生50个x值,利用公式(C++)3)得到 对 应的50个y值,并 给每个y值产生一点随机的扰动 (即 利用C++中的 随机函数产生一点扰动 ,叠加到 原来 的y值上)。将其保存在硬盘(C++)以数据库文件或普通文 本文件的形式),需要时可以从硬盘将数据读取出来。
[3]参数辨识:根据多项式所产生的数据(50组), 利用最小 二乘法辨识多项式系数a’0, a’1, a’2, …, a’n。(这一部分内容 需要自己查阅参数辨识、最小二乘法等知识的相关资料,并 进行编程)。
[4]多项式值的估计值:在[xmin, xmax]范围内随机产生50个x 值,根据a0, a1, a2, …, an和a’0, a’1, a’2, …, a’n,计算多项式的 真实值y和估计值y’(各有50个值),即:y = a0 + a1·x + a2·x2 + …+ an·xny’ = a’0 + a’1·x + a’2·x2 + … + a’n·xn
[5]参数辨识结果评价:根据计算得到的50个y和y’,计算它们 的均方差,作为对参数辨识结果的评价指标。(均方差的计 算自己查阅文献)
[6]查询与输出功能:可以按多项式名称该多项式的信息,并按 一定的格式将其输出。
核心代码
最小二乘法原理和实现
https://blog.youkuaiyun.com/shuzfan/article/details/52367329
需要使用Eigen库,类似opencv部属。
https://blog.youkuaiyun.com/weixin_44438749/article/details/104967836
核心代码
主函数是简单的显示
#include <iostream>
#include <vector>
#include "data.h"
#include "least_square_method.h"
#include "contrast.h"
void menu()
{
system("cls");
cout << "**********************************************" << endl;
cout << "** 欢迎使用最小二乘系统 **" << endl;
cout << "** 菜 单 **" << endl;
cout << "** (a)全部过程体验 **" << endl;
cout << "** (b)输入真实数据 **" << endl;
cout << "** (c)保存随机数据 **" << endl;
cout << "** (d)导入上次数据 **" << endl;
cout << "** (e)显示当前数据 **" << endl;
cout << "** (f)最小二乘拟合 **" << endl;
cout << "** (g)参数拟合结果评价 **" << endl;
cout << "** (g)退出系统 **" << endl;
cout << "**********************************************" << endl;
cout << "请选择相应的操作 a~h" << endl;
}
//退出页面
void exit()
{
system("cls");
cout << "**********************************************" << endl;
cout << "** 感谢使用本系统 **" << endl;
cout << "** 谢谢老师 **" << endl;
cout << "** 再见 **" << endl;
cout << "**********************************************" << endl;
cout << "按任意键关闭本页面..." << endl;
cout << "";
getchar();
getchar();
}
int main()
{
class data m_data;
lsm m_lsm;
while (1) {
menu();
char c = getchar();
if (c == 'a') {
m_data.in_x_n_a();
m_data.d();
m_lsm=lsm(m_data);
contrast m_contrast(m_data, m_lsm);
cout << m_contrast;
}
if (c == 'b') {
m_data.in_x_n_a();
m_data.d();
cout << "数据已经输入" << endl;
}
if (c == 'c') {
m_data.save("out.txt");
cout << "数据已经保存" << endl;
}
if (c == 'd') {
m_data.read("out.txt");
cout << "数据已经写入" << endl;
}
if (c == 'e') {
m_data.show();
}
if (c == 'f') {
m_lsm = lsm(m_data);
}
if (c == 'g') {
contrast m_contrast(m_data, m_lsm);
cout << m_contrast;
}
if (c == 'h') {
exit();
return 0;
}
cout << "按任意键继续..." << endl;
getchar();
getchar();
}
return 0;
}
接下来三个类实现基本数据输入、最小二乘拟合、以及结果对比。
效果
传送门
https://download.youkuaiyun.com/download/renzemingcsdn/85424209