Дипломная работа. Разработка виртуального лабораторного комплекса по дисциплине Методы оптимизации
Скачать 2.09 Mb.
|
OperatorContainer.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespaceдиплом_беловой { publicclassOperatorContainer { publicstatic List staticOperatorContainer() { operators.Add(new operators("(", 1)); operators.Add(new operators(")", 1)); operators.Add(new operators("+", 2)); operators.Add(new operators("-", 2)); operators.Add(new operators("*", 3)); operators.Add(new operators("/", 3)); operators.Add(new operators("s", 4)); //sin operators.Add(new operators("c", 4)); //cos operators.Add(new operators("t", 4)); //tg operators.Add(new operators("q", 4)); //sqrt operators.Add(new operators("r", 4)); //sqrtn operators.Add(new operators("p", 4)); //sqr operators.Add(new operators("l", 4)); //ln operators.Add(new operators("v", 4)); //pow operators.Add(new operators("e", 5)); //e operators.Add(new operators("x", 5)); //x } publicstatic operators Find(string op) { foreach (var item in operators) { if (item.Value == op) { return item; } } returnnull; } } } operators.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespaceдиплом_беловой { publicclassoperators { publicstring Value; publicdouble tempValue; publicint priorst; publicoperators(string Value, int priorst) { this.Value = Value; this.priorst = priorst; } publicoperators(double Value, int priorst) { this.tempValue = Value; this.Value = Convert.ToString(this.tempValue); this.priorst = priorst; } } } steps.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespaceдиплом_беловой { publicclasssteps { publicint step { get; set; } publicdouble xi { get; set; } publicdouble fxi { get; set; } publicdouble minx { get; set; } publicdouble minfx { get; set; } publicdouble h { get; set; } publicdouble a { get; set; } publicdouble b { get; set; } publicdouble En { get; set; } publicdouble x1 { get; set; } publicdouble x2 { get; set; } publicdouble fx1 { get; set; } publicdouble fx2 { get; set; } } } Users.Context.cs namespaceдиплом_беловой { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; publicpartialclassUsersContainer : DbContext { publicUsersContainer() : base("name=UsersContainer") { } protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder) { thrownew UnintentionalCodeFirstException(); } publicvirtual DbSet publicvirtual DbSet } } ResultLab.cs namespaceдиплом_беловой { using System; using System.Collections.Generic; publicpartialclassResultLab { publicint Id { get; set; } publicstring Lab1 { get; set; } publicstring Lab2 { get; set; } publicstring Lab3 { get; set; } publicstring Lab4 { get; set; } publicvirtual Students Students { get; set; } } } Students.cs namespaceдиплом_беловой { using System; using System.Collections.Generic; publicpartialclassStudents { publicint Id { get; set; } publicstring FIO { get; set; } publicstring Group { get; set; } publicstring Login { get; set; } publicstring Password { get; set; } publicvirtual ResultLab ResultLab { get; set; } } } test.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace диплом_беловой { public partial class test : Form { int idreg; int lab; int n; string[] quest = new string[6]; string[] answer = new string[6]; int ball = 0; int chek; string res; char[] arr = new char[6]; public test(int id, int numlab) { InitializeComponent(); idreg = id; lab = numlab; } private void btStart_Click(object sender, EventArgs e) { n = 0; btStart.Visible = false; label1.Visible = true; panel1.Visible = true; button1.Visible = false; btNext.Visible = true; //labNum.Text = Convert.ToString(n+1); //labNum.Visible = true; label2.Visible = true; if (lab == 1) { quest[0] = "При увеличении точности, количество итераций..."; quest[1] = "Почему метод равномерного поиска считается неэффективным?"; quest[2] = "Зная, в скольких точках в процессе решения задачи равномерного поиска пришлось вычислять значение целевой функции, можно определить..."; quest[3] = "Какой из методов одномерной оптимизации является простейшим?"; quest[4] = "По какой формуле находится погрешность Ɛn?"; quest[5] = "При каком условии поиск останавливается и предпоследняя точка становится решением?"; //ответы на 1ый rdb1.Text = "Увеличивается"; //* rdb2.Text = "Уменьшается"; rdb3.Text = "Остается прежним"; rdb4.Text = "Увеличивается или остается прежним"; } else if (lab == 2) { quest[0] = "Перебор точек отрезка происходит сначала с шагом Δ = Xi+1 - Xi > E до тех пор, пока..."; quest[1] = "Следующий шаг при выполнении условия f(Xi) <= f(Xi+1) или по достижению точки конца отрезка."; quest[2] = "Задачу можно считать выполненной ..."; quest[3] = "Во сколько раз обычно уменьшается шаг перебора:"; quest[4] = "В каких задачах используется метод поразрядного поиска?"; quest[5] = "За счет какого свойства функции мы можем грубо определить первоначальный отрезок для поиска?"; rdb1.Text = "не выполнится условие f(Xi)<=f(Xi+1) или пока очередная из этих точек не совпадет с концом отрезка"; //* rdb2.Text = "пока очередная из этих точек не совпадет с концом отрезка"; rdb3.Text = "не выполнится условие f(Xi)<=f(Xi+1)"; rdb4.Text = "все варианты не верные"; } else if (lab == 3) { quest[0] = "Метод заключается в том, ..."; quest[1] = "Первым шагом при решении методом равномерного поиска является:"; quest[2] = "При поиске минимума функции переход к отрезку [a; x2], положив b = x2 осуществляется при условии..."; quest[3] = "Формула для выбора точки X1 деления:"; quest[4] = "В методе дихотомии точки x1 и x2 располагаются?"; quest[5] = "Какое условие должно выполняться для завершения вычисления по методу дихотомии?"; rdb1.Text = "чтобы разделить отрезок на n равных частей точкамии перебором каждой точки в поисках минимума"; rdb2.Text = "чтобы делить очередной отрезок, содержащий точку минимума функции, пополам и исключать из рассмотрения ту часть, где минимума быть не может"; //* rdb3.Text = "деление отрезка на две неравные части, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньшей частей отрезка"; rdb4.Text = "чтобы находить точку минимума графическим путем, без каких-либо вычислений"; } else if (lab == 4) { quest[0] = "Какой метод требует меньшее количество затрачиваемых итераций?"; quest[1] = "Что называется золотым сечением отрезка?"; quest[2] = "Какие точки называются точками золотого сечения?"; quest[3] = "В конце вычислений по методу золотого сечения в качестве приближенного значения можно взять..."; quest[4] = "В чем преимущество метода золотого сечения в сравнение с методом дихотомии?"; quest[5] = "При невыполнении условия En<=E нужно перейти новому отрезку и к новым пробным точкам. Когда f(x1) < f(x2), то b будет равен"; rdb1.Text = "Равномерного поиска"; rdb2.Text = "Поразрядного поиска"; rdb3.Text = "Дихотомии"; rdb4.Text = "Золотого сечения"; //* } labelQuest.Visible = true; labelQuest.Text = Convert.ToString(quest[0]); } private void button1_Click(object sender, EventArgs e) { Students user = null; if (button1.Text == "завершить") { //запись результата res += Convert.ToString(chek); // MessageBox.Show(Convert.ToString(res), "Количество баллов (из 12)", MessageBoxButtons.OK, MessageBoxIcon.Information); arr = res.ToCharArray(); if (lab == 1) { if (arr[0] == '1') ball = ball + 2; if (arr[1] == '3') ball = ball + 2; if (arr[2] == '1') ball = ball + 2; if (arr[3] == '3') ball = ball + 2; if (arr[4] == '4') ball = ball + 2; if (arr[5] == '2') ball = ball + 2; using (UsersContainer db = new UsersContainer()) { foreach (var item in db.StudentsSet) { if (item.Id == idreg) { user = db.StudentsSet.Find(item.Id); } } user.ResultLab.Lab1 = Convert.ToString(ball); db.SaveChanges(); } } if (lab == 2) { if (arr[0] == '2') ball = ball + 2; if (arr[1] == '1') ball = ball + 2; if (arr[2] == '2') ball = ball + 2; if (arr[3] == '1') ball = ball + 2; if (arr[4] == '3') ball = ball + 2; if (arr[5] == '4') ball = ball + 2; using (UsersContainer db = new UsersContainer()) { foreach (var item in db.StudentsSet) { if (item.Id == idreg) { user = db.StudentsSet.Find(item.Id); } } user.ResultLab.Lab2 = Convert.ToString(ball); db.SaveChanges(); } } if (lab == 3) { if (arr[0] == '2') ball = ball + 2; if (arr[1] == '3') ball = ball + 2; if (arr[2] == '3') ball = ball + 2; if (arr[3] == '2') ball = ball + 2; if (arr[4] == '1') ball = ball + 2; if (arr[5] == '4') ball = ball + 2; using (UsersContainer db = new UsersContainer()) { foreach (var item in db.StudentsSet) { if (item.Id == idreg) { user = db.StudentsSet.Find(item.Id); } } user.ResultLab.Lab3 = Convert.ToString(ball); db.SaveChanges(); } } if (lab == 4) { if (arr[0] == '4') ball = ball + 2; if (arr[1] == '1') ball = ball + 2; if (arr[2] == '4') ball = ball + 2; if (arr[3] == '2') ball = ball + 2; if (arr[4] == '3') ball = ball + 2; if (arr[5] == '1') ball = ball + 2; using (UsersContainer db = new UsersContainer()) { foreach (var item in db.StudentsSet) { if (item.Id == idreg) { user = db.StudentsSet.Find(item.Id); } } user.ResultLab.Lab4 = Convert.ToString(ball); db.SaveChanges(); } } MessageBox.Show(Convert.ToString(ball), "Количество баллов (из 12)", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } else if (button1.Text == "закрыть") { this.Close(); } } private void btNext_Click(object sender, EventArgs e) { res += Convert.ToString(chek); rdb1.Checked = false; rdb2.Checked = false; rdb3.Checked = false; rdb4.Checked = false; n++; if (n!=5) { labelQuest.Text = Convert.ToString(quest[n]); //labNum.Text = Convert.ToString(n); } else if (n==5) { labelQuest.Text = Convert.ToString(quest[n]); //labNum.Text = Convert.ToString(n); btNext.Visible = false; button1.Text = "завершить"; button1.Visible = true; } //ответы //131342 if (lab == 1) { if (n == 1) { rdb1.Text = "Требует больших затрат"; rdb2.Text = "Большой объем вычислений"; rdb3.Text = "Варианты 1 и 2 верны"; //* rdb4.Text = "Плохая точность"; } if (n == 2) { rdb1.Text = "Число отрезков n"; //* rdb2.Text = "Допустимую погрешность"; rdb3.Text = "Длину последнего отрезка"; rdb4.Text = "Достигнутую точность"; } if (n == 3) { rdb1.Text = "Метод поразрядного поиска"; rdb2.Text = "Метод дихотомии"; rdb3.Text = "Метод равномерного поиска"; //* rdb4.Text = "Нет верного ответа"; } if (n == 4) { rdb1.Text = "Ɛn = (b - a) / n + 1"; rdb2.Text = "Ɛn = (b + a) / n"; rdb3.Text = "Все варианты не верны"; rdb4.Text = "Ɛn = (b - a) / n"; //* } if (n == 5) { rdb1.Text = "f(xi+1) < f(xi)"; rdb2.Text = "f(xi+1) > f(xi)"; //* rdb3.Text = "f(xi+1) >= f(xi)"; rdb4.Text = "f(xi+1) <= f(xi)"; } } //212134 if (lab == 2) { if (n == 1) { rdb1.Text = "a) После этого шаг увеличивается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" + " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д."; //* rdb2.Text = "b) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" + " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д."; rdb3.Text = "c) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится с самого начала до тех пор, пока значения f(x)" + " снова не перестанут уменьшаться или очередная точка не совпадет с другим концом отрезка и т.д."; rdb4.Text = "d) После этого шаг уменьшается (обычно в 4 раза), и перебор точек с новым шагом производится в противоположном направлении до тех пор, пока значения f(x)" + " снова не перестанут увеличиваться или очередная точка не совпадет с другим концом отрезка и т.д."; } if (n == 2) { rdb1.Text = "когда перебор в данном направлении не закончен, а использованный при этом шаг дискретизации превосходит E"; rdb2.Text = "когда перебор в данном направлении закончен и |h| <= E"; //* rdb3.Text = "Если En > E"; rdb4.Text = "когда перебор в данном направлении закончен и |h| >= E"; } if (n == 3) { rdb1.Text = "в 4"; //* rdb2.Text = "в 3"; rdb3.Text = "в 2"; rdb4.Text = "в 7"; } if (n == 4) { rdb1.Text = "В задачах безусловной оптимизации "; rdb2.Text = "В задачах многомерного поиска"; rdb3.Text = "В задачах одномерной оптимизации";//* rdb4.Text = "Ни один из вышеперечисленных"; } if (n == 5) { rdb1.Text = "Невозрастания"; rdb2.Text = "Неубывания"; rdb3.Text = "Четности"; rdb4.Text = "Унимодальности";//* } } //233214 if (lab == 3) { if (n == 1) { rdb1.Text = "Выбрать начальный шаг Δ = (b-a)/4. Положить x0 = a, вычислить f(x0)"; rdb2.Text = "Разбитие отрезка на n равных частей точками деления"; rdb3.Text = "Задать параметр точности E>0, параметр алгоритма δ ∈ (0;2E) ";//* rdb4.Text = "Задать E>0"; } if (n == 2) { rdb1.Text = "f(x1)<=f(x2)"; rdb2.Text = "f(x1)=f(x2)"; rdb3.Text = "Оба варианта верны";//* rdb4.Text = "Оба не верны"; } if (n == 3) { rdb1.Text = "X1 = (a - b + δ) / 2"; rdb2.Text = "X1 = (a + b - δ) / 2";//* rdb3.Text = "X1 = (a + b - δ) / 4"; rdb4.Text = "X1 = (a + 2b - δ) / 4"; } if (n == 4) { rdb1.Text = "Располагаются близко к середине очередного отрезка [a;b]"; //* rdb2.Text = "Располагаются близко к краям очередного отрезка [a;b]"; rdb3.Text = "Расположение точек выбирается произвольно"; rdb4.Text = "Все варианты не верны"; } if (n == 5) { rdb1.Text = "(b*a) / 2≤ε"; rdb2.Text = "(b-a) * 2≤ε"; rdb3.Text = "(b+a) / 2≤ε"; rdb4.Text = "(b-a) / 2≤ε "; //* } } //414231 if (lab == 4) { if (n == 1) { rdb1.Text = "Такое деление отрезка на две неравные части, что отношение длины всего отрезка к длине его большей части " + "равно отношению длин большей и меньшей частей отрезка."; //* rdb2.Text = "Такое деление отрезка на равные части, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньшей частей отрезка."; rdb3.Text = "Такое деление отрезка на две равные части, что отношение длины всего отрезка к длине его большей части не равно отношению длин большей и меньшей частей отрезка."; rdb4.Text = "Все ответы не верные"; } if (n == 2) { rdb1.Text = "Каждая из них делит отрезок [a;b] на две равные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка."; rdb2.Text = "Каждая из них делит отрезок [a;b] на три неравные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка."; rdb3.Text = "Каждая из них делит отрезок [a;b] на три равные так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка."; rdb4.Text = "Каждая из них делит отрезок [a;b] на две неравные части так, что отношение длины всего отрезка к длине его большей части равно отношению длин большей и меньше частей отрезка.";//* } if (n == 3) { rdb1.Text = "конец последнего из полученных отрезков"; rdb2.Text = "середину последнего из полученных отрезков";//* rdb3.Text = "начало последнего из полученных отрезков"; rdb4.Text = "последний отрезок"; } if (n == 4) { rdb1.Text = "Деление не производится"; rdb2.Text = "Производится деление на 4 части"; rdb3.Text = "Одна из точек уже найдена";//* rdb4.Text = "Ни один из вышеперечисленных"; } if (n == 5) { rdb1.Text = "x2"; //* rdb2.Text = "x1"; rdb3.Text = "a"; rdb4.Text = "f(x1)"; } } } private void rdb1_CheckedChanged(object sender, EventArgs e) { chek = 1; } private void rdb2_CheckedChanged(object sender, EventArgs e) { chek = 2; } private void rdb3_CheckedChanged(object sender, EventArgs e) { chek = 3; } private void rdb4_CheckedChanged(object sender, EventArgs e) { chek = 4; } private void test_Load(object sender, EventArgs e) { } } } function.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace диплом_беловой { public partial class function : Form { int metod; int numlab; string spow; int pow; int powsqrtn; int idreg; List bool error = false; int info = 0; public function(int point, int id) { InitializeComponent(); numlab = point; idreg = id; Zagolovok(numlab); richTextBox1.Text = "Ввод операций: \n" + "1. Сложение, вычитание, деление, умножение: a+b, a-b, a/b, a*b \n" + "2. sin(x), cos(x), tg(x) \n" + "3. Возведение в квадрат: sqr(x) \n" + "4. Возведение в степень pow...(x), где ... - степень \n" + "5. Квадратный корень: sqrt(x) \n" + "6. Корень некоторой степени: sqrtn...(x), где ... - степень \n" + "7. Натуральный логарифм: ln(x) \n" + "В качестве переменной использовать x!"; } private void Zagolovok(int point) { if (point == 1) { this.Text = "Лабораторный комплекс 'Методы оптимизации' || Равномерный поиск"; } if (point == 2) { this.Text = "Лабораторный комплекс 'Методы оптимизации' || Поразрядный поиск"; } if (point == 3) { this.Text = "Лабораторный комплекс 'Методы оптимизации' || Дихотомия"; txtbDel.Visible = true; label9.Visible = true; } if (point == 4) { this.Text = "Лабораторный комплекс 'Методы оптимизации' || Золотое сечение"; } } private void btTabl_Click(object sender, EventArgs e) { tablica f3 = new tablica(myList, numlab); //передать ответы f3.ShowDialog(); } private void button1_Click(object sender, EventArgs e) { myList.Clear(); this.Close(); } //ОПЗ private double Calculation(double x0, string func, Stack { double x = x0; string output = ""; char[] f = func.ToCharArray(); double res = 0.0; var temp = 0.0; int i; //обработка ОПЗ for (i = 0; i < f.Length; i++) { //определяем символ и приоритет if (char.IsDigit(f[i])) //цифра { output += f[i]; continue; } else if (char.IsLetter(f[i]) && (f[i] != 's' && f[i] != 'c' && f[i] != 'q' && f[i] != 'p' && f[i] != 'l' && f[i] != 'r' && f[i] != 't' && f[i] != 'v')) //переменная (буква, но не операция) { if (f[i] == 'e') { output += "e"; } else if (f[i] != 'e') { //помещаем x output += "x"; } continue; } //операция else if (f[i] == '+' || f[i] == '-' || f[i] == '*' || f[i] == '/' || f[i] == '(' || f[i] == ')' || f[i] == '^' || f[i] == 's' || f[i] == 'c' || f[i] == 'q' || f[i] == 'p' || f[i] == 'l' || f[i] == 't' || f[i] == 'r' || f[i] == 'v') { char m = f[i]; if (m == '(') { myStack.Push(OperatorContainer.Find("(")); continue; } if (m == ')') { while (myStack.Peek().Value != "(") { output += myStack.Pop().Value; } if (myStack.Peek().Value == "(") { myStack.Pop(); } continue; } int k; //временная переменная для порядкового номера //sin, sqrt, sqr if (f[i] == 's') { k = i; //временная переменная для порядкового номера i++; //проверяем символ после s if (f[i] == 'i') //sin { m = 's'; i++; } else if (f[i] == 'q') { i = i + 2; if (f[i] == 't') //sqrt { //m = 'q'; // continue; i++; if (f[i] != 'n') { m = 'q'; i = i - 1; continue; } else if (f[i] == 'n') //sqrtn { m = 'r'; i = i + 1; powsqrtn = f[i]; continue; } } else if (f[i] != 't') //sqr { m = 'p'; i--; } } } //pow*(x) (* - степень) if (f[i] == 'p') { m = 'v'; i = i + 3; //проверяем символ после s pow = f[i]; continue; } //cos if (f[i] == 'c') { k = i; //временная переменная для порядкового номера m = 'c'; i = i + 2; } //tg if (f[i] == 't') { k = i; //временная переменная для порядкового номера m = 't'; i++; } //ln if (f[i] == 'l') { k = i; //временная переменная для порядкового номера m = 'l'; i++; } if (myStack.Count == 0 || myStack.Peek().priorst < OperatorContainer.Find(Convert.ToString(m)).priorst && m != ')') { myStack.Push(OperatorContainer.Find(m.ToString())); continue; } while (myStack.Peek().priorst >= OperatorContainer.Find(Convert.ToString(m)).priorst && m != '(') { output += myStack.Pop().Value; if (myStack.Count == 0) { break; } } myStack.Push(OperatorContainer.Find(Convert.ToString(m))); } } //опустошение стека while (myStack.Count != 0) { output += myStack.Pop().Value; } //textBox1.Text = output; //рассчет for (int j = 0; j < output.Length; j++) { if (Char.IsDigit(output[j])) { myStack.Push(new operators(Convert.ToString(output[j]), 0)); continue; } else if (char.IsLetter(output[j]) && (output[j] != 's' && output[j] != 'c' && output[j] != 'q' && output[j] != 'p' && output[j] != 'l' && output[j] != 'v' && output[j] != 'r' && output[j] != 't' && output[j] != 'e' && output[j] != 'x')) //переменная (буква, но не операнд) { myStack.Push(new operators(Convert.ToString(output[j]), 0)); continue; } else { if (output[j] == '+') { temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) + Convert.ToDouble(Convert.ToString(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == '-') { double temp2 = 0.0; temp2 = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)); temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) - temp2; myStack.Push(new operators(temp, 0)); } if (output[j] == '*') { temp = Convert.ToDouble(Convert.ToString(myStack.Pop().Value)) * Convert.ToDouble(Convert.ToString(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == '/') { double temp2 = 0.0; temp2 = Convert.ToInt32(Convert.ToString(myStack.Pop().Value)); temp = Convert.ToInt32(Convert.ToString(myStack.Pop().Value)) / temp2; myStack.Push(new operators(temp, 0)); } if (output[j] == 's') //sin { temp = Math.Sin(Convert.ToDouble(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == 'c') //cos { temp = Math.Cos(Convert.ToDouble(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == 't') //tg { temp = Math.Tan(Convert.ToDouble(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == 'q') //sqrt { temp = Math.Sqrt(Convert.ToDouble(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == 'p') //sqr { double a = Convert.ToDouble(myStack.Pop().Value); temp = a * a; myStack.Push(new operators(temp, 0)); } if (output[j] == 'l') //ln { temp = Math.Log(Convert.ToDouble(myStack.Pop().Value)); myStack.Push(new operators(temp, 0)); } if (output[j] == 'v') //pow { temp = Math.Pow(Convert.ToDouble(myStack.Pop().Value), pow); myStack.Push(new operators(temp, 0)); } if (output[j] == 'r') //sqrtn { powsqrtn = 1 / powsqrtn; temp = Math.Pow(Convert.ToDouble(myStack.Pop().Value), powsqrtn); myStack.Push(new operators(temp, 0)); } if (output[j] == 'x') //x { temp = x; myStack.Push(new operators(temp, 0)); } if (output[j] == 'e') //экспонента { temp = Convert.ToDouble(2.71); myStack.Push(new operators(temp, 0)); continue; } } } res = Convert.ToDouble(myStack.Pop().tempValue); return res; } private void btGo_Click(object sender, EventArgs e) { error = false; myList.Clear(); //пустая строка if (txtbFunction.Text == "" || txtbA.Text == "" || txtbB.Text == "" || txtbE.Text == "") { MessageBox.Show("Введите все входные данные!", "Пустые строки", MessageBoxButtons.OK); error = true; } if (metod == 3 && (txtbFunction.Text == "" || txtbA.Text == "" || txtbB.Text == "" || txtbE.Text == "" || txtbDel.Text == "")) { MessageBox.Show("Введите все входные данные!", "Пустые строки", MessageBoxButtons.OK); error = true; } else if (error == false) { btTabl.Enabled = true; btTest.Enabled = true; Stack string func = txtbFunction.Text; //функция char[] f = func.ToCharArray(); //АЛГОРИТМЫ //РАВНОМЕРНЫЙ ПОИСК if (numlab == 1) { double n; double a = Convert.ToDouble(txtbA.Text); double b = Convert.ToDouble(txtbB.Text); double parE = Convert.ToDouble(txtbE.Text); n = (b - a) / parE; double xmin = 1000, fxmin = 1000, xi, fxi; int k = 1; for (int i = 1; i <= n; i++) { xi = a + i * (b - a) / (n + 1); fxi = Calculation(xi, func, myStack); //находим минимум if (fxi < fxmin) { xmin = xi; fxmin = fxi; } steps steps = new steps(); { steps.step = k; steps.xi = xi; steps.fxi = fxi; steps.minx = xmin; steps.minfx = fxmin; steps.a = a; steps.b = b; k++; } myList.Add(steps); } //вывод xi, fxi txtbXMin.Text = Convert.ToString(xmin); txtbFXMin.Text = Convert.ToString(fxmin); } //ПОРАЗРЯДНЫЙ ПОИСК else if (numlab == 2) { bool cont = true; double a = Convert.ToDouble(txtbA.Text); double b = Convert.ToDouble(txtbB.Text); double parE = Convert.ToDouble(txtbE.Text); double h; double x0, x1, xmin; double fx0, fx1, fxmin; xmin = 0; fxmin = 0; int k = 1; if (parE <= 0) { MessageBox.Show("Параметр точности Е должен быть больше 0!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); } else if (parE > 0) { //шаг 0 h = (b - a) / 4; x0 = a; fx0 = Calculation(x0, func, myStack); myList.Add(new steps() { step = k, a = a, b = b, xi = x0, fxi = fx0, minx = xmin, minfx = fxmin, h = h }); k++; //шаг 1 label1: x1 = x0 + h; fx1 = Calculation(x1, func, myStack); myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h }); k++; //шаг 2 if (fx0 > fx1) { cont = false; //шаг 3 x1 = x0; fx0 = fx1; myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h }); k++; if (x0 > a && x0 < b) { cont = true; goto label1; } else { cont = true; } } if (cont == true) { //шаг 4 if (Math.Abs(h) <= parE) { //конец вычислений xmin = x0; fxmin = fx0; myList.Add(new steps() { step = k, a = a, b = b, xi = x0, fxi = fx0, minx = xmin, minfx = fxmin, h = h }); // k++; txtbXMin.Text = Convert.ToString(xmin); txtbFXMin.Text = Convert.ToString(fxmin); } else { //шаг 5 h = h * (-1); h = h / 4; x1 = x0; fx0 = fx1; myList.Add(new steps() { step = k, a = a, b = b, xi = x1, fxi = fx1, minx = xmin, minfx = fxmin, h = h }); k++; goto label1; } } } } //МЕТОД ДИХОТОМИИ else if (numlab == 3) { double a = Convert.ToDouble(txtbA.Text); double b = Convert.ToDouble(txtbB.Text); double parE = Convert.ToDouble(txtbE.Text); double parDelta = Convert.ToDouble(txtbDel.Text); double En = 0; double x1, x2, fx1, fx2, xmin, fxmin; //шаг0 if (parE < 0 || (parDelta < 0 || parDelta > (parE * 2))) { MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK); } else { xmin = 0; fxmin = 0; int k = 1; //шаг 1 label2: x1 = (a + b - parDelta) / 2; x2 = (a + b + parDelta) / 2; ; fx1 = Calculation(x1, func, myStack); fx2 = Calculation(x2, func, myStack); myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; /*myList.Add(new steps() { step = k, a = a, b = b, xi = x2, fxi = fx2, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++;*/ //myList.Add(steps); //шаг 2 if (fx1 <= fx2) { //[a,x2] b = x2; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; } else if (fx1 > fx2) { //[x1,b] a = x1; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; } //шаг 3 En = (b - a) / 2; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; if (En > parE) { // MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK); //шаг1 goto label2; } else { //конец xmin = (a + b) / 2; fxmin = Calculation(xmin, func, myStack); myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); txtbXMin.Text = Convert.ToString(xmin); txtbFXMin.Text = Convert.ToString(fxmin); } } } //МЕТОД ЗОЛОТОГО СЕЧЕНИЯ else if (numlab == 4) { double a = Convert.ToDouble(txtbA.Text); double b = Convert.ToDouble(txtbB.Text); double parE = Convert.ToDouble(txtbE.Text); double x1, x2, fx1, fx2, En, xmin, fxmin; xmin = 0; fxmin = 0; double t; int k = 1; if (parE < 0) { MessageBox.Show("Не верно введены параметры!", "Ошибка!", MessageBoxButtons.OK); } else { //шаг 0 t = (Math.Sqrt(5) - 1) / 2; //шаг 1 x1 = a + ((3 - Math.Sqrt(5)) / 2) * (b - a); x2 = a + ((Math.Sqrt(5) - 1) / 2) * (b - a); fx1 = Calculation(x1, func, myStack); fx2 = Calculation(x2, func, myStack); En = (b - a) / 2; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; /*myList.Add(new steps() { step = k, a = a, b = b, xi = x2, fxi = fx2, minx = xmin, minfx = fxmin, En = En }); k++;*/ //шаг2 label3: if (En <= parE) { //шаг4 xmin = (a + b) / 2; fxmin = Calculation(xmin, func, myStack); myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); txtbXMin.Text = Convert.ToString(xmin); txtbFXMin.Text = Convert.ToString(fxmin); } else { //шаг3 if (fx1 < fx2) { b = x2; x2 = x1; fx2 = fx1; x1 = b + a - x2; fx1 = Calculation(x1, func, myStack); En = t * En; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; goto label3; } else { a = x1; x1 = x2; fx1 = fx2; x2 = b + a - x1; fx2 = Calculation(x2, func, myStack); En = t * En; myList.Add(new steps() { step = k, a = a, b = b, x1 = x1, fx1 = fx1, x2 = x2, fx2 = fx2, minx = xmin, minfx = fxmin, En = En }); k++; goto label3; } } } } } } private void function_FormClosing(object sender, FormClosingEventArgs e) { myList.Clear(); } private void btTest_Click(object sender, EventArgs e) { btTest.Enabled = false; test f6 = new test(idreg, numlab); f6.ShowDialog(); } private void btInfo_Click(object sender, EventArgs e) { if (info == 0) { richTextBox1.Visible = true; info = 1; } else if (info == 1) { richTextBox1.Visible = false; info = 0; } } } } ПРИЛОЖЕНИЕ 2. ПРЕЗЕНТАЦИЯ |