📄 duishu.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 + -