⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gridmodel.java

📁 用于建立黑色系统模型
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.lee.test.GridModel;
import java.io.*;

import java.util.*;

/**
 * 类的简单介绍:
 * 本类包含了灰色系统模型的构造函数,以及在灰色系统建模过程中常用的一些方法的声明与实现
 */
public class GridModel {
	
	/**
	 * 姓名:李涛
	 * 班级:系统建模与仿真(1)班
	 * 学号:S08102085
	 * 邮箱:leeoxin@126.com
	 */
	
	//模型估计值序列中数据的个数,包含初始序列的估计值在内。
	private static final int PREDICTIONNUMBER = 9 ;
	
	//相对精度界值
	private static final double RELATIVERESIDUAL = 0.01 ;
	
	//灰色关联度界值
	private static final double ABSOLTETCORRELATION = 0.9 ;
	
	private double[] initArray = null ;
	
	/**
	 * 声明一个参数为空的构造函数:
	 */
	public GridModel(){
		
	}
	
	/**
	 * 声明一个参数为初始化数组的构造函数:
	 */
	public GridModel(double[] array){
		initArray = array.clone();
	}
		
	public  void initDeal(double[]  initArray){
		
		/**
		 * 初始值处理:
		 * 输入:初始化数组initArray[0,1,...,n-1]
		 * 输出:数组initArray中每个元素都除以initArray[0]所得到的新数组
		 */
		if (initArray == null) return ;
		double temp = initArray[0];
		
		for (int i = 0 ; i < initArray.length; i++ ){
			if( initArray[0] == 0 ) return ; 
			initArray[i] /= temp;
		}
		
	}

	public  double[] avgDeal(double[] avgArray){
		/**
		 * 均值处理:
		 * 输入:数组avgArray[0,1,...,n-1]
		 * 输出:数组outputArray[0,1,...,n-1]中每个元素都除以avgArray的均值所得到的新数组
		 */
		if (avgArray == null || avgArray.length == 0){
			return null ;
		}
		double temp  = avg(avgArray);
		double[] outputArray = avgArray.clone();
		
		for (int i = 0 ; i < outputArray.length; i++ ){
			if( temp == 0 ) return  null; 
			outputArray[i] /= temp;
		}
		return outputArray;
	}
	
	public  double[] avgCloseDeal(double[] avgArray){
		/**
		 * 紧邻均值处理:
		 * 输入:数组avgArray[0,1,...,n-1]
		 * 输出:数组outputArray[0,1,...,n-1],它是对avgArray[0,1,...,n-1]中每个元素做紧邻均值生成所得到的数组
		 */
		if (avgArray == null || avgArray.length == 0){
			return null ;
		}
		double[] outputArray = avgArray.clone();
		
		for (int i = 1 ; i < outputArray.length; i++ ){
			outputArray[i] = (avgArray[i] + avgArray[i-1])/2;
		}
		show(outputArray);
		return outputArray;
	}
	
	public  double max(double[] array){
		/**
		 * 求数组元素最大值:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组array[0,1,...,n-1]中元素的最大值
		 */
		
		if (array == null ) return -1;
		double temp = array[0] ;
		for (int i = 0 ; i < array.length ; i ++){
			if (array[i] > temp ) temp = array[i];
		}
		return temp ;
	} 
	
    public  double min(double[] array){
    	/**
		 * 求数组元素最小值:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组array[0,1,...,n-1]中元素的最小值
		 */
		if (array == null) return  -1;
		
		double temp = array[0] ;
		for (int i = 0 ; i < array.length ; i ++){
			if (array[i] < temp ) temp = array[i];
		}
		
		return temp	;
	} 

    public  double avg(double[] array){
    	/**
		 * 求数组元素平均值:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组array[0,1,...,n-1]中元素的平均值
		 */
    	if (array == null) return  0 ;
		double temp = 0 ;
		for( int i = 0  ;i < array.length ; i++){
			temp += array[i];
		}
		temp = (temp / array.length);
		
		return temp ;
    }
    
    public  double sum(double[] array){
    	/**
		 * 求数组元素和:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组array[0,1,...,n-1]中元素的总和
		 */
    	if (array == null) return  0 ;
		double temp = 0 ;
		for( int i = 0  ;i < array.length ; i++){
			temp += array[i];
		}	
		return temp ;
    }
    
