📄 conicequationpredict.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 + -