⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duishu.cpp

📁 使用对树模型进行电力系统负荷预测 效果比较理想 vc++ 编制
💻 CPP
字号:
#include "stdio.h"
#include "iostream.h"
#include "math.h"
#include "fstream.h"
#include "Windows.h"
int n;														//数据点数
double x[],y[];												//存放n个数据点。要求所有的x,y>0
double a[3];												//返回拟合函数的参数以及各种统计量。其意义如下:
															//a(0):拟合函数y=b+ax中的b
															//a(1):拟合函数y=b+ax中的a
															//a(2):偏差平方和q
						

void log1(int n,double *xj,double *yj,double *a);			//xj,yj,a的是数组,前面要加*号
int main()
{
	::DeleteFile(("ds.rtn"));
	::DeleteFile(("ds.flg"));
	int n;													//n为年数,即数据的点数
	int p;													//预测目标年份p
	double q;												//q为预测后的负荷
	double a[7];
	double x[20];											//x数组用以存放年份序列
	double y[20];											//y数组用以存放负荷序列
	double yi[20];											//yi数组用以存放预测后符合序列

	double xj[20];											//线性化后的x
	double yj[20];											//线性化后的y
//1.文件读入	
	ifstream ifile("ds.in");								//读入文件ds.in
	if (ifile.fail())
	return 1;

	int   count=0;   
	char   s[100]; 
	while(!ifile.eof())
	{
		ifile.getline(s,sizeof(s));
		count++;
	}														//确定年数n
	if (count<5)											//如果小于5年停止预测
		return 0;									
    	
	FILE *fp;												//格式化读取文件
	fp=fopen("ds.in","r");
	for (int i1=0;i1<count;i1++)
	{
		fscanf(fp,"%lf,%lf",&x[i1],&y[i1]);
	}

	ifile.close();											//关闭文件

	int i2=0;
	while(i2<count)											//异常处理
	{
		if(x[i2]*y[i2]<0)
		{	ofstream err1("ds.rtn");
			err1<<0;
			ofstream err2("ds.flg");
			err2.close();
			return 0;
		}
		else
		i2++;
	}
	
//2.求参数a,b的值以确定函数表达式			
	
	n=count;												//年数
	for(int j=0;j<n;j++){									//线性化;
		xj[j]=log(x[j]);
		yj[j]=y[j];
	}
	log1(n,xj,yj,a);
	double b;
	b=a[0];
	cout<<"a="<<a[1]<<endl;
	cout<<"b="<<b<<endl;//确定a,b的值
//3.读入预测目标年份并输出预测结果
	ifstream inyearfile("year.in");							//取得预测目标年份p
	if (inyearfile.fail())
	return 1;
	inyearfile>>p;
	inyearfile.close();
			
	ofstream ofile("ds.out");								//输出预测结果ds.out
	for(int i=0;i<p-x[0]+1;i++)
	{
		q=b+a[1]*log(x[0]+i);
		yi[i]=q;					
		ofile<<x[0]+i<<","<<q<<endl;
	}							
//4.计算评估参数:平均相对误差avxdwc,F值,及预测精度。		
	double xdwc[20];										//定义相对误差;相对误差是指绝对误差与原始数据的比值,
	for(i=0;i<count;i++){
		q=b+a[1]*log(x[0]+i);
		xdwc[i]=fabs((q-y[i])/y[i]);						//相对误差序列	
		
	}

	double avxdwc;											//求各相对误差的和,其平均值即为平均相对误差q%
	double sumxdwc=0.00000;
	int t1=0;
	while (t1<n){
		sumxdwc=sumxdwc+xdwc[t1];
		t1++;
	}
	avxdwc=sumxdwc/count*100;								//求得平均相对误差
	
	int t2=0;
	double avy;												//avy为y原始序列的平均值
	double sumy=0.00;										//sumy为y原始序列的求和
	while (t2<n)
	{
		sumy=sumy+y[t2];
		t2++;
	}
	avy=sumy/count;
															//求得原始序列平均值
													
	int t3=0;	
	double SSR=0.00;										//回归平方和SSR
	while (t3<n)
	{
		SSR=SSR+(yi[t3]-avy)*(yi[t3]-avy);
		t3++;
	}
															//求得并输出回归平方和

	int t4=0;
	double SSE=0.00;										//残差平方和SSE
	while (t4<n)
	{
		SSE=SSE+(y[t4]-yi[t4])*(y[t4]-yi[t4]);
		t4++;
	}
															//求得并输出残差平方和SSE
	
	double F;												//F值
	F=(n-2)*SSR/SSE;
	cout.setf(ios::scientific);
															//求得并输出F值
	
	int level;												//判断精确度
	if (avxdwc<=0.01)
		level=1;
	else
		if(avxdwc>0.01&&avxdwc<=1.05)
			level=2;
		else
			if(avxdwc>0.05&&avxdwc<=0.1)
				level=3;
			else
				if(avxdwc>0.1)
					level=4;
//5.输出评估参数到文件pinggu.out
	ofstream pgfile("pinggu.out");							//输出评估参数至pinggu.out
	pgfile.setf(ios::scientific);						
	pgfile<<avxdwc<<","<<F<<",";							//写入平均相对误差及F值
	pgfile<<level;											//输出精确度值
	
	ofstream err2("ds.flg");
			err2.close();
	ofstream err1("ds.rtn");
			err1<<1;
	return 0;
}
//6.参数运算子程序
void log1(int n,double *xj,double *yj,double *a)		//参数a、b运算子程序  在函数定义时也要注明形参的类型
{														
	int i;
	double xx,yy,dx,dxy;
	xx=0.0;
	yy=0.0;
	for(i=0; i<=n-1; i++)
	{
		xx=xx+xj[i]/n;
		yy=yy+yj[i]/n;
	}
	dx=0.0;
	dxy=0.0;
	for(i=0; i<=n-1; i++)
	{
		a[2]=xj[i]-xx;
		dx=dx+a[2]*a[2];
		dxy=dxy+a[2]*(yj[i]-yy);
	}
	a[1]=dxy/dx;
	a[0]=yy-a[1]*xx;
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -