面向对象编程技术大作业-阿伦方差设计报告 本文关键词:阿伦,方差,作业,面向对象,编程技术
面向对象编程技术大作业-阿伦方差设计报告 本文简介:面向对象编程技术大作业——阿伦方差问题学部:电信学部学院:计算机科学与技术学院班级:计科1406学号:21409173姓名:黄栋一、问题分析在科学研究实验中,经常遇到对大量的实验数据的处理问题。其处理方法有很多种,但其基本的处理一般包括:求均值、方差等。假设有一检测量,其实验测量值服从正态概率密度分
面向对象编程技术大作业-阿伦方差设计报告 本文内容:
面向对象编程技术大作业
——阿伦方差问题
学
部:电信学部
学
院:计算机科学与技术学院
班
级:计科1406
学
号:21409173
姓
名:黄
栋
一、
问题分析
在科学研究实验中,经常遇到对大量的实验数据的处理问题。其处理方法有很多种,但其基本的处理一般包括:求均值、方差等。
假设有一检测量,其实验测量值服从正态概率密度分布,分布范围:,分布概率100%,其中是其数学期望,是该测量样本的方差,样本基本采样频率为10ms。
对该采样样本,根据给定的时间间隔t0,对样本数据分段,总共(T/t0)=n段,T为整个样本对应的采样时间。每一段内的数据求平均,得到n个平均值avg(n),然后将这n个平均值组成的数组求,即该样本的t0间隔平滑方差。t0的取值为:10ms,20ms,50ms,100ms,200ms,500ms,1s,2s,5s,10s,100s等就得到一系列t0间隔的平滑方差。
以t0为横坐标,为纵坐标,画出双对数曲线。所绘制的曲线应采用逻辑坐标系,保证双对数曲线所见即所得。同时支持打印和打印预览。
问题中要对一组服从高斯分布的实验数据进行处理,因此要首先生成一批高斯分布的随机数,并判断产生的随机数是否在置信区间内,若不在,则将该类型数据剔除,直到生成满足条件的数为止。考虑到数据样本量较大,采用文件存取数较为方便。
要针对不同分段的数据进行分类处理,读入的数据量不同,采用C++支持的STL的vector存储数据能够方便地不同数量的数据。
VC6.0中的SDI程序已经支持打印及打印预览,故采用SDI编程比较方便。同时,考虑打印预览的所见即所得特性,应采用坐标转换。
二、
算法设计及部分实现
首先,将高斯分布随机数生成函数,选择在置信区间内的随机数函数,文件存取函数,求阿伦方差等函数设计于一个类中。如下所示。
#define
BufferNum
10
#ifndef
ALLENVARIANCE_HEADER
#define
ALLENVARIANCE_HEADER
class
AllenVariance
{
double
m_GaussMean,m_GaussVariance;//随机数方差和均值
unsigned
int
m_GaussTotalNum,m_CountGaussNum;//样本数
double
GaussianNumBuffer[BufferNum];
unsigned
int
m_SetSampleTime;
vector
m_t0;
public:
vector
m_Variance;//求得阿伦方差
vector
m_Data;
private:
vector
m_Average;//临时所求所期望值
vector
m_DrawData;//阿伦方差取对数
vector
m_Xaxis;//坐标标点
static
bool
LessThan
(pair
public:
vector
>
m_FinalData;
AllenVariance
(
double
Mean
=
0,double
Variance
=
1,unsigned
int
TotalNum
=
2000,unsigned
int
SamSet
=
13)
{
m_GaussMean
=
Mean;
m_GaussVariance
=
Variance;
m_GaussTotalNum
=
TotalNum;
m_CountGaussNum
=
0;
m_SetSampleTime
=
SamSet
;
SetSample
();
}//
构造函数
double
GaussianGenerator
();//
高斯随机数生成函数
double
ReGenerateGaussianNum
();//重新生成高斯随机数
bool
SelectStdData
(
double
);//判断随机数是否满足要求
bool
FileBuffer
();//文件读写
bool
WriteToFile
();//写入文件
bool
ReadFromFile
();//从文件读数到内存
vector
ReadFromFile
(
unsigned
int
Number
);//存文件//数据
bool
TestGaussSize
();//
高斯随机数是否达到要求
void
SetSample
();//
设置采样点
void
DivideData
(
doublearr
);
void
DivideData
(
int
);//
数据分割
void
ProcessDivideData
(
/*doubledata*/
);
void
ProcessDivideData
(const
vector//
求阿伦方差
double
AverageDivideData
(const
vector//求均值
void
GetDifferentT0
();
void
GetAllDatas
();//获取方差数据
void
GetDrawData
();//获取坐标数据
};
在SDI绘图过程,要进行坐标转换,代码如下(代码没有设备上下文,故不能直接使用):
CRect
rect;
GetClientRect
(//获得窗口大小
SetMapMode
(MM_ANISOTROPIC);//
设置映射模式
//SetWindowExt设定窗口尺寸
以逻辑单位计算,
//SetViewportExt
设定视口尺寸
以物理单位计算
SetViewportOrg
(rect.right/2,rect.bottom/2);//逻辑视口标原点
SetViewportExt
(rect.right,rect.bottom);
SetWindowOrg
(0,0);//窗口原点
SetWindowExt
(rect.right*1,-rect.bottom*1);映射比例
在设计打印预览上,由于打印机上的单位面积上的像素点数多于屏幕上单位面积上的像素点数,为实现所见即所得功能,也要进行坐标转换。代码如下:
pDC->SetMapMode
(MM_ANISOTROPIC);//转换坐标映射方式
CSize
size
=
CSize
(1280,800);
pDC->SetWindowExt(size);//确定窗口大小
int
xLogPixPerInch
=
pDC->GetDeviceCaps
(LOGPIXELSX);//得到实际设备每逻辑英寸的象素数量
int
yLogPixPerInch
=
pDC->GetDeviceCaps
(LOGPIXELSY);
long
xExt
=
(long)size.cx
xLogPixPerInch
/
96;
//得到设备坐标和逻辑坐标的比例
long
yExt
=
(long)size.cy
yLogPixPerInch
/
96;
pDC->SetViewportExt
(
(int)xExt,(int)yExt
);
三、
程序运行
1.
程序打开界面:
点击菜单栏上的“AllenVariance”中的“参数设置”,弹出如下对话框:
设置相应均值,方差及样本数后,点击右侧提交按钮。再单击“确定”。生成高斯随机数。
2.
点击菜单“AllenVariance”中的“读取数据”选项,程序会提示从文件读取数据的对话框。
点击确定,读取文件数据。数据读分完后,会弹出相似对话框以提示工作完成。
4.点击“AllenVariance”中的“显示数据”,程序显示所计算出的方差。
5.
点击“AllenVariance”中的“显示图形”,绘出双对数曲线。
6.
点击“AllenVariance”中的“准备打印”,再点击菜单“文件”中的“打印预览”,就可以得到预览图像。
四、心得体会
通过本次设计,成功的实现了阿伦方差计算的算法。由于平时实际编程较少,真正写起代码起来后,感觉动手操作和知识学习是两个完全不同的体系,就算是掌握了基本的知识点,要想应用到实际编程中也是十分的困难。在准备题目的过程中,我逐渐对一些知识点有了另外的理解,渐渐找到了题目的入手点。在整个设计过程中,对MFC的设计有了更加深入的了解,对MFC以及Windows程序的运行机制有更好的了解,通过这次设计,提高了我对编程的兴趣,也提醒我在今后要多动手多操作,提高实际编程能力。最后,在完成设计的时候,有一种满足感。感谢老师和师兄师姐在平时的耐心指导,谢谢!