    public  double[] leastSquareMethod(double[] firstArray,double[] secondArray){
    	
    	/**
		 * 最小二乘法的简单实现:
		 * 输入:数组firstArray[0,1,...,n-1],数组secondArray[0,1,...,n-1]
		 * 输出:数组coefficients[1,2],其中coefficients[1]对应a,coefficients[2]对应b
		 */
    	double[] coefficients = new double[2];
    	if (firstArray.length != secondArray.length){
    		return null ;
    	}
    	for(int i = 1 ; i < firstArray.length ; i++){
    		coefficients[0] += ((firstArray[i]-avg(firstArray))*(secondArray[i]-avg(secondArray)));
    		coefficients[1] += ((firstArray[i]-avg(firstArray))*(firstArray[i]-avg(firstArray)));
    	}
    	if (coefficients[1]!= 0){
    		
    		coefficients[0] /= coefficients[1] ;
    		coefficients[0] = -coefficients[0];
    		//根据GM(1,1)动态模型
        	coefficients[1] = avg(secondArray) + coefficients[0]*avg(firstArray);        	
    	}
    	else{
    		System.out.println("除数不可以为0.");
    		return null ;	
    	}
    	show(coefficients);
    	return coefficients ;
    }
    
	public void verticalRangeDeal(double[][] rangeArray){
		
		/**
		 * 垂直区间化处理:
		 * 输入:矩阵rangeArray[0,1,2,...,n-1][0,1,2,...,n-1]
		 * 输出:经过垂直区间化处理的矩阵rangeArray[0,1,2,...,n-1][0,1,2,...,n-1]
		 */
		
		double maxElem = 0 ; 
		double minElem = 0 ;
		if  (rangeArray == null) return ;
		//i表示列数,j表示行数
		for(int i = 0 ; i < rangeArray[0].length ; i++ ){
			maxElem = max(rangeArray[i]);
			minElem = min(rangeArray[i]);
			for(int j = 0 ; j < rangeArray.length ; j++){
				rangeArray[j][i] = (rangeArray[j][i] - minElem )/(maxElem- minElem);
			}
		}
	}
	
	public double[] agoSequence(double[] array){
		
		/**
		 * 累加生成器:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组outputArray[0,1,...,n-1],outputArray[i]对应累加得到的结果
		 */
		
		if(array == null) return null; 
		double[] outputArray = new double[array.length];
		outputArray[0] = array[0];
		for(int i = 1 ;i <array.length ; i++){
			outputArray[i] = outputArray[ i-1 ] + array[i];
		}
		show(outputArray);
		return outputArray ;
	}
	
	public double[] iagoSequence(double[] array){
		
		/**
		 * 累减生成器:
		 * 输入:数组array[0,1,...,n-1]
		 * 输出:数组outputArray[0,1,...,n-1],outputArray[i]对应累减得到的结果
		 */
			
			if(array == null) return  null; 
			double[] outputArray = new double[array.length];
			outputArray[0] = array[0];
			for(int i = array.length - 1 ;i > 0 ; i--){
				outputArray[i] = array[i]-array[i-1];
			}	
			show(outputArray);
			return outputArray ;
		}
	
	public double[] getModel(double paramA, double paramB , double[] inputArray){
		
		/**
		 * 原始序列模型计算值:
		 * 输入:最小二乘法得到系数paramA,paramB,以及数组inputArray[]
		 * 输出:数组outputArray[0,1,...,n-1],outputArray对应原始序列模型计算值
		 */
		
		double[] outputArray = new double[inputArray.length];
		outputArray[0] = inputArray[0];
		for(int i= 1 ; i <  outputArray.length ; i++){
			outputArray[i] = (inputArray[0] - paramB/paramA)*Math.exp(-paramA*i) + paramB/paramA;
			}
		show(outputArray);
		return outputArray;
	}
	
	public  double getCorrelation(double[] firstArray, double[] secondArray){
		
		/**
		 * 拿到灰色关联度:
		 * 输入:数组firstArray[0,1,...,n-1],数组secondArray[0,1,...,n-1]
		 * 输出:数组firstArray[0,1,...,n-1]与数组secondArray[0,1,...,n-1]的灰色关联度
		 */
		
		if (firstArray == null || secondArray == null || (firstArray.length != secondArray.length)) return 0 ;
		
		double correlation = 0 ;
		int maxLength = firstArray.length ;
		//cc代表关联系数
		double[] cc = new double[maxLength] ;
		//dstinguishC代表相关系数
		double dstinguishC = 0.5 ;
		double minVal = 0 ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -