/// <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()); }
//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); }