public ArrayList toARMA() { //_x为差分后的值 //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258, 0.129094651911413 }; //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258 }; clsga gg = new clsga(_x, _ar_n, _ar_ub, _ar_lb, _ga_n, _ga_num, _ga_pr, _ga_pm); //使用GA运行得到ar部分的参数 ArrayList resar = gg.runGA(); double[] ar = (double[])resar[0]; double maxV1 = (double)resar[1]; //使用ar部分的参数取得预测值 _s为_x与其预测值之间的误差 double[] _e = gg.getE(ar); //为便于计算,将_e补并个数,与_x相等 double[] _ee = new double[_x.Length]; clsga ge = new clsga(_e, _ma_n, _ma_ub, _ma_lb, _ga_n, _ga_num, _ga_pr, _ga_pm); ArrayList resma = gg.runGA(); double[] ma = (double[])resma[0]; double maxV2 = (double)resma[1]; //double[] ma = ge.runGA(); int startI = _ar_n + _ma_n; //计算最终预测的x,2+3分别为ar和ma部分的参数个数 double[] predicX = new double[_x.Length + 1]; for (int i = 0; i < _x.Length; i++) { predicX[i] = 0; _ee[i] = 0; } for (int i = startI; i < _x.Length; i++) { _ee[i] = _e[i - startI]; } //根据参数计算预测值 double sum = 0; for (int i = startI; i < _x.Length + 1; i++) { sum = 0; //ar的计算 for (int j = 0; j < ar.Length; j++) { sum += ar[j] * _x[i - j - 1] + ma[j] * _ee[i - j - 1]; } //ma的计算 for (int j = 0; j < ma.Length; j++) { sum += ma[j] * _ee[i - j - 1]; } predicX[i] = sum; } double[] oridata = new double[predicX.Length + _count];//用来存储原长度预测数据和扩展月份的预测数据 //赋值原长度预测数据 for (int i = 0; i < _data.Length; i++) { oridata[i] = predicX[i]; } for (int i = predicX.Length; i < predicX.Length + _count; i++) { //根据参数计算预测值 sum = 0; //ar的计算 for (int j = 0; j < ar.Length; j++) { sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1]; } //ma的计算,只有一次可用 if (i == predicX.Length) { for (int j = 0; j < ma.Length; j++) { sum += ma[j] * _ee[i - j - 2]; } } oridata[i] = sum; } //ok //将差分转换为现实值 double[] finaldata = new double[predicX.Length + _count]; for (int i = 0; i < _data.Length; i++) { finaldata[i] = _data[i]; } for (int i = startI; i < finaldata.Length; i++) { finaldata[i] = (1 + oridata[i]) * finaldata[i - 1]; } //根据ar和ma部分的系数计算 //double[] preout = new double[_count]; //double[] oridata = new double[_data.Length + _count];//用来存储原始数据加上预测数据 ////赋值原始数据 //for (int i = 0; i < _data.Length; i++) //{ // oridata[i] = _data[i]; //} //for (int i = _data.Length; i < _count; i++) //{ // //根据参数计算预测值 // double sum = 0; // for (int i = 0; i < preout.Length + 1; i++) // { // sum = 0; // //ar的计算 // for (int j = 0; j < ar.Length; j++) // { // sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1]; // } // //ma的计算 // if (i == _data.Length) // { // for (int j = 0; j < ma.Length; j++) // { // sum += ma[j] * _ee[i - j - 1]; // } // } // oridata[i] = sum; // } //} ArrayList lastRes = new ArrayList(); lastRes.Add(maxV1); lastRes.Add(maxV2); lastRes.Add(finaldata); return lastRes; //for (int i = 0; i < predicX.Length; i++) //{ // Console.WriteLine(predicX[i].ToString()); //} ////最终得到的参数 //Console.WriteLine("out :" + ar.Length); //Console.WriteLine(ar[0].ToString()); //Console.WriteLine(ar[1].ToString()); //Console.WriteLine("out :" + ma.Length); //Console.WriteLine(ma[0].ToString()); //Console.WriteLine(ma[1].ToString()); // Console.WriteLine(dt[2].ToString () ); //Console.WriteLine(dt[2].ToString()); //double _lb = -10; //double _ub = 10; //Console.ReadLine(); }
public ArrayList toARMA() { //_x为差分后的值 //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258, 0.129094651911413 }; //double[] _x ={ 0.0810295519542421, 0.262345679012346, -0.0621725462801258, -0.0446927374301676, -0.00896686159844059, 0.164044059795437, 0.154106116931396, 0.393265007320644, 0.134089953762085, 0.179577464788732, 0.213511390416339, 0.0666752977731745, 0.204029615244569, 0.252620967741935, 0.332528569129245, 0.374078995047711, 0.189038326300985, 0.0767012900602521, 0.0540373523757208, 0.0628297830760211, 0.116637553246912, 0.105085490023877, 0.115879401976854, 0.163357963144307, 0.119146005509642, 0.108581196581197, 0.116095108863258 }; clsga gg = new clsga(_x, _ar_n, _ar_ub, _ar_lb, _ga_n, _ga_num, _ga_pr, _ga_pm); //使用GA运行得到ar部分的参数 ArrayList resar = gg.runGA(); double[] ar = (double[])resar[0]; double maxV1 = (double)resar[1]; //使用ar部分的参数取得预测值 _s为_x与其预测值之间的误差 double[] _e = gg.getE(ar); //为便于计算,将_e补并个数,与_x相等 double[] _ee = new double[_x.Length]; clsga ge = new clsga(_e, _ma_n, _ma_ub, _ma_lb, _ga_n, _ga_num, _ga_pr, _ga_pm); ArrayList resma = gg.runGA(); double[] ma = (double[])resma[0]; double maxV2 = (double)resma[1]; //double[] ma = ge.runGA(); int startI = _ar_n + _ma_n; //计算最终预测的x,2+3分别为ar和ma部分的参数个数 double[] predicX = new double[_x.Length + 1]; for (int i = 0; i < _x.Length; i++) { predicX[i] = 0; _ee[i] = 0; } for (int i = startI; i < _x.Length; i++) { _ee[i] = _e[i - startI]; } //根据参数计算预测值 double sum = 0; for (int i = startI; i < _x.Length + 1; i++) { sum = 0; //ar的计算 for (int j = 0; j < ar.Length; j++) { sum += ar[j] * _x[i - j - 1] + ma[j] * _ee[i - j - 1]; } //ma的计算 for (int j = 0; j < ma.Length; j++) { sum += ma[j] * _ee[i - j - 1]; } predicX[i] = sum; } double[] oridata = new double[predicX.Length + _count];//用来存储原长度预测数据和扩展月份的预测数据 //赋值原长度预测数据 for (int i = 0; i < _data.Length; i++) { oridata[i] = predicX[i]; } for (int i = predicX.Length; i < predicX.Length + _count; i++) { //根据参数计算预测值 sum = 0; //ar的计算 for (int j = 0; j < ar.Length; j++) { sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1]; } //ma的计算,只有一次可用 if (i == predicX.Length) { for (int j = 0; j < ma.Length; j++) { sum += ma[j] * _ee[i - j - 2]; } } oridata[i] = sum; } //ok //将差分转换为现实值 double[] finaldata = new double[predicX.Length + _count]; for (int i = 0; i < _data.Length; i++) { finaldata[i] = _data[i]; } for (int i = startI; i < finaldata.Length; i++) { finaldata[i] = (1 + oridata[i]) * finaldata[i - 1]; } //根据ar和ma部分的系数计算 //double[] preout = new double[_count]; //double[] oridata = new double[_data.Length + _count];//用来存储原始数据加上预测数据 ////赋值原始数据 //for (int i = 0; i < _data.Length; i++) //{ // oridata[i] = _data[i]; //} //for (int i = _data.Length; i < _count; i++) //{ // //根据参数计算预测值 // double sum = 0; // for (int i = 0; i < preout.Length + 1; i++) // { // sum = 0; // //ar的计算 // for (int j = 0; j < ar.Length; j++) // { // sum += ar[j] * oridata[i - j - 1];// +ma[j] * _ee[i - j - 1]; // } // //ma的计算 // if (i == _data.Length) // { // for (int j = 0; j < ma.Length; j++) // { // sum += ma[j] * _ee[i - j - 1]; // } // } // oridata[i] = sum; // } //} ArrayList lastRes = new ArrayList(); lastRes.Add(maxV1); lastRes.Add(maxV2); lastRes.Add(finaldata); return(lastRes); //for (int i = 0; i < predicX.Length; i++) //{ // Console.WriteLine(predicX[i].ToString()); //} ////最终得到的参数 //Console.WriteLine("out :" + ar.Length); //Console.WriteLine(ar[0].ToString()); //Console.WriteLine(ar[1].ToString()); //Console.WriteLine("out :" + ma.Length); //Console.WriteLine(ma[0].ToString()); //Console.WriteLine(ma[1].ToString()); // Console.WriteLine(dt[2].ToString () ); //Console.WriteLine(dt[2].ToString()); //double _lb = -10; //double _ub = 10; //Console.ReadLine(); }