예제 #1
0
        //---------------------------------------------------------------------------
        //---------------------------------------------------------------------------
        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;
        }