//--------------------------------------------------------------------------- //--------------------------------------------------------------------------- public qData revisionParam() { //для каждого Betta вычислить производную //сформировать матрицы А и g // нормировать матрицы А и g // найти h // вычислить поправки //oooooooooooooooooooooooooooooo //ofstream @out = new ofstream("tmpModArm.rpt"); //@out << "Вычисление параметров модели АРСС"; //@out << "\n"; //oooooooooooooooooooooooooooooo double delta = 0.1; double cf_P = 0.1; // double cf_P = 2.0; double cf_E = 0.0001; double cf_F2 = 1.8; int p; int q; int k; int n; List<double> Zdm = new List<double>(); // ряд исхлдный p = this.Np; q = this.Nq; k = p + q; // p = ModelAR.size(); // q = ModelMA.size(); // k = Model.size(); Zdm = this.ZDM.get(); n = Zdm.Count; List<double> A0 = new List<double>(n); List<double> Ab = new List<double>(n); List<double> B0 = new List<double>(); List<double> Bd = new List<double>(); List<double> BZero = new List<double>(); BZero = this.Model.get(); B0 = delZero(BZero, Mask); //Удалить 3 посл. значения - tetta0 SgmA2, M; //B0.pop_back(); B0.pop_back(); B0.pop_back(); //создал Х //List<List<double> > X = new List<List<double> >(k, List<double> (n, 0)); List<List<double>> X = new List<List<double>>(k); for (int i = 0; i < k; i++) { X[i] = new List<double>(n); } // матрицы qMData MA = new qMData(); qMData MG = new qMData(); // MG.set( MG.clcMtrx( G, G.size() ) ); qMData MH = new qMData(); // MH.set( MH.clcMtrx( H, H.size() ) ); try { for (int c = 0; c <= 100; c++) { // заполнение Х------------- BZero = addZero(B0, Mask); this.forecast(BZero, Zdm, ref A0, 0); for (int i = 0; i < k; i++) { Bd = B0; Bd[i] = Bd[i] + delta; BZero = addZero(Bd, Mask); this.forecast(BZero, Zdm, ref Ab, 0); for (int j = 0; j < n; j++) { X[i][j] = (A0[j] - Ab[j]) / delta; } } // Заполнение А //List<List<double> > A = new List<List<double> >(k, List<double> (k, 0)); List<List<double>> A = new List<List<double>>(k); for (int i = 0; i < k; i++) { A[i] = new List<double>(k); } for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { double S = 0; for (int t = 0; t < n; t++) { S += X[i][t] * X[j][t]; } A[i][j] = S; } } // Заполнение G List<double> G = new List<double>(k); for (int i = 0; i < k; i++) { double S = 0; for (int t = 0; t < n; t++) { S += X[i][t] * A0[t]; //+++++++++++++++++++++++ } G[i] = S; } // нормирующие величины List<double> D = new List<double>(k); for (int i = 0; i < k; i++) { D[i] = Math.Sqrt(A[i][i]); } // модифицировать for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { if (i != j) { double delitel; delitel = D[i] * D[j]; if (delitel != 0) { A[i][j] = A[i][j] / delitel; } } else { A[i][j] = 1 + cf_P; } } } for (int i = 0; i < k; i++) { if (D[i] != 0) { G[i] = G[i] / D[i]; } } //решение ур-Ыния Ah = g // заполнить матр А и обратить // умножить на g: H = Аобр*G MA.set(A); MG.set(MG.clcMtrx(G, G.Count)); //MA = MA.clcPIMatrix(MA.get()); throw new System.NotImplementedException(); MH = MA * MG; List<double> H = new List<double>(k); H = MH.clcVctr(MH.get()); for (int i = 0; i < k; i++) { if (D[i] != 0) { H[i] = H[i] / D[i]; } } for (int i = 0; i < k; i++) { Bd[i] = B0[i] + H[i]; } // оценка остаточных ошибок double Sb = 0; double S0 = 0; BZero = addZero(Bd, Mask); this.forecast(BZero, Zdm, ref Ab, 0); qData tClc = new qData(); S0 = tClc.clcAmountSquare(ref A0); Sb = tClc.clcAmountSquare(ref Ab); /* @out << "Итерация:"; @out << "\t"; @out << c; @out << "\n"; @out << "Текущие параметры:"; @out << "\n"; for(int i = 0; i < k; i++) { @out << "K["; @out << i; @out << "]:\t"; @out << B0[i]; @out << "\n"; } @out << "Var(a): "; @out << S0; @out << "\n"; @out << "Вычисленные параметры:"; @out << "\n"; for(int i = 0; i < k; i++) { @out << "K["; @out << i; @out << "]:\t"; @out << Bd[i]; @out << "\n"; } @out << "Var(a): "; @out << Sb; @out << "\n"; @out << "k_p: "; @out << cf_P; @out << "\n"; @out << "k_d: "; @out << delta; @out << "\n"; */ if (Sb < S0) { B0 = Bd; //oooooooooooooooooooooooooooooo //@out << "Параметры обновлены"; //@out << "\n"; //oooooooooooooooooooooooooooooo // достигнута сходимость если: H[i] < e bool flag = true; for (int i = 0; i < k; i++) { if (!((H[i] > -cf_E) && (H[i] < cf_E))) { flag = false; } } if (flag == true) { //++++++++++++++++ // запомнить А матрицу // запомнить а для расчета автокорреляций //ShowMessage("Число итераций:"+IntToStr(c)); break; } else { cf_P = cf_P / cf_F2; if (cf_P < 0.001) { cf_P = 0.001; } //qwooooooooooooooooo //delta = delta/cf_F2; //if( delta < 0.001){ // delta = 0.001; //}//qwooooooooooooooooo } } else { cf_P = cf_P * cf_F2; if (cf_P > 8) { //cf_P = 5; break; } //qwooooooooooooooooo //delta = delta*cf_F2; //if( delta > 0.1){ // delta = 0.1; //}//qwooooooooooooooooo } } //------------------------------ } catch { throw new System.ApplicationException("Исключение при уточнении параметров"); //oooooooooooooooooooooooooooooo //@out.close(); //oooooooooooooooooooooooooooooo return Model; } //------------------------ List<double> PPar = new List<double>(); List<double> QPar = new List<double>(); BZero = addZero(B0, Mask); //PPar.AddRange(BZero.GetEnumerator(), BZero.GetEnumerator() + P); //QPar.AddRange(BZero.GetEnumerator()+P, BZero.GetEnumerator() + P+Q); throw new System.NotImplementedException(); ModelAR.set(PPar); ModelMA.set(QPar); //------------------------ //oooooooooooooooooooooooooooooo //@out.close(); //oooooooooooooooooooooooooooooo qData tData = new qData(); tData.set(BZero); //C++ TO C# CONVERTER WARNING: The following line was determined to be a copy assignment (rather than a reference assignment) - this should be verified and a 'CopyFrom' method should be created if it does not yet exist: //ORIGINAL LINE: Model = tData; Model.set(tData); return tData; }