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

📄 conicequationpredict.java

📁 数据预测算法
💻 JAVA
字号:
package com.eastcom.canicula.SHM.futurePredictor.predictAlgorithms;

import java.text.DecimalFormat;

/**
 * @author jakcy_wu(wujichun)
 *
 * 预测分析--本算法只适用于有明显线性趋势的数据
 * 默认为一元二次曲线方程法
 * 
 * 本程序主要涉及有两个算法
 * 1.用最小二乘原理找到线性方程组的系数和常数。
 * 2.解线性方程组
 * 本程序在解线性方程组中,由于考虑到收敛性问题未采用迭代法,而是采用Gauss-Jordan消去法来解决。
 
 */

public class conicEquationPredict  extends predictBase {
	private double historyArrayData[][];
	private double[] predictPeriod;
    private int maxCoefficient=3;
   
   public conicEquationPredict(double[][] myHistoryArrayData,double[] myPredictPeriod){
		int len=myHistoryArrayData[0].length ;
		
		int xLength=myPredictPeriod.length ;
		predictPeriod=new double[xLength+len];
		for(int i=0;i<len;i++) {
			predictPeriod[i]=myHistoryArrayData[0][i];
		}
		for(int i=len;i<xLength+len;i++){
			predictPeriod[i]=myPredictPeriod[i-len];
		}
		
		historyArrayData=new double[2][len];
		for(int i=0;i<len;i++) {
			historyArrayData[0][i]=myHistoryArrayData[0][i]; //x轴 
			historyArrayData[1][i]=myHistoryArrayData[1][i];//y轴
		}
	}
	
   public conicEquationPredict(double[][] historyArrayData,double[] predictPeriod,int MaxCoefficient){
   	  this(historyArrayData,predictPeriod);
	  maxCoefficient=MaxCoefficient;
    }
   
   public double[][] predict(){
	    int len=predictPeriod.length ;
	    int dataLength=historyArrayData[0].length ;
		double[][] resultArrayData=new double[2][len];
		double[][] coefficientMatrix=new double[maxCoefficient][maxCoefficient];
		double[] constantMatrix=new double[maxCoefficient];
		
//		计算系数矩阵的每个元素 coefficientMatrix[i][j]和coefficientMatrix[j][i]
		 for(int j=0;j<maxCoefficient;j++)
		    {
		      for(int i=0;i<=j;i++)
		      {
		        double ss=0;
		        for(int k=0;k<dataLength;k++) ss+=Math.pow(historyArrayData[0][k],i+j);
//					Manth.pow(historyArrayData[0][k],i+j-1),计算historyArrayData[0][k]的i+j-1次幂的
//				    historyArrayData[0][k]记录程序中用户输入坐标的横坐标值	
		             
				coefficientMatrix[i][j] = ss;
				coefficientMatrix[j][i]= ss;
		      }
		}

//		     计算常数矩阵的每个元素的值
		    for(int i=0;i<maxCoefficient;i++)
		    {
		      double ss=0;
		      for(int k=0;k<dataLength;k++)  ss+=historyArrayData[1][k]*Math.pow(historyArrayData[0][k],i);
//			 historyArrayData[1][k]记录程序中用户输入坐标的纵坐标值
		         
			  constantMatrix[i] = ss;
		    }
		
//			解线性方程组
		    for(int k=0;k<maxCoefficient;k++)
		    {
			      double m=Math.abs(coefficientMatrix[k][k]);//Math.abs(),计算系数coefficientMatrix[k][k]的绝对值
			      int r=k;
			      
				  //选主元
			      for(int i=k;i<maxCoefficient;i++){
			        if( m >Math.abs(coefficientMatrix[i][k])) {
			          m=Math.abs(coefficientMatrix[i][k]);
			          r=i;
			        }
			      }

			      //交换两行
			      if(r>k) {
				        for(int j=k;j<maxCoefficient;j++){
				          double temp=coefficientMatrix[k][j];
						  coefficientMatrix[k][j]=coefficientMatrix[r][j];
						  coefficientMatrix[r][j]=temp;
				        }
						
				        double temp2=constantMatrix[k];
						constantMatrix[k]=constantMatrix[r];
						constantMatrix[r]=temp2;
			      }

			      //消元计算
			      for(int j=k+1;j<maxCoefficient;j++)
					  coefficientMatrix[k][j]=coefficientMatrix[k][j]/coefficientMatrix[k][k];
				  
				  constantMatrix[k]=constantMatrix[k]/coefficientMatrix[k][k];
			      
				  for(int i=0;i<maxCoefficient;i++){
			        if(i==k) continue;
			        for(int j=k+1;j<maxCoefficient;j++)
						coefficientMatrix[i][j]=coefficientMatrix[i][j]-coefficientMatrix[i][k]*coefficientMatrix[k][j];
			      }
				  
			      for(int i=0;i<maxCoefficient;i++)
			      {
			        if(i==k) continue;
					constantMatrix[i]=constantMatrix[i]-coefficientMatrix[i][k]*constantMatrix[k];
			      }
  
		    }	  
		    
			String ts="Y=";
			for(int i=0;i<maxCoefficient;i++) ts+=(String.valueOf(constantMatrix[i])+"X("+String.valueOf(i)+")+");
			System.out.println(ts);
			
			DecimalFormat def=new DecimalFormat(".00");

			for (int i=0;i<len;i++){
				for (int j=0;j<maxCoefficient;j++){
					resultArrayData[1][i]+=constantMatrix[j]*Math.pow((i),j);
				}
				resultArrayData[0][i]=predictPeriod[i];
				String abc=def.format(resultArrayData[1][i]);
				resultArrayData[1][i]=Double.parseDouble(abc );
			}
			
		return resultArrayData;
   }
}

⌨️ 快捷键说明

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