public static epoha obuch(double[] real, double[] t, int p, int n, int epoch, double nu) // real - значения, расчитанные по формуле, n = 20; t - распределение { int k = 0; // Счетчик эпох List <epoha> Ep = new List <epoha>(); double dlta; double net1; List <double[]> netlist = new List <double[]>(); List <double> nextw = Enumerable.Repeat(0.0, p + 1).ToList(); // Значения для весов следующей эпохи, заполняем нулями, +1 для w0 double[] xline = t; do { epoha Ep_ = new epoha(nextw); Ep.Add(Ep_); Ep[k].nomer = k; //Ep[k].Y = new double[14]; double[] tempW = nextw.ToArray(); for (int i = 0; i < n - p; i++) { List <double> tempT = getT(real, i, i + p); net1 = paramsNS.net(tempW, tempT, p); dlta = paramsNS.delta(real[i + p], net1); //Ep[k].Y[i] = net1; tempW = paramsNS.pereshetW(tempW, tempT, nu, dlta); nextw = converter(tempW); if (k == epoch - 1) // Считаем ошибку только для последней эпохи { Ep[k].E = Math.Sqrt(dlta * dlta); } } k++; } while (k != epoch); // пока не пройдем эпохи return(Ep[epoch - 1]); }
private void button3_Click(object sender, EventArgs e) { int N = Convert.ToInt32(textBox6.Text); // Число точек по X int p = Convert.ToInt32(textBox3.Text); // Исходное количество нейронов if (p >= N) { MessageBox.Show("p должно быть меньше N", "Ошибка", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); return; } double nu = formula.ParseDouble1(textBox2.Text); // Коэффициент обучения double a = formula.ParseDouble1(textBox4.Text); // Нижняя граница временного интервала double b = formula.ParseDouble1(textBox5.Text); // Верхняя граница временного интервала double shag = Math.Abs(a - b) / N; double[] t = new double[N]; double[] y = new double[N]; int numepoh = Convert.ToInt32(textBox1.Text); t = formula.respred(a, b, N); for (int i = 0; i < t.Length; i++) { y[i] = tsin(t[i]); } epoha EP = formula.obuch(y, t, p, N, numepoh, nu); double result; double[] finalresult = new double [2 * N]; for (int dd = 0; dd < y.Length; dd++) { finalresult[dd] = y[dd]; } List <double> result_vector = new List <double>(); for (int i = N - p; i < 2 * N - p; i++) { List <double> tempT = formula.getT(finalresult, i, i + p); result = paramsNS.net(EP.W, tempT, p); result_vector.Add(result); finalresult[i + p] = result; } double[] realy = new double[2 * N]; int ii = 0; for (double i = a; i < 2 * b - a; i += shag) { realy[ii] = tsin(i); ii++; } Draw2Point(a, 2 * b - a, finalresult, realy, shag); label7.Text = "Среднеквадратическая ошибка: " + Convert.ToString(EP.E); }