//основная функция private void BaseFunc(double[,] Data, out double[] Koef, out double[] Ym) { int N = Data.Length / Q_Col; //кол-во строк int M = Q_Col - 1; //кол-во столбцов X double[,] x = new double[N - Nstr, M]; //независимые случайные величины double[] y = new double[N - Nstr]; //зависимая СВ int i = 0; int j = 0; //разделим основной массив на Х и У for (i = 0; i < N - Nstr; i++) { for (j = 0; j < Q_Col; j++) { if (j != (Q_Col - 1)) { x[i, j] = Data[i, j]; // TestBox.AppendText(x[i,j].ToString());} } else { y[i] = Data[i, j]; //TestBox.AppendText(y[i].ToString());} } } } //Оценка мат. ож. Х double[] ChMx = new double[M]; for (i = 0; i < M; i++) { ChMx[i] = 0; //начальные значение } double[] Mx = new double[M];; for (j = 0; j < M; j++) { for (i = 0; i < N - Nstr; i++) { ChMx[j] += x[i, j]; } Mx[j] = ChMx[j] / N - Nstr; } //Оценка мат. ож. Y double ChMy = 0; double My; for (i = 0; i < N - Nstr; i++) { ChMy += y[i]; } My = ChMy / N - Nstr; //Оценка дисперсии Х double[] ChDx = new double[M]; double[] Dx = new double[M]; for (j = 0; j < M; j++) { for (i = 0; i < N - Nstr; i++) { ChDx[j] += Math.Pow((x[i, j] - Mx[j]), 2); } Dx[j] = ChDx[j] / (N - Nstr - 1); } //Оценка дисперсии Y double ChDy = 0; double Dy; for (i = 0; i < N - Nstr; i++) { ChDy += Math.Pow((y[i] - My), 2); } Dy = ChDy / (N - Nstr - 1); //Оценка коэф-тов корреляции между зависимыми и независимыми СВ double[] ChRxy = new double[M]; double[] ZnRxy1 = new double[M]; double[] ZnRxy2 = new double[M]; double[] Rxy = new double[M]; for (j = 0; j < M; j++) { for (i = 0; i < N - Nstr; i++) { ChRxy[j] += (x[i, j] - Mx[j]) * (y[i] - My); ZnRxy1[j] += Math.Pow((x[i, j] - Mx[j]), 2); ZnRxy2[j] += Math.Pow((y[i] - My), 2); } Rxy[j] = ChRxy[j] / Math.Sqrt(ZnRxy1[j] * ZnRxy2[j]); } //Оценка коэф-тов корреляции между независимыми СВ double[] ChRxx = new double[M]; double[] ZnRxx1 = new double[M]; double[] ZnRxx2 = new double[M]; double[,] Rxx = new double[M, M]; for (j = 0; j < M; j++) { for (int k = 0; k < M; k++) { for (i = 0; i < N - Nstr; i++) { ChRxx[j] += (x[i, j] - Mx[j]) * (x[i, k] - Mx[k]); ZnRxx1[j] += Math.Pow((x[i, j] - Mx[j]), 2); ZnRxx2[j] += Math.Pow((x[i, k] - Mx[k]), 2); } Rxx[j, k] = ChRxx[j] / Math.Sqrt(ZnRxx1[j] * ZnRxx2[j]); } } Koef = new double[M + 1]; for (i = 0; i < M + 1; i++) { Koef[i] = 0; } //дополним матрицу Х единичным столбцом double[,] newX = new double[N - Nstr, M + 1]; for (i = 0; i < N - Nstr; i++) { for (j = 0; j < M + 1; j++) { if (j == 0) { newX[i, j] = 1; } else { newX[i, j] = x[i, j - 1]; } //richTextBox1.AppendText(newX[i, j].ToString() + "\t"); } //richTextBox1.AppendText("\n"); } double[,] xT = new double[newX.GetLength(1), newX.GetLength(0)]; Transpose(newX, out xT); double[,] xTx = new double[xT.GetLength(0), xT.GetLength(0)]; Multiplication(xT, newX, out xTx); double[,] xTy = new double[xT.GetLength(0), xT.GetLength(0)]; double[,] newY = new double[N - Nstr, 1]; //для корректного умножения for (i = 0; i < N - Nstr; i++) { newY[i, 0] = y[i]; } Multiplication(xT, newY, out xTy); double[,] xTxConv = new double[xTx.GetLength(0), xTx.GetLength(1)]; Converting(xTx, out xTxConv); double[,] K = new double[xTxConv.GetLength(0), xTxConv.GetLength(0)]; Multiplication(xTxConv, xTy, out K); Ym = new double[N - Nstr]; for (i = 0; i < M + 1; i++) { Koef[i] = K[i, 0]; } for (i = 0; i < N - Nstr; i++) { for (j = 1; j < M; j++) { Ym[i] += Koef[j] * x[i, j - 1]; } Ym[i] += Koef[0]; if (Ym[i] < 0) { Ym[i] = 0; //если Ym<0, обнуляем } } //оценка остаточной дисперсии double ChDe = 0; double De; for (i = 0; i < N - Nstr; i++) { ChDe += Math.Pow((Ym[i] - y[i]), 2); } De = ChDe / (N - Nstr - M + 1 - 1); //Оценка коэффициента детерминации(коэффициент множественной корреляции) double R2 = Math.Abs(1 - De / Dy); //оценки дисперсий коэффициентов уравнения регрессии double[] Da = new double[M]; double[,] Matrix = new double[N - Nstr, 1]; double[,] MatrixT, MatrixT_Matrix, MatrixT_Matrix_Conv; for (j = 0; j < M; j++) { for (i = 0; i < N - Nstr; i++) { Matrix[i, 0] = x[i, j]; } Transpose(Matrix, out MatrixT); Multiplication(MatrixT, Matrix, out MatrixT_Matrix); Converting(MatrixT_Matrix, out MatrixT_Matrix_Conv); Da[j] = De * MatrixT_Matrix_Conv[0, 0]; } //расчет статистики Z для проверки коэффициентов на значимость double[] Z = new double[M]; for (j = 0; j < M; j++) { Z[j] = Koef[j] / Math.Sqrt(Da[j]); } int q = N - Nstr - M - 1; //количество степеней свобод double Tkr; Chart Chart1 = new Chart(); Tkr = Chart1.DataManipulator.Statistics.InverseTDistribution(.05, q); //критическое значение критерия Стьюдента, соответствующее вероятности 0,05 double[] P = new double[M]; i = 0; //вычислим достигнутые уровни значимости и выведем на экран foreach (double el in Z) { P[i] = Chart1.DataManipulator.Statistics.TDistribution(el, q, false); if (Math.Abs(el) > Tkr) { Znachimost.AppendText(" - значимый. Р = " + Math.Round(P[i], 6) + "\n"); } else { Znachimost.AppendText(" - незначимый. Р = " + Math.Round(P[i], 6) + "\n"); } i++; } //Оценка прогнозирующей способности double[,] x_new = new double[Nstr, M]; double[] y_new = new double[Nstr]; double[] Ym_new = new double[Nstr]; int n_new = Nstr; for (i = N - n_new; i < N; i++) { for (j = 0; j < Q_Col; j++) { if (j != (Q_Col - 1)) { x_new[i - (N - n_new), j] = Data[i, j]; } else { y_new[i - (N - n_new)] = Data[i, j]; } } } for (i = 0; i < n_new; i++) { for (j = 1; j < M; j++) { Ym_new[i] += Koef[j] * x_new[i, j - 1]; } Ym_new[i] += Koef[0]; } //Оценка дисперсии адекватности double Dad = 0; double ChDad = 0; for (i = 0; i < n_new; i++) { ChDad += Math.Pow((Ym_new[i] - y_new[i]), 2); } Dad = ChDad / n_new; Adekvatnost.AppendText("R2 = " + Math.Round(R2, 4) + "\nDe = " + Math.Round(De, 4) + "\nDad = " + Math.Round(Dad, 4) + "\n"); double F = Dad / De; double Fkr = Chart1.DataManipulator.Statistics.InverseFDistribution(.05, n_new, N - n_new - M - 1); if (F < Fkr) { Adekvatnost.AppendText("Модель адекватна\n"); } else { Adekvatnost.AppendText("Модель неадекватна\n"); } double p = 0; p = Chart1.DataManipulator.Statistics.FDistribution(F, n_new, q); Adekvatnost.AppendText("P = " + Math.Round(p, 4)); //заполнение промежуточного файла данными о модели //полученное уравнение регрессии string str = "y = "; for (i = 0; i <= M; i++) { if (Koef[i] != null) { if (i == 0) { str += +Koef[i]; } else { str += " + " + Koef[i] + " * x" + i; } } } File.WriteAllText("PromFile.txt", "\r\nПолученная модель: \r\n\r\n" + str + "\r\n\r\nФакторы:\r\n\r\nВключенные в модель:", Encoding.GetEncoding(1251)); bool[] check = new bool[] { checkBox1.Checked, checkBox2.Checked, checkBox3.Checked, checkBox4.Checked }; int k1 = 0; //включенные факторы for (i = 0; i < 4; i++) { if (check[i]) { File.AppendAllText("PromFile.txt", "\r\nx" + (i + 1), Encoding.GetEncoding(1251)); switch (i) { case 0: File.AppendAllText("PromFile.txt", " - средняя температура.\t", Encoding.GetEncoding(1251)); break; case 1: File.AppendAllText("PromFile.txt", " - максимальная температура.\t", Encoding.GetEncoding(1251)); break; case 2: File.AppendAllText("PromFile.txt", " - минимальная температура.\t", Encoding.GetEncoding(1251)); break; case 3: File.AppendAllText("PromFile.txt", " - тепловая нагрузка.\t", Encoding.GetEncoding(1251)); break; } if (Math.Abs(Z[k1]) > Tkr) { File.AppendAllText("PromFile.txt", " Значимый.\tДостигнутый уровень значимости Р = " + Math.Round(P[k1], 6), Encoding.GetEncoding(1251)); } else { File.AppendAllText("PromFile.txt", " Незначимый.\tДостигнутый уровень значимости Р = " + Math.Round(P[k1], 6), Encoding.GetEncoding(1251)); } k1++; } } //исключенные факторы File.AppendAllText("PromFile.txt", "\r\n\r\nИсключенные из модели: \r\n", Encoding.GetEncoding(1251)); for (i = 0; i < 4; i++) { if (!check[i]) { File.AppendAllText("PromFile.txt", "x" + (i + 1), Encoding.GetEncoding(1251)); switch (i) { case 0: File.AppendAllText("PromFile.txt", " - средняя температура.\t", Encoding.GetEncoding(1251)); break; case 1: File.AppendAllText("PromFile.txt", " - максимальная температура.\t", Encoding.GetEncoding(1251)); break; case 2: File.AppendAllText("PromFile.txt", " - минимальная температура.\t", Encoding.GetEncoding(1251)); break; case 3: File.AppendAllText("PromFile.txt", " - тепловая нагрузка.\t", Encoding.GetEncoding(1251)); break; } } } //характеристики модели File.AppendAllText("PromFile.txt", "\r\n\r\nХарактеристики модели: \r\n", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", "\r\nОценка коэффициентов корреляции между независимыми и зависимыми СВ: \r\nRxy[j] = ", Encoding.GetEncoding(1251)); for (i = 0; i < M; i++) { File.AppendAllText("PromFile.txt", Rxy[i].ToString() + "\r\n"); } File.AppendAllText("PromFile.txt", "\r\nОценка коэффициентов корреляции между независимыми СВ: \r\nRxx[i,j] = ", Encoding.GetEncoding(1251)); for (i = 0; i < M; i++) { for (j = 0; j < M; j++) { File.AppendAllText("PromFile.txt", Rxx[i, j].ToString() + "\t "); } File.AppendAllText("PromFile.txt", "\r\n"); } File.AppendAllText("PromFile.txt", "\r\nОценка остаточной дисперсии: \r\nDe = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", De.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "\r\nОценка коэффициента детерминации: \r\nR2 = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", R2.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "\r\nОценка дисперсии коэффициентов уравнения регрессии: \r\nDa[j] = ", Encoding.GetEncoding(1251)); for (i = 0; i < M; i++) { File.AppendAllText("PromFile.txt", Da[i].ToString() + "\r\n"); } File.AppendAllText("PromFile.txt", "\r\nZ - статистика: \r\nZ[j] = ", Encoding.GetEncoding(1251)); for (i = 0; i < M; i++) { File.AppendAllText("PromFile.txt", Z[i].ToString() + "\r\n"); } File.AppendAllText("PromFile.txt", "\r\nКритическое значение критерия Стьюдента, соответствующее вероятности 0,05: \r\nTkr = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", Tkr.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "\r\n\r\nМодель была построена на " + (N - n_new) + " данных. И проверена на " + n_new + " данных.\r\n\r\nОценка дисперсии адекватности: \r\nDad = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", Dad.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "\r\nКритерий Фишера: \r\nF = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", F.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "\r\nКритическое значение критерия Фишера: \r\nFkr = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", Fkr.ToString() + "\r\n"); if (F < Fkr) { File.AppendAllText("PromFile.txt", "\r\nМодель адекватна\r\n", Encoding.GetEncoding(1251)); } else { File.AppendAllText("PromFile.txt", "\r\nМодель неадекватна\r\n", Encoding.GetEncoding(1251)); } File.AppendAllText("PromFile.txt", "\r\nДостигнутый уровень значимости: \r\nP = ", Encoding.GetEncoding(1251)); File.AppendAllText("PromFile.txt", p.ToString() + "\r\n"); File.AppendAllText("PromFile.txt", "________________________________________________________________________________________\r\n\r\n"); }