[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