コード例 #1
0
        /// <summary>
        /// КНОПКА РАСЧЕТА ТЕКУЩЕГО ВОЗМУЩЕНИЯ - КНОПКА "МНК"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            //ЭТА КНОПКА НАЧАЛА РАСЧЕТА
            //ИТАК НУЖНО ДЛЯ НАЧАЛА СЧЕТА ПОДГОТОВИТЬ ВСЕ ДАННЫЕ
            ///НА ПОНАДОБЯТЬСЯ:
            ///

            //Пускай это будет у нас для удобства в отдельных массивах

            List <double> time = new List <double>();
            List <double> I    = new List <double>();
            List <double> P    = new List <double>();
            List <double> pdH  = new List <double>();

            /*Итак у нас есть:
             * 1) исходный двумерный массив входных данных MyInputData
             * 2) индекс когда начались все перемещения  myOneVozmuchenie.Ir или что тоже самое myOneVozmuchenie.PerIndex[0, 0];
             * 3) кол-во перемещений myOneVozmuchenie.NPer;
             * 4) тепловая мощность в момент начала перемещений myOneVozmuchenie.Nt
             * 5) индекс окончания последнего перемещения  myOneVozmuchenie.PerIndex[myOneVozmuchenie.NPer - 1, 1];
             */


            //обозначили границы нашего перемещения
            myOneVozmuchenie.Ir = myOneVozmuchenie.PerIndex[0, 0];

            myOneVozmuchenie.Iend = myOneVozmuchenie.PerIndex[myOneVozmuchenie.NPer - 1, 1] + MyConst.delayTime; //при условии что частота 40 Гц добавим 5 секунд



            //Reactivity mynewR = new Reactivity();
            //mynewR.AddFirstData(mydata.Data[0][0], mydata.Data[MyConst.tok1][0]);
            //for (int i = 1; i < mydata.Data[MyConst.tok1].Count; i++)
            //{
            //    mynewR.AddData(mydata.Data[0][i], mydata.Data[MyConst.tok1][i]);
            //    chart1.Series[1].Points.AddXY(mydata.Data[0][i], mynewR.Ro);
            //}

            Reactivity mynewR = new Reactivity();

            for (int i = myOneVozmuchenie.Ir; i < myOneVozmuchenie.Iend; i++)
            {
                time.Add(myInputData.Data[0][i]);
                //ну так у Боева в методе GetJ
                I.Add(myInputData.Data[MyConst.tok1][i] / myInputData.Data[MyConst.tok1][myOneVozmuchenie.Ir]);


                if (i == myOneVozmuchenie.Ir)
                {
                    mynewR.AddFirstData(myInputData.Data[0][i], I[0]);
                }
                else
                {
                    mynewR.AddData(myInputData.Data[0][i], I[I.Count - 1]);
                }
                P.Add(mynewR.Ro);

                this.form1Chart1.Series[3].Points.AddXY(myInputData.Data[0][i], mynewR.Ro);
                //this.form1Chart1.Series[4].Points.AddXY(myInputData.Data[0][i], myInputData.Data[MyConst.H10][i]);


                //myOneVozmuchenie.PerIndex[myOneVozmuchenie.NPer - 1, 1]
            }



            ///нужно раздробить перемещения
            double ddH = 0;

            for (int i = 0; i < myOneVozmuchenie.NPer; i++)
            {
                //ведь каждый шаг должен в сумме давать 2
                for (int j = myOneVozmuchenie.PerIndex[i, 0] + 1; j <= myOneVozmuchenie.PerIndex[i, 1]; j++)
                {
                    ddH -= (2 / (myOneVozmuchenie.Per[i, 1] - myOneVozmuchenie.Per[i, 0])) * (myInputData.Data[0][j] - myInputData.Data[0][j - 1]);
                    pdH.Add(ddH);
                }

                //ДОБАВИТЬ КУСОК КОГДА НЕ ПЕРЕМЕЩАЛОСЬ

                if (i != myOneVozmuchenie.NPer - 1)
                {
                    for (int jj = myOneVozmuchenie.PerIndex[i, 1] + 1; jj <= myOneVozmuchenie.PerIndex[i + 1, 0]; jj++)
                    {
                        pdH.Add(ddH);
                    }
                }
            } // for i по всем перемещениям



            for (int i = 0; i < MyConst.delayTime; i++)
            {
                pdH.Add(ddH);
            }

            // MessageBox.Show(pdH.Count.ToString());



            this.form1Chart1.Series[4].Points.Clear();



            //Ну все якобы ВСЕ ГОТОВО К СЧЕТУ


            //List<double> time = new List<double>();
            //List<double> I = new List<double>();
            //List<double> P = new List<double>();
            //List<double> pdH = new List<double>();
            //Сверка всех длин массива прошла успешно
            // MessageBox.Show(time.Count + "  " + I.Count + " " + P.Count + " " + pdH.Count);



            double       Ss    = 1000;
            pertubResult tempR = new pertubResult();

            for (int i = 0; i < 200; i++)
            {
                tempR = Calc(3 + i / 200, time, I, P, pdH);
                if (tempR.SS > Ss)
                {
                    tempR = Calc(3 + (i - 1) / 200, time, I, P, pdH);
                    break;
                }
                Ss = tempR.SS;
            }

            tempR.Ro = tempR.Ro * MyConst.Rect.Beff;
            tempR.aH = tempR.aH * MyConst.Rect.Beff;
            tempR.b  = tempR.b * MyConst.Rect.Beff;
            tempR.SS = tempR.SS * MyConst.Rect.Beff;


            // this.mydataTableResult.Rows.Add(80, "DR/DH", "DR/DN", "tau");


            //  MessageBox.Show(tempR.FF.Count.ToString());


            this.mydataTableResult.Rows.Add(myInputData.Data[MyConst.H10][myOneVozmuchenie.Ir], tempR.aH, tempR.b / myOneVozmuchenie.Nt, tempR.tau);


            StreamWriter sr = new StreamWriter("Возмущение " + myInputData.Data[MyConst.H10][myOneVozmuchenie.Ir] + "_" + myInputData.Data[MyConst.H9][myOneVozmuchenie.Ir] + "_" + myInputData.Data[MyConst.H8][myOneVozmuchenie.Ir] + " .csv");

            sr.WriteLine("h10 s; h10 e; h10 mid; h9 s; h9 e; h9 mid; h8 s; h8 e; h8 mid; N; b; aH; aN; tau ; Ro;  'PO PICHKAM'; 'Rm = myresult.Ro + myresult.aH * dH[i] + myresult.b * F;'");

            sr.Write(myInputData.Data[MyConst.H10][myOneVozmuchenie.Ir] + ";" + myInputData.Data[MyConst.H10][myOneVozmuchenie.Iend] + ";" + (myInputData.Data[MyConst.H10][myOneVozmuchenie.Ir] + myInputData.Data[MyConst.H10][myOneVozmuchenie.Iend]) / 2 + ";");
            sr.Write(myInputData.Data[MyConst.H9][myOneVozmuchenie.Ir] + ";" + myInputData.Data[MyConst.H9][myOneVozmuchenie.Iend] + ";" + (myInputData.Data[MyConst.H9][myOneVozmuchenie.Ir] + myInputData.Data[MyConst.H9][myOneVozmuchenie.Iend]) / 2 + ";");
            sr.Write(myInputData.Data[MyConst.H8][myOneVozmuchenie.Ir] + ";" + myInputData.Data[MyConst.H8][myOneVozmuchenie.Iend] + ";" + (myInputData.Data[MyConst.H8][myOneVozmuchenie.Ir] + myInputData.Data[MyConst.H8][myOneVozmuchenie.Iend]) / 2 + ";");

            sr.Write(myOneVozmuchenie.Nt);

            sr.Write(";" + tempR.b);

            sr.Write(";" + tempR.aH);
            sr.Write(";" + tempR.b / myOneVozmuchenie.Nt);
            sr.Write(";" + tempR.tau);
            sr.Write(";" + tempR.Ro);



            //посчитаем aH по пичкам

            double DroAver = 0;

            for (int i = 0; i < myOneVozmuchenie.NPer; i++)
            {
                MessageBox.Show(myInputData.Data[MyConst.r1][myOneVozmuchenie.PerIndex[i, 1]].ToString() + " " + myInputData.Data[MyConst.r1][myOneVozmuchenie.PerIndex[i, 0]]);
                DroAver = DroAver + (myInputData.Data[MyConst.r1][myOneVozmuchenie.PerIndex[i, 1]] - myInputData.Data[MyConst.r1][myOneVozmuchenie.PerIndex[i, 0]]);


                //ведь каждый шаг должен в сумме давать 2
                //for (int j = myOneVozmuchenie.PerIndex[i, 0] + 1; j <= myOneVozmuchenie.PerIndex[i, 1]; j++)
                //{
                //    ddH -= (2 / (myOneVozmuchenie.Per[i, 1] - myOneVozmuchenie.Per[i, 0])) * (myInputData.Data[0][j] - myInputData.Data[0][j - 1]);
                //    pdH.Add(ddH);
                //}
            }
            MessageBox.Show(myOneVozmuchenie.NPer.ToString());
            MessageBox.Show(DroAver.ToString());
            DroAver = DroAver / myOneVozmuchenie.NPer;
            MessageBox.Show(DroAver.ToString());
            DroAver = DroAver / -2;
            MessageBox.Show(DroAver.ToString());
            DroAver = DroAver * MyConst.Rect.Beff;
            MessageBox.Show(DroAver.ToString());
            sr.Write(";" + DroAver);

            sr.WriteLine();

            // sr.WriteLine("начало -" + myOneVozmuchenie.Ir + "; конец - " + myOneVozmuchenie.Iend);

            sr.WriteLine("Time; Current; React; pdH; F");

            for (int i = 0; i < pdH.Count; i++)
            {
                this.form1Chart1.Series[4].Points.AddXY(myInputData.Data[0][myOneVozmuchenie.Ir + i], pdH[i]);
                sr.WriteLine(time[i] + ";" + I[i] + ";" + P[i] + ";" + pdH[i] + " ; " + tempR.FF[i]);
            }



            sr.Close();



            //for (int i = myOneVozmuchenie.Ir; i < myOneVozmuchenie.Iend; i++)
            //{
            //    if ((i > myOneVozmuchenie.PerIndex[currPerem, 0]) && (i < myOneVozmuchenie.PerIndex[currPerem, 1]))
            //    {

            //        ddH+=(2/(myOneVozmuchenie.Per[currPerem,1]-myOneVozmuchenie.Per[currPerem,0]))*(myInputData.Data[0][i])

            //    }
            //    else
            //    {



            //        if (true)
            //        {

            //        }


            //    }



            //}



            //Занесем пока все что есть, а все что просто. А дальше будем думать



            //СКОРЕЕ ВСЕГО ЭТО ВСЕ ЧТО НАМ ПОНАДОБИТЬСЯ:
            //double[] I -  МАССИВ ТОКОВ С ВЫСОКОЙ ЧАСТОТОЙ
            ///double[] pm - МАССИВ РЕАКТИВНОСТЕЙ РАСЧИТАННЫХ ПО ТОКАМ с такой де высокой частосто
            ///double[] H - МАССИВ ПОЛОЖЕНИЯ ГРУПП ДЛЯ КАЖДОГО ОТЧЕТА (перессчитанная также с высокой частостой для большой частоты регистрации)


            //this.mydataTableResult.Rows.Add(80, 1E-3, 1E-4);
            //this.mydataTableResult.Rows.Add(80, 1E-3, 1E-4);
            //MessageBox.Show(this.form1Chart1.ChartAreas[0].CursorX.Position.ToString());
        }
