用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

java 带残差修正的灰色算法

2015-03-24 作者: java源代码大全举报

[java]代码库

import java.lang.Math.* ;
import java.util.*;

public class my_marcof {
	static double a=0,b=0,a_error=0,b_error=0;
	static protected  void Cal_param(int num,double arr[]){
		   double []arr1=new double[num];//经过一次累加数组
		   double sum=0;
		   for(int i=0;i<num;i++)
		   {
		    sum+=arr[i];
		    arr1[i]=sum;
		    //System.out.println("arr1["+i+"]="+arr1[i]+";");//同上
		   }
		   double []arr2=new double [num-1];//arr1的紧邻均值数组
		   for(int i=0;i<num-1;i++)
		   {
		    arr2[i]=(double)(arr1[i]+arr1[i+1])/2;
		    //System.out.println("arr2["+i+"]="+arr2[i]+";");//同上
		   }
		   /*
		    * 
		    下面建立
		    向量B和YN求解待估参数向量,
		    即求参数a,b
		    
		    */
		   /*
		    下面建立向量B,
		    B是5行2列的矩阵,
		    相当于一个二维数组。
		    */
		   double[][]B=new double[num-1][2];
		   for(int i=0;i<num-1;i++)
		   {
		    for(int j=0;j<2;j++)
		    {
		     if(j==1)
		      B[i][j]=1;
		     else
		      B[i][j]=-arr2[i];
		     //System.out.println("B["+i+"]["+j+"]="+B[i][j]+";");
		    }
		    
		   }
		   /*
		    下面建立向量YN*/
		   double [][]YN=new double[num-1][1];
		   for(int i=0;i<num-1;i++)
		   {
		    for(int j=0;j<1;j++)
		    {
		     YN[i][j]=arr[i+1];
		     //System.out.println("YN["+i+"]["+j+"]="+YN[i][j]+";");
		    }
		   }
		   
		   /*
		     B的转置矩阵BT,2行5列的矩阵
		    */
		   double[][]BT=new double[2][num-1];
		   for(int i=0;i<2;i++)
		   {
		    for(int j=0;j<num-1;j++)
		    {
		     BT[i][j]=B[j][i];
		     //System.out.println("BT["+i+"]["+j+"]="+BT[i][j]+";");
		    }
		   }
		   /*
		     将BT和B的乘积所得到的结果记为数组B2T,则B2T是一个2*2的矩阵*/
		   double [][]B2T=new double [2][2];
		   for(int i=0;i<2;i++){//rows of BT

		   {
		    for(int j=0;j<2;j++)//cloums of B
		    {
		    for(int k=0;k<num-1;k++)//cloums of BT=rows of B
		    {
		     B2T[i][j]=B2T[i][j]+BT[i][k]*B[k][j];
		    }
		     //System.out.println("B2T["+i+"]["+j+"]="+B2T[i][j]+";");
		    }

		   }
		           }
		   /*下面求B2T的逆矩阵,设为B_2T,怎么适用于一般的矩阵?*/
		   double [][]B_2T=new double [2][2];
		   B_2T[0][0]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*B2T[1][1];
		   B_2T[0][1]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*(-B2T[0][1]);
		   B_2T[1][0]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*(-B2T[1][0]);
		   B_2T[1][1]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*B2T[0][0];
		   for(int i=0;i<2;i++)
		   {
		    for(int j=0;j<2;j++)
		    {
		     //System.out.println("B_2T["+i+"]["+j+"]="+B_2T[i][j]+";");
		    }
		   }
		   /*根据以上所求的各已知量下面求待估参数的未知量a和b,待估向量矩阵等于B_2T*BT*YN 
		    下面我们分别求这些矩阵的乘积,首先求B_2T*BT,令B_2T*BT的乘积为A矩阵,则A就是一个2*5的矩阵*/
		   /*
		    * 
		    * 
		    * 
		    * 下面先求A矩阵*/
		   double [][]A=new double[2][num-1];
		   for(int i=0;i<2;i++){//rows of B_2T
		    {
		     for(int j=0;j<num-1;j++)//cloums of BT
		     {
		     for(int k=0;k<2;k++)//cloums of B_2T=rows of BT
		     {
		      A[i][j]=A[i][j]+B_2T[i][k]*BT[k][j];
		     }
		      //System.out.println("A["+i+"]["+j+"]="+A[i][j]+";");
		     }

		    }
		            } 
		   /*
		    * 
		    * 
		    * 下面求A和YN矩阵的乘积,令乘积为C矩阵,则C就是一个2*1的矩阵*/
		   double [][]C=new double[2][1];
		   for(int i=0;i<2;i++){//rows of A

		    {
		     for(int j=0;j<1;j++)//cloums of YN
		     {
		     for(int k=0;k<num-1;k++)//cloums of A=rows of YN
		     {
		      C[i][j]=C[i][j]+A[i][k]*YN[k][j];
		     }
		      //System.out.println("C["+i+"]["+j+"]="+C[i][j]+";");
		     }

		    }
		            } 
		  /*根据以上所得则a=C[0][0],b=C[1][0];*/
		      a=C[0][0];
		      b=C[1][0];
		     //System.out.println("a="+a+";"+"b="+b+";");
		     //System.out.println("b/a="+b/a);
		     /*
		      * 
		      * 
		      *
		      */
		}    
    static protected void Cal_errorpm(int num,double arr[]){
		   double []arr1=new double[num];//经过一次累加数组
		   double sum=0;
		   for(int i=0;i<num;i++)
		   {
		    sum+=arr[i];
		    arr1[i]=sum;
		    //System.out.println("arr1["+i+"]="+arr1[i]+";");//同上
		   }
		   double []arr2=new double [num-1];//arr1的紧邻均值数组
		   for(int i=0;i<num-1;i++)
		   {
		    arr2[i]=(double)(arr1[i]+arr1[i+1])/2;
		    //System.out.println("arr2["+i+"]="+arr2[i]+";");//同上
		   }
		   /*
		    * 
		    下面建立
		    向量B和YN求解待估参数向量,
		    即求参数a,b
		    
		    */
		   /*
		    下面建立向量B,
		    B是5行2列的矩阵,
		    相当于一个二维数组。
		    */
		   double[][]B=new double[num-1][2];
		   for(int i=0;i<num-1;i++)
		   {
		    for(int j=0;j<2;j++)
		    {
		     if(j==1)
		      B[i][j]=1;
		     else
		      B[i][j]=-arr2[i];
		     //System.out.println("B["+i+"]["+j+"]="+B[i][j]+";");
		    }
		    
		   }
		   /*
		    下面建立向量YN*/
		   double [][]YN=new double[num-1][1];
		   for(int i=0;i<num-1;i++)
		   {
		    for(int j=0;j<1;j++)
		    {
		     YN[i][j]=arr[i+1];
		     //System.out.println("YN["+i+"]["+j+"]="+YN[i][j]+";");
		    }
		   }
		   
		   /*
		     B的转置矩阵BT,2行5列的矩阵
		    */
		   double[][]BT=new double[2][num-1];
		   for(int i=0;i<2;i++)
		   {
		    for(int j=0;j<num-1;j++)
		    {
		     BT[i][j]=B[j][i];
		     //System.out.println("BT["+i+"]["+j+"]="+BT[i][j]+";");
		    }
		   }
		   /*
		     将BT和B的乘积所得到的结果记为数组B2T,则B2T是一个2*2的矩阵*/
		   double [][]B2T=new double [2][2];
		   for(int i=0;i<2;i++){//rows of BT

		   {
		    for(int j=0;j<2;j++)//cloums of B
		    {
		    for(int k=0;k<num-1;k++)//cloums of BT=rows of B
		    {
		     B2T[i][j]=B2T[i][j]+BT[i][k]*B[k][j];
		    }
		     //System.out.println("B2T["+i+"]["+j+"]="+B2T[i][j]+";");
		    }

		   }
		           }
		   /*下面求B2T的逆矩阵,设为B_2T,怎么适用于一般的矩阵?*/
		   double [][]B_2T=new double [2][2];
		   B_2T[0][0]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*B2T[1][1];
		   B_2T[0][1]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*(-B2T[0][1]);
		   B_2T[1][0]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*(-B2T[1][0]);
		   B_2T[1][1]=(1/(B2T[0][0]*B2T[1][1]-B2T[0][1]*B2T[1][0]))*B2T[0][0];
		   for(int i=0;i<2;i++)
		   {
		    for(int j=0;j<2;j++)
		    {
		     //System.out.println("B_2T["+i+"]["+j+"]="+B_2T[i][j]+";");
		    }
		   }
		   /*根据以上所求的各已知量下面求待估参数的未知量a和b,待估向量矩阵等于B_2T*BT*YN 
		    下面我们分别求这些矩阵的乘积,首先求B_2T*BT,令B_2T*BT的乘积为A矩阵,则A就是一个2*5的矩阵*/
		   /*
		    * 
		    * 
		    * 
		    * 下面先求A矩阵*/
		   double [][]A=new double[2][num-1];
		   for(int i=0;i<2;i++){//rows of B_2T
		    {
		     for(int j=0;j<num-1;j++)//cloums of BT
		     {
		     for(int k=0;k<2;k++)//cloums of B_2T=rows of BT
		     {
		      A[i][j]=A[i][j]+B_2T[i][k]*BT[k][j];
		     }
		      //System.out.println("A["+i+"]["+j+"]="+A[i][j]+";");
		     }

		    }
		            } 
		   /*
		    * 
		    * 
		    * 下面求A和YN矩阵的乘积,令乘积为C矩阵,则C就是一个2*1的矩阵*/
		   double [][]C=new double[2][1];
		   for(int i=0;i<2;i++){//rows of A

		    {
		     for(int j=0;j<1;j++)//cloums of YN
		     {
		     for(int k=0;k<num-1;k++)//cloums of A=rows of YN
		     {
		      C[i][j]=C[i][j]+A[i][k]*YN[k][j];
		     }
		      //System.out.println("C["+i+"]["+j+"]="+C[i][j]+";");
		     }

		    }
		            } 
		  /*根据以上所得则a=C[0][0],b=C[1][0];*/
		      a_error=C[0][0];
		      b_error=C[1][0];
		     //System.out.println("a="+a+";"+"b="+b+";");
		     //System.out.println("b/a="+b/a);
		     /*
		      * 
		      * 
		      *
		      */
    }
	public static void main(String[] args) {
  // TODO Auto-generated method stub
  
     //预测模型函数
	 System.out.println("输入数据个数:");
	 Scanner Scan=new Scanner(System.in);
	 int num=Scan.nextInt();
	 double []arr=new double[num];//{2.67,3.13,3.25,3.36,3.56,3.72};//原始数组
	 for(int i=0;i<num;i++){
		 arr[i]=Scan.nextDouble();
	 }
 //  double []arr={2.67,3.13,3.25,3.36,3.56,3.72};//原始数组
     Cal_param(num, arr);
     double Y=0;
     double new_arry[]=new double[num];
     for(int i=0;i<num;i++){
    	 Y=(arr[0]-b/a)*(Math.exp(-a*(i))-Math.exp(-a*(i-1)));//2.67 3.13 3.25 3.36 3.56 3.72
    	 new_arry[i]=arr[i]-Y;
     }
     Cal_param(num, new_arry);
     System.out.println("a为 "+a+" b为  "+b+"\n");
     
     Scanner x=new Scanner(System.in);//构造一个Scanner对象,其传入参数为System.in 
     System.out.print("请输入一个整数 ");
     int i=x.nextInt();//读取一个数值
    // double Y=(arr[0]-b/a)*(Math.exp(-a*(i))-Math.exp(-a*(i-1)));
     System.out.println("修正前预测值为\n");
     double new_Y=(arr[0]-b/a)*Math.exp(-a*(i+1))-(arr[0]-b/a)*Math.exp(-a*i);
     System.out.println("预测结果第i+1个数为:arr[i]="+new_Y);
     System.out.println("修正后预测值为\n");
     double new_Y2=(arr[0]-b/a)*Math.exp(-a*(i+1))-(arr[0]-b/a)*Math.exp(-a*i)+(new_arry[0]-b_error/a_error)*Math.exp(-a_error*(i+1))-(arr[0]-b_error/a_error)*Math.exp(-a_error*i);
     
   
  }

 
 

}

//源代码片段来自云代码http://yuncode.net
			


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...