- •Содержание
- •Техническое задание
- •Введение
- •Разработка алгоритма
- •Математический алгоритм
- •Разработка схем алгоритмов
- •2. Разработка программы
- •2.1 Разработка программы на пк.
- •2.2 Разработка программы на микроконтроллер.
- •Вычислительный эксперимент
- •3.1 Программа разработанная на языке с#.
- •4.3 Обращение к программе
- •Входные и выходные данные
- •Руководство пользователя
- •Заключение
- •Список литературы
- •Приложение а Текст программы на пк.
- •Приложение б Текст программы на микроконтоллер.
Заключение
Разработанная программа соответствует заданным на этапе проектирования требованиям. Во время работы над программой были улучшены навыки программирования на языке С#, а также навыки программирования микроконтроллеров. Была исследована модель нейросети созданная на микроконтроллере, которая показала хорошие результаты.
В качестве перспектив развития данной темы можно отметить такие нереализованные возможности как обучение непосредственно на микроконтроллере, подключение датчиков для формирования входных значений и непосредственное применение в какой-либо области робототехники.
Список литературы
Павловская Т.А. C#. Программирование на языке высокого уровня. СПб. : Питер, 2007.
Фролов А. В., Фролов Г. В. Язык С#. Самоучитель. М: ДИАЛОГ-МИФИ, 2003.- 560с.
STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs – Datasheet.
ГОСТ 2.105-95 Единая система конструкторской документации. Общие требования к текстовым документам.
ГОСТ 19.504-79 (СТ СЭВ 2095-80). Руководство программиста. Требования к содержанию и оформлению.
ГОСТ 19.701-90 (ИСО 5807-85). ЕСПД. Схемы алгоритмов, программ, данных и систем.
Приложение а Текст программы на пк.
Текст программы файла Form1.cs представлен на рисунке А.1.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.IO.Ports;
namespace курсовой_титп_2
{
public partial class Form1 : Form
{
public double[] x1, x2, r;
Random number = new Random();
Neyro nr;
public bool flag = false; //флаг создания нейросети
public bool fl_pot = false; //флаг работы потоков
public Thread pp;
public Thread pp1;
public DateTime dd;
public int mx = 5, my = 100; //Масштаб
public System.Drawing.Graphics graphicsObj;
public Pen myPen1 = new Pen(System.Drawing.Color.Red, 1);
public Pen myPen2 = new Pen(System.Drawing.Color.Black, 1);
public static SerialPort sp = new SerialPort(); // com port
public bool flag_connect = false; //флаг соединения по ком порту
public Thread readThread; //поток чтения ком портаъ
public Form1()
{
this.x1 = new double[200]; //числа первого класса
this.x2 = new double[200]; //числа второго класса
this.r = new double[6]; //рандомные числа
double sum_r = 0;
for(int i=0; i<200;i++)
{
for (int j = 0; j < 6; j++)
{
r[j] = number.NextDouble();
sum_r += r[j];
}
x1[i] = (sum_r - 3) / Math.Sqrt(0.5);
x1[i] = Math.Round(x1[i],3)+2.5;
x2[i] = x1[i] + 7.5;
Рисунок А.1 – Текст программы файла Form1.cs.
Продолжение приложения А
sum_r = 0;
}
InitializeComponent();
//обновление списка доступных ком портов
comboBox2.Items.AddRange(SerialPort.GetPortNames());
//установка первого доступного ком порта в список
if (SerialPort.GetPortNames().Length != 0)
{
comboBox2.Text = SerialPort.GetPortNames()[0];
}
//int aaa = sizeof(double);
}
// ///////////////////////////////////////////
// кнопка создать сеть
private void button1_Click(object sender, EventArgs e)
{
int neyr1, neyr2;
double k, skor;
flag = true;
if (textBox1.TextLength != 0)
{
neyr1 = Convert.ToInt32(textBox1.Text); //количество нейронов первого слоя
}
else
{
MessageBox.Show("Введите количество нейронов первого слоя");
return;
}
if (textBox2.TextLength != 0)
{
neyr2 = Convert.ToInt32(textBox2.Text); //количество нейронов второго слоя
}
else
{
MessageBox.Show("Введите количество нейронов второго слоя");
return;
}
if (textBox9.TextLength != 0)
{
k = Convert.ToDouble(textBox9.Text); //коэффицент сигмоида k
}
else
{
MessageBox.Show("Введите k");
return;
}
if (textBox11.TextLength != 0)
{
skor = Convert.ToDouble(textBox9.Text); //коэффицент скорости обучения
}
Рисунок А.1 – Продолжение.
Продолжение приложения А
else
{
MessageBox.Show("Введите skor");
return;
}
nr = new Neyro(neyr1, neyr2, k, skor); //вызываем конструктор класса
nr.CreateNS();
//выводим резульат нейросети
textBox3.Clear();
for(int i=0; i<neyr2;i++)
{
textBox3.AppendText(Convert.ToString(Math.Round(nr.rez[i],3)) +" ");
}
}
////////////////////////////////////////////////////////////
//кнопка сброс
private void button2_Click(object sender, EventArgs e)
{
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox6.Clear();
textBox7.Clear();
comboBox1.Text = "";
comboBox2.Text = "";
comboBox3.Text = "";
comboBox4.Text = "";
}
// //////////////////////////////////////
// кнопка обучить 1 класс
private void button3_Click(object sender, EventArgs e)
{
string file;
//int kl = 1;
string file_osibka = "oshibka.txt";
if (flag == false)
{
MessageBox.Show("Создайте сеть");
return;
}
if (comboBox1.Text != "")
{
file = comboBox1.Text; //выбранный файл для обучения первого класса
}
Рисунок А.1 – Продолжение.
Продолжение приложения А
else
{
MessageBox.Show("Выберите файл");
return;
}
//создаем файл для вывода ошибки
FileStream fo = new FileStream(file_osibka, FileMode.Create, FileAccess.Write, FileShare.Write);
fo.Close();
StreamWriter sw1 = new StreamWriter(file_osibka, true, Encoding.Unicode);
nr.Obuchenie(file,sw1);
///////////////////////////////////////////////
//выводим результат
textBox3.Clear();
for (int i = 0; i < nr.neyr2; i++)
{
textBox3.AppendText(Convert.ToString(Math.Round(nr.rez[i],3)) + " ");
}
sw1.Close();
grafic();
}
// ////////////////////////////////////////////////
//кнопка результат
private void button4_Click(object sender, EventArgs e)
{
double err = 0;
string file;
bool[] znach = new bool[nr.neyr2];
int kl=0;
if (flag == false)
{
MessageBox.Show("Создайте сеть");
return;
}
for (int i = 0; i < nr.neyr2; i++)
{
znach[i] = false;
}
if (comboBox3.Text != "")
{
file = comboBox3.Text;
}
else
{
MessageBox.Show("Выберите файл тестовой выборки");
return;
}
Рисунок А.1 – Продолжение.
Продолжение приложения А
string[] text = File.ReadAllLines(file); //читаем содержимое файла в переменную text
for (int i = 0; i < 10; i++)
{
nr.vvod[i] = Convert.ToDouble(text[i])/10;
}
//пересчитываем результат
nr.Rez();
for (int i = 0; i < nr.neyr2; i++)
{
if (nr.rez[i] < 0.5)
znach[i] = false;
if (nr.rez[i] > 0.5)
znach[i] = true;
}
for (int i = 0; i < nr.neyr2; i++)
{
if (znach[i] == nr.ogid1[i])
{}
else goto m;
}
kl = 1;
m:
for (int i = 0; i < nr.neyr2; i++)
{
if (znach[i] == nr.ogid2[i])
{}
else goto m1;
}
kl = 2;
m1:
textBox3.Clear();
for (int i = 0; i < nr.neyr2; i++)
{
textBox3.AppendText(Convert.ToString(Math.Round(nr.rez[i],3)) + " ");
}
for (int i = 0; i < nr.neyr2; i++)
{
err = err + (nr.rez[i] - nr.ogid[i]) * (nr.rez[i] - nr.ogid[i]);
}
err = err / 2;
textBox7.Clear();
textBox7.AppendText(Convert.ToString(Math.Round(err,3)));
if (kl == 0)
{
MessageBox.Show("Класс не определен");
}
if (kl == 1)
{
MessageBox.Show("Выборка относится к первому классу");
}
Рисунок А.1 – Продолжение.
Продолжение приложения А
if (kl == 2)
{
MessageBox.Show("Выборка относится ко второму классу");
}
}
// ////////////////////////////////////////////////////////
// Кнопка Старт для экзамена
private void button7_Click(object sender, EventArgs e)
{
string file;
bool[] znach = new bool[nr.neyr2];
int kl = 0;
int kl_opr = 0;
double procent = 0;
double kol = 0;
if (flag == false)
{
MessageBox.Show("Создайте сеть");
return;
}
for (int i = 0; i < nr.neyr2; i++)
{
znach[i] = false;
}
if (comboBox4.Text != "")
{
file = comboBox4.Text;
}
else
{
MessageBox.Show("Выберите файл экзаменационной выборки");
return;
}
if (file[0] == '1' || file[0] == '4')
{
kl = 1;
}
if (file[0] == '2' || file[0] == '3')
{
kl = 2;
}
string[] text = File.ReadAllLines(file); //читаем содержимое файла в переменную text
double[,] chisla = new double[text.Length / 10, 10];
//вносим в матрицу chisla данные из файла
for (int i = 0; i < text.Length / 10; i++)
for (int j = 0; j < 10; j++)
{
chisla[i, j] = Convert.ToDouble(text[10 * i + j]);
}
for (int qq = 0; qq < (text.Length / 10); qq++)
{
Рисунок А.1 – Продолжение.
Продолжение приложения А
//вносим в массив vvod данные из файла
for (int i = 0; i < 10; i++)
{
nr.vvod[i] = chisla[qq, i]/10;
}
//пересчитываем результат
nr.Rez();
for (int i = 0; i < nr.neyr2; i++)
{
if (nr.rez[i] < 0.5)
znach[i] = false;
if (nr.rez[i] > 0.5)
znach[i] = true;
}
for (int i = 0; i < nr.neyr2; i++)
{
if (znach[i] == nr.ogid1[i])
{ }
else goto m;
}
kl_opr = 1;
m:
for (int i = 0; i < nr.neyr2; i++)
{
if (znach[i] == nr.ogid2[i])
{ }
else goto m1;
}
kl_opr = 2;
m1: ;
if (kl == kl_opr)
{
kol++;
}
procent = kol / 20;
procent = procent * 100;
textBox4.Clear();
textBox4.AppendText(Convert.ToString(procent));
}
}
////////////////////////////////////////
//кнопка выход
private void button8_Click(object sender, EventArgs e)
{
if (fl_pot)
{
pp1.Abort();
pp.Abort();
}
if (sp.IsOpen)
{
flag_connect = false;
Рисунок А.1 – Продолжение.
Продолжение приложения А
readThread.Join();
sp.Close();
}
Application.Exit();
}
/////////////////////////////////////////////////////
//кнопка для вывода ошибок
// ///////////////////////////////////////////////////
private void button9_Click(object sender, EventArgs e)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
pp = new Thread(pot);
pp1=new Thread(pot1);
fl_pot = true;
pp.Start();
pp1.Start();
}
// ///////////////////////////////
public void pot()
{
int neyr1 = 15, neyr2 = 4;
string[] file_osibka = new string[2000];
double k, skor=0.7;
for (int i = 0; i < 2000; i++)
{
file_osibka[i] = "err/err" + Convert.ToString(i) + ".txt";
}
//создаем файл для вывода ошибки
int ii = 0;
FileStream fo = new FileStream(file_osibka[ii], FileMode.Create, FileAccess.Write, FileShare.Write);
fo.Close();
StreamWriter sw1 = new StreamWriter(file_osibka[ii], true, Encoding.Unicode);
//for (skor = 0.1; skor < 3; skor+=0.1)
//{
for (k = 0.1; k < 5; k+=0.1)
{
nr = new Neyro(neyr1, neyr2, k,skor);
textBox5.Clear();
textBox5.AppendText("k=" + Convert.ToString(k) + ";skor=" + Convert.ToString(skor));
//создаем сеть
nr.CreateNS();
//обучение
Рисунок А.1 – Продолжение.
Продолжение приложения А
nr.Obuchenie("1-100.txt", sw1);
//sw1.Close();
//ii++;
grafic();
}
//}
sw1.Close();
//sw1.WriteLine();
//sw1.WriteLine("Время - " + dd.ToLongTimeString());
//sw1.Close();
fl_pot = false;
textBox5.Text = "Все";
MessageBox.Show("Поток завершен", "Все", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
public void pot1()
{
dd = new DateTime(1, 1, 1, 0, 0, 0);
//time = 0;
while (fl_pot)
{
textBox8.Clear();
textBox8.AppendText(dd.ToLongTimeString());
Thread.Sleep(1000);
dd = dd.AddSeconds(1);
}
}
// /////////////////////////////////////////////////
// Функция рисующая график
// ///////////////////////////////
private void grafic()
{
int i = 0;
graphicsObj = this.CreateGraphics();
graphicsObj.Clear(System.Drawing.SystemColors.Control);
textBox10.Clear();
graphicsObj.DrawLine(myPen2, 480, 250, 1000, 250);
graphicsObj.DrawLine(myPen2, 500, 30, 500, 270);
for (int xx = 1; xx < 20; xx++)
{
delenie(xx, xx, 0.2, -0.2, (mx*5));
}
for (double yy = -2; yy <= 0; yy++)
{
delenie(0.05, -0.05, yy, yy, my);
}
for (i = 0; i < 99; i++)
{
graphicsObj.DrawLine(myPen1, m_x(i), m_y(nr.err_m[i]), m_x((i) + 1), m_y(nr.err_m[i + 1]));
textBox10.AppendText(Convert.ToString(i) + " " + Convert.ToString(Math.Round(nr.err_m[i],5)));
textBox10.AppendText("\r\n");
Рисунок А.1 – Продолжение.
Продолжение приложения А
}
textBox10.AppendText(Convert.ToString(99) + " " + Convert.ToString(Math.Round(nr.err_m[99], 5)));
}
private float m_x(double a)
{
float b;
b = Convert.ToInt32(a * mx + 500);
return b;
}
private float m_y(double a)
{
float b;
b = Convert.ToInt32(a * (-1) * my + 250);
return b;
}
private void delenie(double x1, double x2, double y1, double y2, int m)
{
x1 = x1 * m + 500;
x2 = x2 * m + 500;
y1 = y1 * m + 250;
y2 = y2 * m + 250;
graphicsObj.DrawLine(myPen2, Convert.ToInt32(x1), Convert.ToInt32(y1), Convert.ToInt32(x2), Convert.ToInt32(y2));
}
//////////////////////////////////////////////////////////////////
// Кнопка соединения через ком порт Connect/Disconnect
//////////////////////////////////////////////////////////////////
private void button10_Click(object sender, EventArgs e)
{
if (!flag_connect)
{
sp.PortName = comboBox2.Text;
sp.BaudRate = 9600;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
// Set the read/write timeouts
sp.ReadTimeout = 500;
sp.WriteTimeout = 500;
sp.Open();
label19.Text = sp.PortName;
textBox12.Clear();
button10.Text = "Disconnect";
flag_connect = true;
readThread = new Thread(Read);
readThread.Start();
return;
}
if (flag_connect)
{
flag_connect = false;
Рисунок А.1 – Продолжение.
Продолжение приложения А
readThread.Join();
sp.Close();
label19.Text = "—";
button10.Text = "Connect";
return;
}
}
//////////////////////////////////////////////////////////////////
// Поток для чтения
//////////////////////////////////////////////////////////////////
public void Read()
{
while (flag_connect)
{
try
{
string message = sp.ReadLine();
textBox12.AppendText(message);
}
catch (TimeoutException) { }
}
}
//////////////////////////////////////////////////////////////////
// Кнопка Refresh
//////////////////////////////////////////////////////////////////
private void button11_Click(object sender, EventArgs e)
{
comboBox2.Items.Clear();
comboBox2.Items.AddRange(SerialPort.GetPortNames());
}
//////////////////////////////////////////////////////////////////
// Кнопка Передать коэффициенты
//////////////////////////////////////////////////////////////////
private void button6_Click(object sender, EventArgs e)
{
int count_ves_k = 0; //кол-во весовых коэффициентов
if (flag == false)
{
MessageBox.Show("Создайте сеть");
return;
}
count_ves_k = 10 * nr.neyr1 + nr.neyr1 * nr.neyr2;
string[] mas = new string[count_ves_k];
int i = 0;
//Заполнение массива из матрицы w1
for (int q = 0; q < 10; q++)
{
for (int p = 0; p < nr.neyr1; p++)
{
mas[i] = Convert.ToString(Math.Round(nr.w1[q, p],10));
i++;
Рисунок А.1 – Продолжение.
Продолжение приложения А
}
}
//Заполнение массива из матрицы w2
for (int q = 0; q < nr.neyr1; q++)
{
for (int p = 0; p < nr.neyr2; p++)
{
mas[i] = Convert.ToString(Math.Round(nr.w2[q, p], 10));
i++;
}
}
if (sp.IsOpen)
{
sp.WriteLine("w"); //для передачи коэффициентов
for (i = 0; i < count_ves_k; i++)
{
sp.WriteLine(mas[i]);
Thread.Sleep(100);
}
}
else
{
textBox12.Text = "Порт не подключен";
}
}
//////////////////////////////////////////////////////////////////
// Событие при закрытии формы
//////////////////////////////////////////////////////////////////
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (flag_connect)
{
flag_connect = false;
readThread.Join();
sp.Close();
}
}
//////////////////////////////////////////////////////////////////
// Кнопка Sendto MC
//////////////////////////////////////////////////////////////////
private void button12_Click(object sender, EventArgs e)
{
string file;
if (flag == false)
{
MessageBox.Show("Создайте сеть");
return;
}
if (comboBox3.Text != "")
{
file = comboBox3.Text;
}
else
{
Рисунок А.1 – Продолжение.
Продолжение приложения А
MessageBox.Show("Выберите файл тестовой выборки");
return;
}
string[] text = File.ReadAllLines(file); //читаем содержимое файла в переменную text
if (sp.IsOpen)
{
sp.WriteLine("c"); //для передачи чисел
for (int i = 0; i < 10; i++)
{
sp.WriteLine(text[i]);
Thread.Sleep(100);
}
}
else
{
textBox12.Text = "Порт не подключен";
}
}
}
//////////////////////////////////////////////////////////////////
// Класс, который работает с нейросетью
//////////////////////////////////////////////////////////////////
public class Neyro : Form1
{
public double[] prom, vvod;
public double[,] w1, w2;
public double[] rez;
public int count1=0, count2=0;
public int neyr1, neyr2;
public int[] ogid;
public bool[] ogid1, ogid2;
public double k, skor;
public double[] err_m = new double[100];
//конструктор. при создании объекта класса задаем параметры матриц
public Neyro(int neyr1, int neyr2, double k, double skor)
{
this.neyr1 = neyr1;
this.neyr2 = neyr2;
this.k = k;
this.skor = skor;
this.ogid = new int[neyr2];
this.ogid1 = new bool[neyr2];
this.ogid2 = new bool[neyr2];
this.w1 = new double[10, neyr1];
this.w2 = new double[neyr1, neyr2];
this.prom = new double[neyr1];
this.vvod = new double[10];
this.rez = new double[neyr2];
Random number = new Random();
Рисунок А.1 – Продолжение.
Продолжение приложения А
//Заполнение матрицы весовых коэффицентов w1
for (int q = 0; q < 10; q++)
{
for (int p = 0; p < neyr1; p++)
{
w1[q, p] = number.NextDouble()-0.5;
}
}
//Заполнение матрицы весовых коэффицентов w2
for (int q = 0; q < neyr1; q++)
{
for (int p = 0; p < neyr2; p++)
{
w2[q, p] = number.NextDouble()-0.5;
}
}
ogid1[0] = false;
for (int i = 1; i < neyr2; i++)
{
if (ogid1[i - 1] == false)
ogid1[i] = true;
else ogid1[i] = false;
}
ogid2[0] = true;
for (int i = 1; i < neyr2; i++)
{
if (ogid2[i - 1] == false)
ogid2[i] = true;
else ogid2[i] = false;
}
}
//код, который будет выполняться в потоке
public void Potok1(object _Data)
{
double sum1 = 0;
for (int n = 0; n < (neyr1 / 2); n++)
{
for (int i = 0; i < 10; i++)
{
sum1 = sum1 + (vvod[i] * w1[i, n]);
}
prom[n] = Math.Round(1 / (1 + Math.Exp((-sum1)*k)), 3);
sum1 = 0;
}
count1++;
}
public void Potok2(object _Data)
{
double sum2 = 0;
for (int n = (neyr1 / 2); n < neyr1; n++)
{
Рисунок А.1 – Продолжение.
Продолжение приложения А
for (int i = 0; i < 10; i++)
{
sum2 = sum2 + (vvod[i] * w1[i, n]);
}
prom[n] = 1 / (1 + Math.Exp((-sum2)*k));
sum2 = 0;
}
count1++;
}
public void Potok3(object _Data)
{
double sum1 = 0;
for (int n = 0; n < (neyr2 / 2); n++)
{
for (int i = 0; i < neyr1; i++)
{
sum1 = sum1 + (prom[i] * w2[i, n]);
}
rez[n] = 1 / (1 + Math.Exp((-sum1)*k));
sum1 = 0;
}
count2++;
}
public void Potok4(object _Data)
{
double sum2 = 0;
for (int n = (neyr2 / 2); n < neyr2; n++)
{
for (int i = 0; i < neyr1; i++)
{
sum2 = sum2 + (prom[i] * w2[i, n]);
}
rez[n] = 1 / (1 + Math.Exp((-sum2)*k));
sum2 = 0;
}
count2++;
}
public int[] Vihod(int kol, int kl) //функция формирует ожидаемые значения
{
int a=0;
if (kl == 2 || kl==3)
a = 1;
int[]mas=new int[kol];
for (int i = 0; i < kol; i++)
{
mas[i] = a;
if (a == 0)
a = 1;
else a = 0;
}
return mas;
Рисунок А.1 – Продолжение.
Продолжение приложения А
public void Korekt() //коректировка весов матриц
{
double[] beta2 = new double[neyr2];
double[] beta1 = new double[neyr1];
//double skor = 0.5;
double summa = 0;
//ощибка выходного слоя
for (int q = 0; q < neyr2; q++)
{
beta2[q] = (ogid[q] - rez[q]) * (1 - rez[q]) * rez[q];
}
//коректировка весов матрицы w2
for (int p = 0; p < neyr1; p++)
{
for (int q = 0; q < neyr2; q++)
{
w2[p, q] = (w2[p, q] + skor * beta2[q] * prom[p]);
if (w2[p, q] == 0)
{
w2[p, q] = 0.1;
}
}
}
//ошибка промежуточного слоя
summa = 0;
for (int q = 0; q < neyr1; q++)
{
for (int k = 0; k < neyr2; k++)
{
summa = summa + beta2[k] * w2[q, k];
}
beta1[q] = (1 - prom[q]) * prom[q] * summa;
summa = 0;
}
//коректировка весов матрицы w1
for (int p = 0; p < 10; p++)
{
for (int q = 0; q < neyr1; q++)
{
w1[p, q] = (w1[p, q] + skor * beta1[q] * vvod[p]);
if (w1[p, q] == 0)
{
w1[p, q] = 0.1;
}
}
}
}
public void Rez()
{
//пересчитываем результат
Thread th_11 = new Thread(Potok1);
Thread th_22 = new Thread(Potok2);
th_11.Start("11");
th_22.Start("22");
Рисунок А.1 – Продолжение.
Продолжение приложения А
while (count1 != 2) { }
count1 = 0;
Thread th_33 = new Thread(Potok3);
Thread th_44 = new Thread(Potok4);
th_33.Start("33");
th_44.Start("44");
while (count2 != 2) { }
count2 = 0;
}
public void CreateNS()
{
string[] text = File.ReadAllLines("1-1.txt"); //читаем содержимое файла в переменную text
for (int i = 0; i < 10; i++)
{
vvod[i] = Convert.ToDouble(text[i])/10; //создаем массив входных значений
}
//считаем результат
Rez();
}
public void Obuchenie(string file, StreamWriter sw1)
{
double err = 0;
int klass = 0;
int ee = 0;
string[] text = File.ReadAllLines(file); //читаем содержимое файла в переменную text
for (int qq = 0; qq < 1100; )
{
klass = Convert.ToInt32(text[qq]);
qq++;
ogid = Vihod(neyr2, klass); //создаем функцию которая должна получится
for (int i = 0; i < 10; i++)
{
vvod[i] = Convert.ToDouble(text[qq])/10;
qq++;
}
Rez(); //пересчитываем результат
Korekt(); //коректируем веса
Rez(); //еще раз пересчитываем результат
//считаем ошибку
err = 0;
for (int i = 0; i < neyr2; i++)
{
err = err + (rez[i] - ogid[i]) * (rez[i] - ogid[i]);
}
Рисунок А.1 – Продолжение.
Продолжение приложения А
err = err / 2;
err_m[ee] = err; //записываем все ошибки в массив
ee++;
//выводим ошибку
textBox7.Clear();
textBox7.AppendText(Convert.ToString(Math.Round(err, 5)));
//выводим ошибку в файл
sw1.Write(Convert.ToString(Math.Round(err, 5)) + " ");
}
sw1.WriteLine();
}
}
}
Рисунок А.1 – Продолжение.