コード例 #2
0
        //List<double> time = new List<double>();
        //List<double> I = new List<double>();
        //List<double> P = new List<double>();
        //List<double> pdH = new List<double>();

        /// <summary>
        /// основная функция для расчета
        /// </summary>
        /// <param name="Tau">постоянная времени разогрева</param>
        /// <param name="time">массив времени</param>
        /// <param name="I">массив токов</param>
        /// <param name="P">массив реактивностей</param>
        /// <param name="dH">массив перемещений группы</param>
        /// <returns></returns>
        ///

        private pertubResult Calc(double Tt, List <double> time, List <double> I, List <double> R, List <double> dH)
        {
            pertubResult myresult = new pertubResult();

            myresult.FF = new List <double>();
//тут основной код для вычислений

            myresult.tau = Tt;

            int cnt = 0;

            double F, g, c, dT, sH, sHH, sF, sFF, sR, sFH, sRH, sRF;


            double SA, SB, SC, SD, SE;

            double Rm;
            double sS;


            F   = 0;
            sH  = 0;
            sHH = 0;
            sF  = 0;
            sFF = 0;
            sFH = 0;
            sR  = 0;
            sRH = 0;
            sRF = 0;

            myresult.FF.Add(0);

            for (int i = 1; i < time.Count; i++)
            {
                dT = time[i] - time[i - 1];
                if (dT == 0)
                {
                    myresult.FF.Add(0);
                    continue;
                }
                g = Math.Exp(-dT / Tt);
                c = (1 - g) * Tt / dT;

                F = F * g + (I[i] - 1) * (1 - c) + (I[i - 1] - 1) * (c - g);
                myresult.FF.Add(F);
                sH  += dH[i];
                sHH += dH[i] * dH[i];
                sF  += F;
                sFF += F * F;
                sR  += R[i];
                sFH += F * dH[i];
                sRH += R[i] * dH[i];
                sRF += R[i] * F;
                cnt++;
            }


            //считаем суммы

            SA = sH * sH / cnt / cnt - sHH / cnt;
            SB = sF * sH / cnt / cnt - sFH / cnt;
            SC = sR * sH / cnt / cnt - sRH / cnt;
            SD = sF * sF / cnt / cnt - sFF / cnt;
            SE = sR * sF / cnt / cnt - sRF / cnt;


            myresult.aH = (SC * SD - SB * SE) / (SA * SD - SB * SB);
            myresult.b  = (SA * SE - SB * SC) / (SA * SD - SB * SB);

            myresult.Ro = sR / cnt - myresult.aH * sH / cnt - myresult.b * sF / cnt;


            // невязки


            F   = 0;
            cnt = 0;
            sS  = 0;

            for (int i = 1; i < time.Count; i++)
            {
                dT = time[i] - time[i - 1];
                if (dT == 0)
                {
                    continue;
                }

                g = Math.Exp(-dT / Tt);
                c = (1 - g) * Tt / dT;
                F = F * g + (I[i] - 1) * (1 - c) + (I[i - 1] - 1) * (c - g);

                Rm  = myresult.Ro + myresult.aH * dH[i] + myresult.b * F;
                sS += (R[i] - Rm) * (R[i] - Rm);

                cnt++;
            } //i
            myresult.SS = sS;



            return(myresult);
        }