#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
string str;
char *s;//读取文件中的字符串
double **Yto;//周期分组
double *Y;//数据
double *Yi; //均值
double *ss; //方差
double *sk; //平方差
int L; //周期数
int count=0;
ifstream read("data.dat");//打开文件
while(!read.eof())
{
read>>str;
count++; //计算文件行数
}
read.close(); //关闭文件
s=new char[15];
Y=new double[count];
ofstream dd("out.dat");
ifstream r("data.dat");
int i=0; //数组下标
while(!r.eof())
{
r>>s;
Y[i]=atof(s); //将char 转换为double
i++;
}
r.close();
int kk=0;
ss=new double[66-2+1];
sk=new double[66-2+1];
double temp; //平均方差最小缓存
int km=0; //平均方差最小所对应的周期
for(int k=2;k<66;k++) //分组
{
L=(count-1)/k;
Yto=(double **)new double *[L];
for(int j=0;j<L;j++)
{
Yto[j]=new double[k];
}
int n=0;
for(int m=0;m<L;m++)
{
for(int mm=0;mm<k;mm++)
{
Yto[m][mm]=Y[n];
n++;
}
}
Yi=new double[k];
for(int nn=0;nn<k;nn++)
{
double sum=0;
for(int m=0;m<L;m++)
{
sum+=Yto[m][nn];
}
Yi[nn]=(double)sum/(L+1); //求均值
dd<<"均值Y"<<nn<<"为"<<Yi[nn]<<endl;
}
ss[kk]=0;
sk[kk]=0;
for(int nn=0;nn<k;nn++) //求方差
{
double ssum=0;
for(int m=0;m<L;m++)
{
ssum+=(Yto[m][nn]-Yi[nn])*(Yto[m][nn]-Yi[nn]);
}
ss[kk]+=ssum;
}
dd<<"周期为"<<k<<"的方差为"<<ss[kk]<<endl;
sk[kk]=(double)ss[kk]/L;
dd<<"平均方差为"<<sk[kk]<<endl;
if(kk==0) //选择最小平均方差
{
temp=sk[kk];km=k;
}
if(kk>0&&temp>sk[kk])
{
temp=sk[kk];
km=k;
}
kk++;
}
dd<<"最小平均方差所对应的周期为"<<km<<endl;
dd.close();
system("pause");
}