📄 加权一阶局域预测法对logistic影射进行预测.txt
字号:
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#define NUM 3
#define L 200
void Pre_Next_Arrvl(int* array, int num, int parameter_m, int parameter_T, int* data_pre);
//record data for multi-simulation
//static int Get_Stat(int* Actual,int* Predicted,int Num,int parameter_m,int parameter_T);
//record data for single-simulation
void Get_Stat(int* Actual,int* Predicted,int Num);
void Logistic_get(int number, double* out);
void main(void)
{
int i,j;
int data[L];
double output[10000];
int k = 10000;
int T = 3;
int m = 2;
int temp_pks;
int Num_need_to_Pre=400;
int Predicted_Arrvl[400];
int Actual_Arrvl[400];
Logistic_get(k,output);
for( i = 3000; i < 3000 + Num_need_to_Pre; i++ )
{
for(j = 0; j < L; j++)
{
data[j] = output[i+j] * 1000;
}
Pre_Next_Arrvl(data,L,m,T,&temp_pks);
Predicted_Arrvl[i - 3000] = temp_pks;
Actual_Arrvl[i - 3000] = output[i + L] * 1000;
}
//record data for single-simulation
Get_Stat(Actual_Arrvl,Predicted_Arrvl,Num_need_to_Pre);
}
void Pre_Next_Arrvl(int* array, int num, int parameter_m, int parameter_T, int* data_pre)
{
int position[NUM];
int distance[NUM];
int temp;
int i, j, k;
double temp_w,weighted[NUM];
double coe1 = 0, coe2 = 0, e_wf = 0, f_wf = 0;
double a_1, b_1;
int range;
range = num / ((parameter_m - 1) * parameter_T) - 2; //attention, please!!! why " - 2 " ?
for (i = 0; i < NUM; i++){ //initiate the array distance[] and position[]
position[i] = 0;
distance[i] = 0;
}
//find the nearest neighbers
for (k = 0; k < NUM; k++)
{
for (i = 0; i < parameter_m; i++)
{
distance[k] += (array[num - 1 - (parameter_m - 1) * parameter_T + i * parameter_T] - array[(num - 1 - (range + 1) * (parameter_m - 1) * parameter_T) + k + i * parameter_T]) * (array[num - 1 - (parameter_m - 1) * parameter_T + i * parameter_T] - array[(num - 1 - (range + 1) * (parameter_m - 1) * parameter_T) + k + i * parameter_T]);
}
position[k] = (num - 1 - (range + 1) * (parameter_m - 1) * parameter_T + k);
}
//rank the distance[]
for (i = 0; i < NUM - 1; i++)
{
for(j = i + 1; j < NUM; j++)
{
if(distance[i] > distance[j])
{
temp = distance[i];
distance[i] = distance[j];
distance[j] = temp;
temp = position[i];
position[i] = position[j];
position[j] = temp;
}
}
}
for (i = (num - 1 - (range + 1) * (parameter_m - 1) * parameter_T) + NUM; i < num - 1 - 2 * (parameter_m - 1) * parameter_T ; i++)
//find the nearest neighber of a data in a range in order to ensure they are
{ //in the different orbit and also have some relation
temp = 0;
for (j = 0; j < parameter_m; j++)
{
temp += (array[num - 1 - (parameter_m - 1) * parameter_T + j * parameter_T] - array[i + j * parameter_T]) * (array[num - 1 - (parameter_m - 1) * parameter_T + j * parameter_T] - array[i + j * parameter_T]);
}
//update the nearest neighbers
if(temp < distance[NUM - 1])
{
for(k = 0; k < NUM -1; k++)
{
if(temp < distance[k])
{
for(j = NUM - 1; j > k; j--)
{
distance[j] = distance[j - 1];
position[j] = position[j - 1];
}
distance[k] = temp;
position[k] = i;
break;
}
}
}
}
temp_w = 0;
for(i = 0; i < NUM; i++)
{
temp_w += exp((double)(-(distance[i] - distance[0]) / (distance[0] + 1)));
}
for(i = 0; i < NUM; i++)
{
weighted[i] = exp((double)(-(distance[i] - distance[0]) / (distance[0] + 1))) /temp_w;
}
//computing the coefficience of the fuction
for(i = 0; i < NUM; i++)
{
for(j = 0; j < parameter_m; j++)
{
coe1 += weighted[i] * array[position[i] + j * parameter_T];
coe2 += weighted[i] * array[position[i] + j * parameter_T] * array[position[i] + j * parameter_T];
e_wf += weighted[i] * array[position[i] + j * parameter_T] * array[position[i] + 1 + j * parameter_T];
f_wf += weighted[i] * array[position[i] + 1 + j * parameter_T];
}
}
b_1 = (coe1 * f_wf - parameter_m * e_wf) / (coe1 * coe1 - coe2 * parameter_m);
a_1 = (f_wf - coe1 * b_1) / parameter_m;
printf("a is %f <<=>> b is %f\n",a_1,b_1);
*data_pre = a_1 + b_1 * array[num - 1];
}
void Logistic_get(int number, double* out)
{
int i;
double x = 0.1;
double u = 4.0;
for (i = 0; i < number; i++)
{
out[i] = u * x * (1 - x);
x = out[i];
}
}
void Get_Stat(int* Actual,int* Predicted,int Num)
{
double error_rate;
int i;
int k;
FILE *fp1;
FILE *fp2;
error_rate=0;
k=0;
fp1=fopen("actual_arrival.txt","wb");
if(fp1==NULL)
printf("can not open actual_arrival.txt.\n");
fp2=fopen("predicted_arrival.txt","wb");
if(fp2==NULL)
printf("can not open predicted_arrival.txt.\n");
for(i=0;i<Num;i++)
{
fprintf(fp1,"%d",Actual[i]);
fputc(' ',fp1);
printf("%d ",Actual[i]);
}
printf("\n");
for(i=0;i<Num;i++)
{
fprintf(fp2,"%d",Predicted[i]);
fputc(' ',fp2);
printf("%d ",Predicted[i]);
}
printf("\n");
fclose(fp1);
fclose(fp2);
for(i=0;i<Num;i++)
{
if(Actual[i]!=0)
{
error_rate+=(double)(fabs(Actual[i]-Predicted[i])/Actual[i]);
k++;
}
}
error_rate=error_rate/k;
printf("Average Predicted Error Rate: %f.\n",error_rate);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -