📄 main.cpp
字号:
#include "head.h"
double forcastcoefficient[N];
int number;
double maxprice=500;
double forcastprice[N];
double forcasterror[N];
//double maxerror=0.0;
//double meanerror=0.0;
double threshold=0.9998;
double deltay[N];
double cossimilardegree(double a[N],double b[N]);
void regression(int ,int );
//double cossimilardegree1(double a[N],double b[N]);
void findsimilarday(double x[N]);
void regressioncoefficientchecking( );
double yuce(int);
void correct(double x[]);
void weightedregression(double x[N],int ,int );
double a[N];
double b[N];
void main(void)
{
double p[N];
ofstream fp;
fp.open("out_price.txt",ios::out);
getteachingdataload();
getteachingdataprice();
getdataload();
getdataprice();
//for(int i=0;i<=daynumber;i++)
//data2[i]=data[i];
//findsimilarday(data[daynumber].loadsequence);
// fp<<"当余弦相关度阈值设为"<<threshold<<"时"<<endl;
//fp<<"回归数据的天数为"<<number+1<<endl;
//fp<<"平均百分比误差为"<<100*meanerror<<"%"<<endl;
// fp<<"最大相对误差为"<<100*maxerror<<"%"<<endl;
// fp<<endl;
//weightedregression(data[daynumber].loadsequence,0,7);
regression(0,96);
for(int j=0;j<96;j++)
p[j]=yuce(j);
//regression(32,24);
weightedregression(data[daynumber].loadsequence,32,96);
for(j=32;j<N;j++)
p[j]=yuce(j);
for(int i=0;i<N;i++)
{
fp/*<<"第"<<i+1<<"点预测电价"*/<<p[i]<<endl;
// fp<<"第"<<i+1<<"点实际电价 "<<data2[daynumber].pricesequence[i]<<endl;
// fp<<"第"<<i+1<<"点相对误差"<<100*forcasterror[i]<<"%"<<endl;
// fp<<endl;
}
}
double cossimilardegree(double t[N],double p[N])//求余弦夹角
{
double a[N];
double b[N];
double sum;
double innerproduct=0.0;
for(int i=0;i<N;i++)
a[i]=t[i];
for(i=0;i<N;i++)
b[i]=p[i];
sum=0.0;
for(i=0;i<N;i++)
sum+=a[i]*a[i];
sum=sqrt(sum);
for(i=0;i<N;i++)
a[i]=a[i]/sum;
sum=0.0;
for(i=0;i<N;i++)
sum+=b[i]*b[i];
sum=sqrt(sum);
for(i=0;i<N;i++)
b[i]=b[i]/sum;
for(i=0;i<N;i++)
innerproduct+=a[i]*b[i];
//cout<<"innerproduct="<<innerproduct<<endl;
return innerproduct;
}
double ratio[daynumber][N];
void weightedregression(double x[N],int p,int q)
{
double reciprocalsum=0.0;
double reciprocal[daynumber];
int k=0;
double sum_1[N];
double sum_2[N];
double sum_3[N];
double sum_4[N];
double weight[daynumber];
double temp[daynumber];
for(int m=0;m<daynumber; m++)
{
temp[m]=cossimilardegree(x,data[m].loadsequence);
//cout<<"temp["<<m<<"]="<<temp[m]<<endl;
if(temp[m]>threshold)
{
//cout<<"temp["<<m<<"]="<<temp[m]<<endl;
data1[k]=data[m];
reciprocal[k]=temp[m];
reciprocalsum+=reciprocal[k];
k=k+1;
}
}
number=k-1;
cout<<"相似天数为"<<number+1<<endl;
for(k=0;k<=number;k++)
{
weight[k]=reciprocal[k]/reciprocalsum;
//cout<<"weight[k]="<<weight[k]<<endl;
}
for(int i=p;i<q;i++)
{
sum_1[i]=0.0;
sum_2[i]=0.0;
sum_3[i]=0.0;
sum_4[i]=0.0;
for(k=0;k<=number;k++)
{
//ratio[k][i]=data1[k].pricesequence[i];///data1[k].loadsequence[i];
sum_1[i]+=weight[k]*data1[k].loadsequence[i];
//cout<<"sum_1[i]="<<sum_1[i]<<endl;
sum_2[i]+=weight[k]*data1[k].pricesequence[i];
sum_3[i]+=weight[k]*data1[k].pricesequence[i]*data1[k].loadsequence[i];
sum_4[i]+=weight[k]*data1[k].loadsequence[i]*data1[k].loadsequence[i];
}
a[i]=(sum_3[i]-sum_2[i]*sum_1[i])/(sum_4[i]-sum_1[i]*sum_1[i]);
//cout<<"a["<<i<<"]="<<a[i]<<endl;
b[i]=sum_2[i]-a[i]*sum_1[i];
}
}
void regression(int q,int p)
{
double averagex[N];
double averagey[N];
double sum_1[N];
double sum_2[N];
double sum_3[N];
double sum_4[N];
for(int i=q;i<p;i++)
{
sum_1[i]=0.0;
sum_2[i]=0.0;
sum_3[i]=0.0;
sum_4[i]=0.0;
for(int k=0;k<daynumber;k++)
{
//ratio[k][i]=data1[k].pricesequence[i];///data1[k].loadsequence[i];
sum_1[i]+=data[k].loadsequence[i];
//cout<<"sum_1[i]="<<sum_1[i]<<endl;
sum_2[i]+=data[k].pricesequence[i];
}
averagex[i]=sum_1[i]/(daynumber);
averagey[i]=sum_2[i]/(daynumber);
for(k=0;k<daynumber;k++)
{
sum_3[i]+=(data[k].loadsequence[i]-averagex[i])*(data[k].loadsequence[i]-averagex[i]);
sum_4[i]+=(data[k].loadsequence[i]-averagex[i])*(data[k].pricesequence[i]-averagey[i]);
}
a[i]=sum_4[i]/sum_3[i];
//cout<<"a[i]="<<a[i]<<endl;
b[i]=averagey[i]-a[i]*averagex[i];
}
}
/*
void correct(double x[])
{
double averagex[N];
double averagey[N];
double sumx[N];
double sumy[N];
double sx[N];
double sy[N];
double coefficient[N];
double constant[N];
//number=22;
/*
for(int k=1;k<=number;k++)
for(int i=0;i<N;i++)
{
Data1[k-1].loadsequence[i]=data1[k].loadsequence[i]-data1[k-1].loadsequence[i];
Data1[k-1].pricesequence[i]=data1[k].pricesequence[i]-data1[k-1].pricesequence[i];
}
*/
/*
for(int i=0;i<N;i++)
{
sumx[i]=0.0;
sumy[i]=0.0;
for(int k=1;k<=number;k++)
{
sumx[i]+=Data1[k-1].loadsequence[i];
sumy[i]+=Data1[k-1].pricesequence[i];
}
averagex[i]=sumx[i]/number;
averagey[i]=sumy[i]/number;
sx[i]=0.0;
sy[i]=0.0;
for(k=1;k<=number;k++)
{
sx[i]+=(Data1[k-1].loadsequence[i]-averagex[i])*(Data1[k-1].pricesequence[i]-averagey[i]);
cout<<"sx[i]="<<sx[i]<<endl;
sy[i]+=(Data1[k-1].loadsequence[i]-averagex[i])*(Data1[k-1].loadsequence[i]-averagex[i]);
}
coefficient[i]=sx[i]/sy[i];
constant[i]=averagey[i]-coefficient[i]*averagex[i];
//deltay[i]=constant[i]+coefficient[i]*x[i];
cout<<"deltay[i]="<<deltay[i]<<endl;
}
}
*/
double yuce(int interval)
{
//double x[N];
double q;
//for(int i=0;i<N;i++)
// x[i]=data2[daynumber].loadsequence[i]-data1[number].loadsequence[i];
// correct(x);
forcastprice[interval]=a[interval]*data[daynumber].loadsequence[interval]+b[interval];
//cout<<"forcastcoefficient[i]="<<forcastcoefficient[i]<<endl;
//forcastprice[i]=forcastcoefficient[i]*data2[daynumber].loadsequence[i];
if(forcastprice[interval]>maxprice) forcastprice[interval]=maxprice;
q=forcastprice[interval];
forcasterror[interval]=(forcastprice[interval]-data[daynumber].pricesequence[interval])/data[daynumber].pricesequence[interval];
// if(fabs(forcasterror[interval])>maxerror) maxerror=fabs(forcasterror[interval]);
//meanerror+=fabs(forcasterror[interval]);
cout<<"第"<<interval+1<<"预测电价"<<forcastprice[interval]<<" ";
cout<<"第"<<interval+1<<"实际电价 "<<data[daynumber].pricesequence[interval]<<endl;
//cout<<"第"<<interval+1<<"相对误差"<<100*forcasterror[interval]<<"%"<<endl;
//cout<<endl;
////fp<<endl;
return q;
}
/*
void regressioncoefficientchecking( )
{
double ta[N];
double tb[N];
double sum=0.0;
double loadsum[N];
double loadaverage[N];
double standarderr[N];
double astandarderr[N];
double bstandarderr[N];
double revluation[daynumber];
double yevluation[N];
double Ta_5=2.051;
for(int i=0;i<N;i++)
{
yevluation[i]=0.0;
for(int k=0;k<=number;k++)
{
revluation[k]=(forcastprice[i]-(a[i]*data1[k].loadsequence[i]+b[i]))*(forcastprice[i]-(a[i]*data1[k].loadsequence[i]+b[i]));
yevluation[i]+=revluation[k];
}
}
for(i=0;i<N;i++)
{
loadsum[i]=0.0;
loadaverage[i]=0.0;
for(int k=0;k<=number;k++)
loadsum[i]+=data1[k].loadsequence[i];
for(k=0;k<=number;k++)
loadaverage[i]+=(data1[k].loadsequence[i]-loadsum[i]/(number+1))*(data1[k].loadsequence[i]-loadsum[i]/(number+1));
loadaverage[i]=sqrt(loadaverage[i]);
}
for(i=0;i<N;i++)
{
standarderr[i]=sqrt(yevluation[i]/(number+1-2));
bstandarderr[i]=standarderr[i]/sqrt(number+1);
astandarderr[i]=standarderr[i]/loadaverage[i];
}
cout<<"相似天数为"<<number+1<<endl;
for(i=0;i<N;i++)
{
cout<<endl;
ta[i]=fabs(a[i])/astandarderr[i];
cout<<"ta["<<i<<"]="<<ta[i]<<endl;
tb[i]=fabs(b[i])/bstandarderr[i];
//if(ta[i]>Ta_5) cout<<"a["<<i<<"]与零有显著差异"<<endl;
// else cout<<"a["<<i<<"]与零无显著差异"<<endl;
// if(tb[i]>Ta_5) cout<<"b["<<i<<"]与零有显著差异"<<endl;
// else cout<<"b["<<i<<"]与零无显著差异"<<endl;
}
//for(i=0;i<N;i++)
{
// if(ta[i]>Ta_5&&tb[i]>Ta_5)
{
// cout<<"ta["<<i<<"]="<<ta[i]<<endl;
// cout<<"tb["<<i<<"]="<<tb[i]<<endl;
}
}
}
*/
/*
//int num_dat;
double z;
void iapcir(double *x,double *y,int n,double *a,int m,double *dt)
{
int i,j,k;
double p,c,g,q,d1,d2,s[100],t[100],b[100];
for (i=0; i<=m-1; i++) a[i]=0.0;
if (m>n) m=n;
if (m>20) m=20;
z=0.0;
for (i=0; i<=n-1; i++) z=z+x[i]/(1.0*n);
b[0]=1.0; d1=1.0*n; p=0.0; c=0.0;
for (i=0; i<=n-1; i++)
{
p=p+(x[i]-z); c=c+y[i];}
c=c/d1; p=p/d1;
a[0]=c*b[0];
if (m>1)
{
t[1]=1.0; t[0]=-p;
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; i++)
{
q=x[i]-z-p; d2=d2+q*q;
c=c+y[i]*q;
g=g+(x[i]-z)*q*q;
}
c=c/d2; p=g/d2; q=d2/d1;
d1=d2;
a[1]=c*t[1]; a[0]=c*t[0]+a[0];
}
for (j=2; j<=m-1; j++)
{
s[j]=t[j-1];
s[j-1]=-p*t[j-1]+t[j-2];
if (j>=3)
for (k=j-2; k>=1; k--)
s[k]=-p*t[k]+t[k-1]-q*b[k];
s[0]=-p*t[0]-q*b[0];
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; i++)
{
q=s[j];
for (k=j-1; k>=0; k--)
q=q*(x[i]-z)+s[k];
d2=d2+q*q; c=c+y[i]*q;
g=g+(x[i]-z)*q*q;
}
c=c/d2; p=g/d2; q=d2/d1;
d1=d2;
a[j]=c*s[j]; t[j]=s[j];
for (k=j-1; k>=0; k--)
{
a[k]=c*s[k]+a[k];
b[k]=t[k];
t[k]=s[k];
}
}
dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;
for (i=0; i<=n-1; i++)
{
q=a[m-1];
for (k=m-2; k>=0; k--)
q=a[k]+q*(x[i]-z);
p=q-y[i];
if (fabs(p)>dt[2]) dt[2]=fabs(p);
dt[0]=dt[0]+p*p;
dt[1]=dt[1]+fabs(p);
}
return;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -