📄 模糊指数平滑.txt
字号:
#include<iostream.h>
#include<math.h>
void fuzzysmooth(int nHisFirst, int nHisLast, int nForeFirst, int nForeLast, double* pData, double* xy)
{
double x[100];
for(int i = 0; i <= nHisLast - nHisFirst; i++)
{
x[i] = pData[i];
}
// BuildModel();
double a;
double s1[100],s2[100],ay[100],by[100];
int T,L,J,M;
T= nHisLast - nHisFirst + 1; //历史数据个数
L= - nForeFirst + nForeLast + 1;//待测数据个数
J=20;
M=2;
s1[0]=x[0];
s2[0]=x[0];
ay[0]=x[0];
by[0]=0;
xy[0]=x[0];
// a=ding();
/////////////////////////////////////////////
int l,j,t;
double u[100];
static double xx[50][50];
static double r[50][50];
// static double xy[50];
double y[100];
double max,min,g=0.0,b=0.0;
/* 形成xx阵 */
for(j=0;j<J;j++)
{
y[j]=j*1.0/J;
s1[0]=x[0];
s2[0]=x[0];
ay[0]=x[0];
by[0]=0.0;
for(t=1;t<T;t++)
{
s1[t]=y[j]*x[t]+(1-y[j])*s1[t-1];
s2[t]=y[j]*s1[t]+(1-y[j])*s2[t-1];
ay[t]=2*s1[t]-s2[t];
by[t]=(s1[t]-s2[t])*y[j]/(1-y[j]);
xy[t]=ay[t-1]+by[t-1];
xx[0][j]+=fabs(xy[t]-x[t])/(T-1);
xx[1][j]+=pow(x[t]-xy[t],2)/(T-1);
xx[3][j]+=pow(x[t]-xy[t],2)/(T-1-M);
}
xx[2][j]=sqrt(xx[1][j]);
xx[3][j]=sqrt(xx[3][j]);
}
/* 形成R阵 */
for(i=0;i<4;i++)
{
max=xx[0][0];
min=xx[0][0];
for(j=0;j<J;j++)
if(xx[i][j]>max) max=xx[i][j];
else if(xx[i][j]<min) min=xx[i][j];
for(j=0;j<J;j++)
r[i][j]=(max-xx[i][j])/(max-min);
}
/* 各方案u值 */
for(j=0;j<J;j++)
{
for(i=0;i<4;i++)
{
g+=pow(1-r[i][j],2);
b+=pow(r[i][j],2);
}
u[j]=1.0/(1+g/b);
}
/*确定最优各方案 */
max=u[0];
l=0;
for(j=0;j<J;j++)
if(u[j]>max)
{
max=u[j];
l=j;
}
a=u[l];
///////////////////////////////////////////
/* i<T */
for(i=1;i<T;i++)
{
s1[i]=a*x[i]+(1-a)*s1[i-1];
s2[i]=a*s1[i]+(1-a)*s2[i-1];
ay[i]=2*s1[i]-s2[i];
by[i]=(s1[i]-s2[i])*a/(1-a);
xy[i]=ay[i-1]+by[i-1];
}
/* i>=T */
for(i=1;i<=L;i++)
{
xy[T-1+i]=ay[T-1]+by[T-1]*(i);
}
xy[0] = x[0];
xy[1] = x[1];
}
void main()
{
double xy[100];
int nHisFirst=1990,nHisLast=1993,nForeFirst=1994,nForeLast=1994;
static double pData[20]={583.1461,615.0973,684.7702,857.4556};
fuzzysmooth(nHisFirst,nHisLast,nForeFirst,nForeLast,pData,xy);
cout<<"预测值:"<<endl;
for(int i=0;i<=- nForeFirst + nForeLast;i++)
{
cout<<"forecast["<<i+nForeFirst<<"]="<<xy[i+nHisLast - nHisFirst + 1]<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -