ФЕДЕРАЛЬНАЯ СЛУЖБА ПО ГИДРОМЕТЕОРОЛОГИИ И МОНИТОРИНГУ ОКРУЖАЮЩЕЙ СРЕДЫ (Росгидромет)

 

Программа написана под Builder 6.0 для среды Windows XP.
Текст основного модуля программы.
//------------------------------------------------------------------
//Программа метода прогнозирования динамики метеопараметров с учетом скрытых цикличностей, выделенных на основе анализа фазовых портретов их временных рядов //

За полным тестом программы обращаться по адресу: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Фрагменты листинга программы

#include <stdio.h>
#include <math.h>
#define  SI 184                 
#define N 47                    //длина исходного ряда
#define SIZ 185               
FILE *REZ;
float power(float a, int b);
float a[SI];
float H;
float DEL_DX=1.;
float C,S,xx;
float A[SI][SIZ];
float X[SIZ];
float YY[N],YYY[N];
//Входные данные. Временной ряд метеопараметров (сумма среднегодовых осадков)
float Y[N]={377.4,  520.4,  445.6,  571.2,  548.1,  599.3,  639,  432,  571,  521,  388,  592,  586,  480,  502,  706.2,  489.9,  489.7,  596.5,  690,  671,  454,  673,  539.9,  427.5,  476,  556.2,  600,  574.3,  659.1,  541,  359.8,  654.4,  642.7,  833.3,  570.7,  560.7,  686,  595.7,  395,  709,  492,  659,  486,  687,  590,  515};
float XX[N]={0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,
26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,
39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0};
int main ()
{
int i,j,k,l;
int k1,k2,l1,l2,m1,m2;
int i1,i2,j1,j2;
int m,n,jj;
H=0.99999/DEL_DX;
for(i=0; i<SI; i++)
{
for(j=0; j<(SI+1); j++)
{
A[i][j]=0.0;
}
}
i=2;
j=2;
k=0;
AZ1: j1=j+1;
A[i][j]=2.0;
A[i][j1]=6*XX[k];
i=i+4;
j=j+4;
k=k+1;
if (i<SI) goto AZ1;
i=6;
j=2;
k=1;
AZ2: j1=j+1;
A[i][j]=-2.0;
A[i][j1]=-6*XX[k];
i=i+4;
j=j+4;
k=k+1;
if (i<SI) goto AZ2;
A[SI-1][SI-2]=2.0;
A[SI-1][SI-1]=6.0*XX[SI/4];
k=0;
l=0;
m=0;
AZ3: i=l;
     i1=l+1;
     k1=k;
     k2=k+4;
m1=m+1;
for(j=k1; j<k2; j++)
{
A[i][j]=power(XX[m],(j));
A[i1][j]=power(XX[m1],(j));
}
for(j=k1; j<k2; j++)
{
j1=j+4;
A[i][j]=(j-k)*power(XX[m],(j-1));
A[i][j1]=-(j1-k2)*power(XX[m],(j11));
}
k=k+4;
l=l+4;
m=m+1;
if(l<(SI-3)) goto AZ4;
for(i=0,m=0; i<SI; i+=4)
{
i1=i+1;
m1=m+1;
A[i][SI]=Y[m];
A[i1][SI]=Y[m1];
m++;
}
REZ=fopen("rez.dat","w");
xx=0.0;
for(i=0; i<(N-1); i++)
{
double c1,c2,c3,c4;
n=floor(xx);
   c1=X[4*n];
   c2=X[4*n+1];
   c3=X[4*n+2];
   c4=X[4*n+3];
YY[i]=c1+c2*xx+c3*power(xx,2)+c4*power(xx,3);
YYY[i]=c2+2*c3*xx+3*c4*power(xx,2);
fprintf(rez," %.2f  %.fe \n",YY[i],YYY[i]);
xx=xx+H;
}
fclose (REZ);

float power(float a, int b)
{
int i;
float T;
T=1.;
for(i=1; i<=b; i++)
{
T=T*a;
}
return (T);
}

Листинг программы прогноза значений временных рядов
метеопараметров

#include <stdio.h>
#include <math.h>
#define SI 14
#define SIZ 15
#define N 40
#define NN 6
#define NX 47
FILE *P;
float X[SI],A[SI][SIZ];
//Входные данные. Временной ряд метеопараметров (сумма среднегодовых осадков)
float Y[N]={377.4,520.4,445.6,571.2,548.1,599.3,639,432,571,521,388,592,586,
480,502,706.2,489.9,489.7,596.5,690,671,454,673,539.9,427.5,476,556.2,600,574.3,
659.1,541,359.8,654.4,642.7,833.3,570.7,560.7,686,595.7,395};
//,709,492,659,486,687,590,515};  //прогнозируемые значения временного ряда
float t[N]={0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,
26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0};

float tt[NX]={0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,
26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,
40.0,41.0,42.0,43.0,44.0,45.0, 46.0};
//Цикличности: 2.0, 5.3, 7.2, 9.2, 13.2, 15.5
float T[NN]={2.0, 5.0, 7.0, 9.0, 12.5, 15.5};
float C;
float u, uu;
int main()
{
int i,j,k,l,ll;
P=fopen("p.dat","wt");
for (i=0; i<SI; i++) {
for (j=0; l<SIZ; l++) {
 }}
i=0;
j=0;
A[i][j]=N;
for (k=0; k<N; k++){
 j=1;
 A[i][j]+=t[k];
 }
fprintf(P,"%d %d %f\n",i,j,A[i][j]);
l=0;
for (j=(NN+2); j<SI; j++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=sin((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
i=1;
 for (k=0; k<N; k++){
 j=0;
 A[i][j]+=t[k]; }
for (k=0; k<N; k++){
j=1;
 A[i][j]+=t[k]*t[k];  }
l=0;
l=0;
for (j=(NN+2); j<SI; j++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=t[k]*sin((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
j=0;
l=0;
for(i=2; i<(NN+2); i++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=cos((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
j=1;
l=0;
l=l+1;
}
ll=0;
for (i=2; i<(NN+2); i++) {
l=0;
for (j=2; j<(NN+2); j++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=cos((2.*M_PI*t[k])/T[l])*cos((2.*M_PI*t[k])/T[ll]);
}
l=l+1;
}
ll=ll+1;
}
ll=0;
l=0;
j=0;
for(i=(NN+2); i<SI; i++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=sin((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
l=0;
j=1;
for (i=(NN+2); i<SI; i++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=t[k]*sin((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
ll=0;
for (i=(NN+2); i<SI; i++) {
l=0;
for (j=2; j<(NN+2); j++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=cos((2.*M_PI*t[k])/T[l])*sin((2.*M_PI*t[k])/T[ll]);
}
l=l+1;
}
ll=ll+1;
}
 ll=0;
for (i=(NN+2); i<SI; i++) {
l=0;
for (j=(NN+2); j<SI; j++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=sin((2.*M_PI*t[k])/T[l])*sin((2.*M_PI*t[k])/T[ll]);
}
l=l+1;
}
ll=ll+1;
}
j=SI;
l=0;
for (i=(NN+2); i<SI; i++) {
A[i][j]=0;
for (k=0; k<N; k++) {
A[i][j]+=Y[k]*sin((2.*M_PI*t[k])/T[l]);
}
l=l+1;
}
for (i=0; i<SI; i++) {
for (j=0; j<SIZ; j++) {
}
}
for (i=0; i<(SI-1); i++)
{
int mm=2;
for(int j=0; j<NN; j++) {
double Am, Bm,r,Bet;
Am=X[mm];
Bm=X[mm+NN];
r=sqrt(Am*Am+Bm*Bm);
Bet=atan(Bm/Am);
mm=mm+1;
}
//Прогнозирование
for (k=N; k<NX; k++) {
int m=2;
uu=0;
for(int j=0; j<NN; j++) {
uu+=X[m]*cos((2.*M_PI*tt[k])/T[j])+X[m+NN]*sin((2.*M_PI*tt[k])/T[j]);
m=m+1;
}
u=(uu+X[0]+X[1]*tt[k]);
//Выходные данные. Прогнозные значения исходного временного ряда
fprintf(P,"u= %f   прогноз=%f\n",tt[k],u);
}
fclose(P);
return(0);
}

Пример фазового портрета

Portr