代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
实现带残差修正的灰色算法
作者:
郑岸以
/ 发布于
2014/10/8
/
618
java实现带残差修正的灰色算法,基于GM(1,1)模型增加残差修正,提高模型精度
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); } }
试试其它关键字
灰色算法
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
郑岸以
贡献的其它代码
(
8
)
.
数据库表生成Model
.
实现灰色马尔科夫算法
.
实现带残差修正的灰色算法
.
矩阵伴随矩阵的java实现
.
实现拉格朗日插值法
.
实现牛顿插值法
.
实现高斯赛德尔算法解线性方程组
.
实现SOR算法解线性方程组
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3