Глава 4. Примеры программной реализации некоторых инженерных и вычислительных задач в среде VBA Задача. Рассчитать параметры сварного шва двух полос из стали марки СТ-3 Составить схему алгоритма, выбирающую тип сварного шва (угловой или стыковой) в зависимости от исходных данных: величины статической растягивающей нагрузки P , толщины , и ширины b стальных полос. При сварке полос из стали СТ3 использованы электроды Э34. Выражения для расчёта углового шва: Pугл = 1,4* b* *[]`ср , []`ср = 0,5*[]р . Выражения для расчёта стыкового шва: Pстык = * b*[]`р , []`р = 0,6*[]р , где []р = 160 Мпа. Текст Программы: Private Sub CommandButton1_Click() Dim a As Variant 'толщина Dim b As Variant 'ширина Dim P As Variant 'статическая растягивающая нагрузка Dim Pugl As Single 'угловая Dim Pstik As Single 'стыковая Dim p1 As Single Dim a1 As Single Dim b1 As Single '---------------------------------------------------------------------------P = TextBox1.Value 'Проверка содержимого Текстового Поля Call wwod(P, res, res1, res2) If res = 4 Then TextBox1.SetFocus Exit Sub End If If res1 = 4 Then TextBox1.SetFocus Exit Sub End If If res2 = 4 Then TextBox1.SetFocus Exit Sub End If '---------------------------------------------------------------------------a = TextBox2.Value 'Проверка содержимого Текстового Поля Call wwod(a, res, res1, res2) If res = 4 Then TextBox2.SetFocus Exit Sub End If If res1 = 4 Then TextBox2.SetFocus Exit Sub End If If res2 = 4 Then TextBox2.SetFocus Exit Sub End If 2 '---------------------------------------------------------------------------b = TextBox3.Value 'Проверка содержимого Текстового Поля Call wwod(b, res, res1, res2) If res = 4 Then TextBox3.SetFocus Exit Sub End If If res1 = 4 Then TextBox3.SetFocus Exit Sub End If If res2 = 4 Then TextBox3.SetFocus Exit Sub End If '----------------------------------------------------------------------------- p1 = CSng(P) a1 = CSng(a) b1 = CSng(b) '----------------------------------------------------------------------------Pugl = a * b * 0.6 * 160 '------------------------Pstic = a * b * 0.7 * 160 '------------------------TextBox4.Text = CStr(Pugl) TextBox5.Text = CStr(Pstic) If p1 <= Pugl Then TextBox6.Text = "Возможен Угловой Шов" End If If Pstic > p1 Then GoTo 10 10 If p1 > Pugl Then TextBox6.Text = "Угловой Шов Не Подходит, Возможен Только Стыковой Шов" End If If p1 > Pstic Then TextBox6.Text = "Ни Один Шов Не Подходит!!!" End If End Sub Процедура проверки ошибок ввода: Sub wwod(cv, res, res1, res2) 'объявляем модуль с именем wwod If IsNumeric(cv) = False Then 'если аргумент cv не число то res = MsgBox("Введи число", 53) 'сообщение If res = 4 Then 'если нажата кнопка Повтор Exit Sub 'выход из модуля End If End If If cv < 0 Then 'если аргумент cv отрицательное число то res1 = MsgBox("Введи положительное число", 53) 'сообщение If res1 = 4 Then 'если нажата кнопка Повтор Exit Sub 'выход из модуля End If End If If cv = 0 Then 'если аргумент cv ноль то res2 = MsgBox("Ноль в поле", 53) 'сообщение If res2 = 4 Then 'если нажата кнопка Повтор Exit Sub 'выход из модуля 3 End If End If End Sub Окно программы: Задача №14 Оп ределение типа св арного ш ва. Составить схему алгоритма, выбирающего тип сварного шва (угловой или стыковой) в зависимости от исходных данных: величины статической растягивающей нагрузки P, толщины и ширины b стальных полос. При сварке полос из стали СТ3 используются электроды Э34. Формулы для расчёта: Pугл = 0,7 b[]p Pстык = 0,6 b[]p В расчёте принять []p = 160 МПа Обозначения: В задаче: В программе: []p sigmap 4 P b Pугл Pстык Delta p b Pугл Pстык Экранная форма: Программный код: Private Sub CommandButton1_Click() Dim p As Single 'типы переменных Dim sigmap As Single Dim b As Single Dim delta As Single Dim Pугл As Single Dim Pстык As Single Dim сообщ1 As String Dim сообщ2 As String Dim сообщ3 As String q = TextBox1.Value 'присваивается значение 1 текстового окна Р Call Ввод(q, res) If res = 4 Then 'введены буквы TextBox1.SetFocus 'устанавливаем курсор на 1 текстовом окне Exit Sub 'досрочный выход ElseIf res = 2 Then 'введенное значение равно 0 TextBox1.SetFocus Exit Sub 'досрочный выход 5 End If q = TextBox2.Value Call Ввод(q, res) If res = 4 Then TextBox2.SetFocus Exit Sub ElseIf res = 2 Then TextBox2.SetFocus Exit Sub End If p = CSng(TextBox1.Text) 'присваиваем значениe P из 1 текстового поля b = CSng(TextBox2.Text) 'присваиваем значениe b из 2 текстового поля delta = CSng(TextBox3.Text) 'присваиваем значениe delta из 3 текстового поля sigmap = 160 Pуг = 0.7 * b * delta * sigmap 'производим расчеты Pстык = 0.6 * b * delta * sigmap TextBox4.Enabled = True 'открываем доступ к полю 4 TextBox4.Text = CStr(Pугл) 'присваиваем значение sigmap 4 полю TextBox5.Enabled = True 'открываем доступ к полю 5 TextBox5.Text = CStr(Pстык) 'присваиваем значение sigmap 5 полю сообщ1 = "Шов не прочен" 'присваиваем названия сообщениям сообщ2 = "Угловой или стыковой шов" сообщ3 = "Стыковой шов" If p > Pуг Then 'производим проверку шва TextBox6.Text = сообщ1 End If If Pуг > p Then TextBox6.Text = сообщ2 End If If p < Pстык Then TextBox6.Text = сообщ3 End If End Sub Private Sub CommandButton2_Click() TextBox1.Text = "" 'очищаем 6 текстовых поля TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" End Sub Private Sub CommandButton3_Click() UserForm1.Hide 'выход End Sub Private Sub UserForm_Initialize() UserForm1.Caption = "Расчёт типа сварного шва" TextBox4.Enabled = False 'запрещен доступ к 4 полю TextBox5.Enabled = False 'запрещен доступ к 5 полю TextBox6.Enabled = False 'запрещен доступ к 6 полю Label1.Caption = "Величина растягивающей нагрузкиP,МПа " Label2.Caption = "Ширина полосы b,мм " Label3.Caption = "Толщина полосы,мм" Label4.Caption = "Угловой шов" Label5.Caption = "Стыковой шов" CommandButton1.Caption = "Считать" 'устанавливаю надписи на кнопках 6 CommandButton2.Caption = "Очистить" CommandButton3.Caption = "Выход" CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем за ней CommandButton1.ControlTipText = "Расчёт типа шва" 'всплывающую подсказку CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую подсказку CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую подсказку и CommandButton3.Cancel = True 'присваиваем значение клавиши Escape End Sub Sub Ввод(q, res) 'программа обработки искомых значений If IsNumeric(q) = False Then 'является ли P числом res = MsgBox("Введеная величина - не число", 53, "Ошибка") 'выводим сообщение об ошибке на экран Exit Sub 'выход End If If CSng(q) = 0 Then 'является ли Р=0 res = MsgBox("Введеная величина =0", 53, "Ошибка") Exit Sub 'выход End If If CSng(q) < 0 Then 'является ли Р<0 res = MsgBox("Эта величина должна быть >0", 53, "Ошибка") Exit Sub 'выход End If End Sub Задание: Провести расчет зависимости величины предельной растягивающей нагрузки P для сварного стыкового шва от его длины b' для двух стальных полос, толщиной по выражению b’ Исходные данные: , b и граничные значения длины сварного b’ от150 до500 мм с шагом 50 мм. Обозначения: в задаче: в программе: sigma q 7 Модуль инициализации. Инициализирует компоненты формы. Sub init() UserForm1.ComboBox1.AddItem ("Лист") Добовление в ComboBox1 значений UserForm1.ComboBox1.AddItem ("Форма") Добовление в ComboBox1 значений UserForm1.Show Фонкция показать форму. End Sub Private Sub CommandButton1_Click() Dim qp As Single Объявление переменных Dim sigma As Single Объявление переменных Dim bn As Single Объявление переменных Dim bk As Single Объявление переменных Dim bs As Single Объявление переменных Dim i As Single Объявление переменных Dim j As Integer Объявление переменных qp = CSng(UserForm1.TextBox1.Value) Считывание данных с формы sigma = CSng(UserForm1.TextBox2.Value) Считывание данных с формы bn = CSng(UserForm1.TextBox3.Value) Считывание данных с формы bk = CSng(UserForm1.TextBox4.Value) Считывание данных с формы bs = CSng(UserForm1.TextBox5.Value) Считывание данных с формы If ((qp > 0) And (sigma > 0) And (bn > 0) And (bk > 0) And (bs > 0)) Then Условие. Проверяет чтобы все элементы были больше нуля If (UserForm1.ComboBox1.Value = "Лист") Then Условие. Считывает значение о выводе распределяет вывод Worksheets(1).Cells(1, 1).Value = "Значения b'" Вывод на лист Worksheets(1).Cells(1, 2).Value = "Значения P" Вывод на лист j=2 Начальное значение счётчика For i = bn To bk Step bs Цикл перебирает все значения от bn до bk с шагом bs Worksheets(1).Cells(j, 1).Value = i Вывод на лист Worksheets(1).Cells(j, 2).Value = qp * sigma * i Вывод на лист j=j+1 увиличиваем счётчик на единицу Next i конец цикла Else For i = bn To bk Step bs Цикл перебирает все значения от bn до bk с шагом bs MsgBox "Значение b'= " & i & " полученное значение P= " & qp * sigma * i Вывод получинных значений в окне. Next i конец цикла End If UserForm1.Hide закрытие формы Else MsgBox "Данные введены некоректно. Перезадайте их." Сообщение End If End Sub 8 Алгоритм расчета типа сварных швов Составить схему алгоритма, выбирающую тип сварного шва (угловой или стыковой) в зависимости от исходных данных: величины статической растягивающей нагрузки Р, толщины δ и ширины b стальных полос. При сварке полос из стали СТ3 используя электроды Э34. Из формул (16), (17) получаем выражение для расчета параметров углового шва: Pугл b * * [ ]' p [ ]' ср 0,5 * [ ] р Pстык Формулы (18), (19) используем для расчета параметров стыкового шва: 1,4 * b * * [ ]' ср [ ]'Р 0,6[ ]Р Принять [ ] р 160 МПа Решением задачи является алгоритм разветвленной структуры, основным элементом которого является блок, реализующий условия выбора (рис.12): если P<=P ,то возможен угловой и стыковой шов; если P>P,то угловой шов не подходит, возможен только стыковой шов; если P>P,то и стыковой шов не подходит, швы не прочны. По результатам проверок выдаются указанные сообщения. 9 Блок схема. Начало P, b, delta, Sigma_p да isNumeric = false,CSng= 0, CSng<0 нет Pуг=0.6*b*delta* sigma_p Pст=0.7*b*del ta*sigma_p да P>Pуг Шов не прочен нет P>Pст нет да Только стык Угловой либо стык Конец 10 Экранная форма: 11 Программный код: Private Sub CommandButton1_Click() 'программа вычесления Pu и Ps Dim P As Single 'объявление переменной Р как простой Dim b As Single 'объявление переменной b как простой Dim delta As Single 'объявление переменной delta как простой Dim sigma_p As Single 'объявление переменной sigma_p как простой Dim Pu As Single 'объявление переменной Pu как простой Dim Ps As Single 'объявление переменной Рs как постой If IsNumeric(TextBox1.Text) = False Then ' проверка ввода числа P MsgBox "Ошибка в вводе статистической нагрузке", 16, "контроль ввода данных" ' вывод окна сообщений TextBox1.SetFocus Exit Sub End If If IsNumeric(TextBox2.Text) = False Then ' проверка ввода числа b MsgBox "Ошибка в воде ширины полосы", 16, "Контроль ввода данных" ' вывод окна сообщений TextBox2.SetFocus Exit Sub End If If IsNumeric(TextBox3.Text) = False Then ' проверка ввода числа delta MsgBox "Ошибка в воде толщины полосы", 16, "Контроль ввода данных" ' вывод окна сообщений TextBox3.SetFocus Exit Sub End If P = TextBox1.Text 'присвоение значений окна1 переменной P b = TextBox2.Text 'присвоение значений окна2 переменной b delta = TextBox3.Text 'присвоение значений окна3 переменной delta sigma_p = 160 'присвоение переменной sigma_p числа 160 Pu = 0.7 * b * delta * sigma_p 'вычесление Pu по формуле Ps = 0.6 * b * delta * sigma_p 'вычесление Ps по формуле If P > Pu Then 'проверка условия задачи TextBox4.Text = CStr(Ps) 'вывод значения Ps в окно4 TextBox6.Text = CStr(Pu) 'вывод значения Pu в окно5 TextBox5.Text = "Швы не прочны" 'вывод текста получившегося в результате проверки Exit Sub End If If P > Ps Then 'проверка условия задачи TextBox4.Text = CStr(Ps) 'вывод значения Ps в окно4 TextBox6.Text = CStr(Pu) 'вывод значения Pu в окно5 TetxBox5 = "Только угловой шов" 'вывод текста получившегося в результате проверки Exit Sub End If If P <= Pu Then 'проверка условия задачи TextBox4.Text = CStr(Pu) 'вывод значения Ps в окно4 TextBox6.Text = CStr(Ps) 'вывод значения Pu в окно5 TextBox5.Text = "Угловой или стыковой шов" 'вывод текста получившегося в результате проверки Exit Sub End If End Sub Private Sub CommandButton2_Click() 'выход из программы End End Sub 12 Private Sub CommandButton3_Click() 'очистка окон сообшений TextBox1.Text = "" 'очистка окна1 TextBox2.Text = "" 'очистка окна2 TextBox3.Text = "" 'очистка окна3 TextBox4.Text = "" 'очистка окна4 TextBox5.Text = "" 'очистка окна5 TextBox6.Text = "" 'очистка окна5 End Sub Private Sub UserForm_Initialize() 'установки программы With CommandButton1 'создание всплывающей подсказки .Visible = True .ControlTipText = "Выполнение операции" End With With TextBox1 'создание всплывающей подсказки .Visible = True .ControlTipText = "Введите значение статистической растягивающей нагрузки" End With With TextBox2 'создание всплывающей подсказки .Visible = True .ControlTipText = "Введите значение ширины полосы" End With With TextBox3 'создание всплывающей подсказки .Visible = True .ControlTipText = "Введите значение толщины полосы" End With With TextBox5 'создание всплывающей подсказки .Visible = True .ControlTipText = "Результирующий тип шва" End With With TextBox4 'создание всплывающей подсказки .Visible = True .ControlTipText = "Значение нагрузки на стыковой шов " End With With TextBox6 .Visible = True .ControlTipText = "Значение нагрузки на угловой шов" End With End Sub Задание: Составить схему алгоритма расчёта результирующего изгибающего момента на валу при заданных нагрузках Ft и Fr и определённой длине l. Расчётная формула: Mи= Mx 2 My 2 Где изгибающий момент по оси X 13 Mx= Ft l * 2 2 Изгибающий момент по оси Y My Fr l * 2 2 Исходные данные: Нагрузки – Ft = 4.5и Fr =1.64, [Ft] = кН , [Fr] = кН. Длина – l =170 ,[l] = мм. Обозначения : В задаче : Ft Fr Mx My Mи В программе: F1 F2 M1 M2 M3 Алгоритм: решение задачи 1. Ввод данных и проверка их на ошибки. 2. Вычисления изгибающих моментов по осям X и Y по расчётным формулам. 3. Вычисление результирующего изгибающего момента на валу. 14 Показать форму Программный код для экранной формы. Dim mx As Single Dim my As Single r = TextBox1.Text If IsNumeric(TextBox1.Text) = False Or r <= 0 Then MsgBox "Не число или ноль", 64, "Ошибка ввода" TextBox1.SetFocus Exit Sub End If r = TextBox2.Text If IsNumeric(TextBox2.Text) = False Or r <= 0 Then MsgBox "Не число или ноль", 64, "Ошибка ввода" TextBox2.SetFocus Exit Sub End If r = TextBox3.Text If IsNumeric(TextBox3.Text) = False Or r <= 0 Then MsgBox "Не число или ноль", 64, "Ошибка ввода" TextBox3.SetFocus Exit Sub End If l = CSng(TextBox3.Text) ft = CSng(TextBox2.Text) fr = CSng(TextBox1.Text) 15 mx = ft * l / 4 my = fr * l / 4 mu = Sqr(mx ^ 2 + my ^ 2) TextBox4.Text = mx TextBox5.Text = my TextBox6.Text = mu End Sub Private Sub CommandButton2_Click() UserForm1.Hide End Sub Private Sub UserForm Initialize() UserForm1.Caption = "Расчет зависимости изгибающего момента от нагрузок" CommandButton1.Caption = "Расчет" CommandButton1.ControlTipText = " Произвести расчет момента" CommandButton1.Default = True CommandButton2.Caption = "Отмена" CommandButton2.ControlTipText = "Сброс" CommandButton2.Cancel = True TextBox1.ControlTipText = "Введите значение L" End Sub Программный код для листа. Private Sub CommandButton1_Click() UserForm1.Show End Sub Расчет зависимости изгибающего момента на вал от нагрузок Задача №24: Произвести расчет зависимости изгибающего момента на вал (рис.1), в зависимости от нагрузок, которые изменяются в пределах: Ft от 3000 до 8000 Н с шагом 500 Н; Fr от 1500 до 3000 Н с шагом 500 Н; L = 170 мм. При расчете использовать формулы: М И М Х2 М У2 где изгибающий момент по оси X: МХ Ft l 2 2 МY Fr l 2 2 изгибающий момент по оси Y: Обозначение 16 В задаче МИ – изгибающий момент МХ – изгибающий момент по оси х My – изгибающий момент по оси y Ft Fr l - длина В программе M mx my f1 f2 l Рисунок 1 Тестовый пример решения Private Sub ListBox1_Click() Dim x As String x = ListBox1.Text Select Case x ‘ начало выбора Case "3000 Н" f1 = 3000 TextBox1.Text = f1 17 Case "3500 Н" f1 = 3500 TextBox1.Text = f1 Case "4000 Н" f1 = 4000 TextBox1.Text = f1 Case "4500 Н" f1 = 4500 TextBox1.Text = f1 Case "5000 Н" f1 = 5000 TextBox1.Text = f1 Case "5500 Н" f1 = 5500 TextBox1.Text = f1 Case "6000 Н" f1 = 6000 TextBox1.Text = f1 Case "6500 Н" f1 = 6500 TextBox1.Text = f1 Case "7000 Н" f1 = 7000 TextBox1.Text = f1 Case "7500 Н" f1 = 7500 TextBox1.Text = f1 Case "8000 Н" f1 = 8000 TextBox1.Text = f1 End Select ‘ конец выбора End Sub Private Sub ListBox2_Click() Dim y As String y = ListBox2.Text Select Case y Case "1500 Н" f2 = 1500 TextBox2.Text = f2 Case "2000 Н" f2 = 2000 TextBox2.Text = f2 Case "2500 Н" f2 = 2500 TextBox2.Text = f2 Case "3000 Н" f2 = 3000 TextBox2.Text = f2 End Select End Sub Private Sub CommandButton1_Click() ‘ задание типа переменной Dim f1 As Single Dim f2 As Single Dim l As Single Dim mx As Single Dim my As Single Dim M As Single ‘ задание значения переменных f1 = CSng(TextBox1.Value) f2 = CSng(TextBox2.Value) l = CSng(TextBox3.Value) ‘ расчет по формулам mx = (f1 / 2) * (l / 2) my = (f2 / 2) * (l / 2) M = Sqr(mx ^ 2 + my ^ 2) 18 ‘ вывод результата TextBox4.Text = CStr(M) End Sub Private Sub CommandButton3_Click() UserForm1.Hide End Sub Private Sub CommandButton2_Click() ‘ придание текстовым полями значения “ “ TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" End Sub Private Sub CommandButton4_Click() Dim f1 As Single Dim f2 As Single Dim l As Single Dim M As Single f1 = CSng(TextBox1.Value) f2 = CSng(TextBox2.Value) l = CSng(TextBox3.Value) M = CSng(TextBox4.Value) ‘ вывод результата на рабочий лист Worksheets(1).Cells(2, 1).Formula = f1 Worksheets(1).Cells(2, 2).Formula = f2 Worksheets(1).Cells(2, 3).Formula = l Worksheets(1).Cells(2, 4).Formula = M End Sub Private Sub UserForm_initialize() ‘ заполнение списков ListBox1.List = Array("3000 Н", "3500 Н", "4000 Н", "4500 Н", "5000 Н", "5500 Н", "6000 Н", "7000 Н", "7500 Н", "8000 Н") ListBox2.List = Array("1500 Н", "2000 Н", "2500 Н", "3000 Н") ‘ задание всплывающих подсказок ListBox1.ControlTipText = "Выбери Ft" ListBox2.ControlTipText = "Выбери Fr" CommandButton1.ControlTipText = "Для решения жми сюда" CommandButton2.ControlTipText = "Для очистки полей жми сюда" CommandButton3.ControlTipText = "Для отмены жми сюда" TextBox1.ControlTipText = "Нагрузка Ft" TextBox2.ControlTipText = "Нагрузка Fr" TextBox3.ControlTipText = "Сюда вводите длину L" TextBox4.ControlTipText = "Изгибающий момент" ‘ блокировка окон от ввода TextBox1.Locked = True TextBox2.Locked = True TextBox4.Locked = True End Sub 19 Расчет зависимости изгибающего момента на вал от нагрузок Используя формулы , произвести расчет зависимости изгибающего момента на вал от нагрузок, Которые изменяются в пределах : Ft от 3000 до 8000 с шагом 500 Н; Fr от 1500 до 6500 с шагом 500 Н; L=170 мм. Результаты расчетов представить в виде таблицы . Расчетные формулы: Mx = (F1 / 2) * (l / 2) My = (F2 * l) / 4 M = Sqr((M1 ^ 2) + (M2 ^ 2)) Текст программы Private Sub CommandButton1_Click() Dim M1, M2, M3, F1, F2, l As Single Dim M11(15), m12(15), mres(15) As Single F1 = ListBox1.Value F2 = ListBox2.Value l = TextBox3.Value TextBox3.Value = l 'проверка и исправление ошибок If IsNumeric(TextBox3.Text) = False Then MsgBox "Введен плохой символ", 16, "Проверка ввода" TextBox3.SetFocus Exit Sub End If If CSng(TextBox3.Value) = 0 Then MsgBox "Длина должна быть отличной от нуля!", 48, "Проверка ввода" TextBox3.SetFocus Exit Sub End If 'F1 = CSng(F1) 'F2 = CSng(F2) 'l = CSng(l) 'вычисление изгибающего момента по формуле If OptionButton1.Value = True Then M1 = (F1 / 2) * (l / 2) M2 = (F2 * l) / 4 M3 = Sqr((M1 ^ 2) + (M2 ^ 2)) TextBox4.Value = M1 TextBox5.Value = M2 TextBox6.Value = M3 20 M4 = CInt(M3) TextBox7.Value = M4 End If If OptionButton2.Value = True Then Cells(1, 1).Value = "Ft" Cells(2, 1).Value = "Fr" Cells(3, 1).Value = "M" j=0 For i = 3000 To 8000 Step 500 j=j+1 Cells(1, j + 1).Value = i M11(j) = (i / 2) * (l / 2) Next i k1 = 1 For k = 1500 To 6500 Step 500 Cells(2, k1 + 1).Value = k m12(k1) = (k * l) / 4 k1 = k1 + 1 Next k k2 = 1 For k3 = 1 To 11 mres(k3) = Sqr((M11(k3) ^ 2) + m12(k3) ^ 2) Cells(3, k2 + 1).Value = mres(k3) k2 = k2 + 1 Next k3 End If End Sub Private Sub UserForm_Initialize() With ListBox1 For i = 3000 To 8000 Step 500 .AddItem i Next i End With With ListBox2 For j = 1500 To 6500 Step 500 .AddItem j Next j End With TextBox3.Value = "1,7" UserForm1.Caption = "Курсовая работа по информатике" Label1.Caption = "Ft-нагрузка по оси Ох, Н" Label2.Caption = "Fr-нагрузка по оси Оу, Н" Label3.Caption = "l-длина вала, м" Label4.Caption = "Мх-изгиб. момент по Ох" Label5.Caption = "Му-изгиб. момент по Оу" Label6.Caption = "Ми-изгиб. момент на вал, Н*м" Label7.Caption = "Мэкв. - эквивалентный момент" 21 CommandButton1.Caption = "вычислить" OptionButton1.Caption = "Результат-на форму" OptionButton2.Caption = "Результат в таблицу на лист" OptionButton1.Value = True End Sub Экранная форма: Ft 3000 Fr 1500 M 1425,49 3 3500 4000 4500 2000 2500 3000 5000 5500 6000 3500 4000 2593,89 2890,3 1713,23 2004,721 2298,539 3 13 4500 6500 7000 7500 8000 5000 5500 6000 6500 3485,25 3783,45 4081,9 3187,5 9 5 92 4380,8 22 начало Ftнач, шаг,Ftконеч, Frнач, шаг,Frконеч l проверк а Вывод на форму Ft=Ftнач F2=F2нач Мх , Му , М Ft=Ft+ аг F2<=F2нач F2=F2+шаг Ft<=Fкон еч Вывод на форму КОНЕЦ Расчет Мх ,Му , М На лист 23 Задача. Произвести прочностной расчёт резьбы хвостовика грузоподъёмного крюка по формулам D0=1,13*Sqr(P/Q), D>D0, где D0-внутренний диаметр резьбы хвостовика, P-нагрузка, Q-допускаемое напряжение на растяжение в металле, Для различных значений нагрузки P от 10 до 100 кН с шагом 10 кН. Допускаемое напряжение на растяжение в металле Q принять равным 72 Мпа. Результатами расчёта являются табличные значения внутреннего диаметра резьбы D0 и тип резьбы. Private Sub CommandButton1_Click() Dim i As Integer 'счетчик цикла Dim p As Single 'Вес нагрузки Dim res As Single 'результат расчёта Dim ttt As String 'временная строковая переменная Dim size As Integer 'количество ячеек в таблице с данными о диаметре Dim j As Integer 'другой счетчик цикла Const sigma = 72 ' j=1 For p = 10000 To 100000 Step 10000 res = 1.13 * Sqr(p / sigma) 'определение типа резьбы '1 подсчет количества строк в таблице size = 0 i=2 While IsNumeric(Worksheets(1).Cells(i, 2).Text) And IsNumeric(Worksheets(1).Cells(i + 1, 2).Text) i=i+1 size = size + 1 Wend ' к концу цикла в переменной size будет количество строк в таблице. For i = size To 2 Step -1 If res > CSng(Worksheets(1).Cells(i, 2).Text) Then ttt = "Резьба " + Worksheets(1).Cells(i, 1).Text + _ " внутренний диаметр= " + CStr(res) 'MsgBox ttt, vbOKOnly + vbInformation, "конец" GoTo exit1 End If Next i exit1: Worksheets(2).Cells(j, 5).Value = ttt j=j+1 Next p Label1.Caption = "результаты расчета ищите на втором листе этого документа Excell" End Sub Private Sub CommandButton2_Click() 24 UserForm1.Hide End Sub D M6 M8 M 10 M 12 M 14 M 16 M 18 M 20 M 22 M 24 M 27 M 30 M 36 M 42 M 46 D1 4 5,5 7 8 10 12 13 15 17 18 21 23 28 32 36 Вариант № 25 Произвести расчет эквивалентного момента в опасном сечении вала: М экв М х2 М у2 0,75Т 2 . Исходные данные: момент Т, пределы изменения момента Мх и Му; формулы для их расчета, а также значение l взять из задачи 24. Ft от 3000 до 5000 Н с шагом 500 Н. Fr от 1500 до 3000 Н с шагом 500 Н. l 170 мм Mx Ft l 2 2 My Fr l 2 2 В программе используются переменные: В формуле. В программе МЭКВ МХ МУ Fr Ft l mq (d для индивидуального) mx my fr (qw для индивидуального) ft (qe для индивидуального) 25 Public qw As Single 'глобальная переменная qw Public qe As Single 'глобальная переменная qe Private Sub CommandButton1_Click() 'расчет для всех значений Dim i As Integer ' счетчик Dim j As Integer ' счетчик Dim mq As Single ' mq Dim mx As Single ' mx Dim my As Single ' my Dim ft As Single ' ft Dim fr As Single ' fr Dim T As Single ' T pr = TextBox1.Text ' проверка поля на ошибки r = IsNumeric(pr) ' отсутствие чисел или ввод букв If r = False Then MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода" TextBox1.SetFocus ' установка курсора в первое поле Exit Sub End If T = CSng(TextBox1.Text) If T = 0 Then ' проверка на наличия 0 в первом поле MsgBox "Впервом поле 0", vbInformation, "Ошибка ввода" TextBox1.SetFocus Exit Sub End If i = 1: j = 1 For ft = 3000 To 5000 Step 500 ' цикл для расчета значений mx = ft / 2 * 170 / 2 ' mx для всех значений ft i=i+1 For fr = 1500 To 3000 Step 500 ' my для всех значений fr my = fr / 2 * 170 / 2 mq = Sqr(mx ^ 2 + my ^ 2 + (0.75 * T) ^ 2) 'расчет значений mq j=j+1 Worksheets(1).Cells(i, j).Formula = mq 'заполнение листа Next fr j = 1 'что бы происходило заполнение следующей строчки, с ячейки А Next ft End Sub Private Sub CommandButton2_Click() ' индивидуальный расчет Dim d As Single Dim T As Single Dim q As Single Dim g As Single pr = TextBox1.Text ' проверка на наличие ошибок r = IsNumeric(pr) If r = False Then 26 MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода" TextBox1.SetFocus Exit Sub End If T = CSng(TextBox1.Text) 'переменной Т присваивается значение числа в первом поле If T = 0 Then MsgBox "Впервом поле 0", vbInformation, "Ошибка ввода" TextBox1.SetFocus Exit Sub End If q = qw / 2 * 85 g = qe / 2 * 85 d = Sqr((q) ^ 2 + (g) ^ 2 + (0.75 * T) ^ 2) TextBox2.Text = CStr(d) 'вывод результата в поле №2 Worksheets(1).Cells(8, 1).Formula = d ' вывод результата на лист End Sub Private Sub ListBox1_Click() ' выбор из списка №1 Select Case ListBox1.ListIndex Case 0 ' если выбираешь первый пункт qw присваивается значение 3000 qe = 3000 Case 1 ' аналогично qe = 3500 Case 2 qe = 4000 Case 3 qe = 4500 Case 4 qe = 5000 End Select End Sub Private Sub ListBox2_Click() 'выбор из списка № 2 Select Case ListBox2.ListIndex Case 0 qw = 1500 Case 1 qw = 2000 Case 2 qw = 2500 Case 3 qw = 3000 End Select End Sub Private Sub UserForm_Initialize() 'инициализация With ListBox1 ' в-первый список заносятся даннные 27 .List = Array("3000", "3500", "4000", "4500", "5000") .ListIndex = 0 ' при запуске выделяется первый пункт в списке № 1 End With With ListBox2 .List = Array("1500", "2000", "2500", "3000") .ListIndex = 0 End With End Sub На листе: Расчет конденсатора, сглаживающего пульсацию выпрямленного тока. Задание: Составить схему алгоритма расчёта конденсатора С, сглаживающего пульсации выпрямленного тока в условиях изменяющейся нагрузки R , используя формулу: С 1 * P * fп * R где fп – частота пульсации; P – коэффициент пульсации. 28 Д R C Обозначения: В задаче: fn P R C Экранная форма: В программе: fn P R C 29 Программный код: Private Sub CommandButton1_Click() Dim fp As Single 'определяем типы переменных величин, Dim P As Single 'используемых в программе Dim R As Single Dim C As Single Dim pi As Single s = TextBox1.Value 'присваиваем значение первого текстового окна переменной Р Call pr(s, res) 'вызываем подпрограмму pr,которая будет использовать переменные Р и res If res = 4 Then 'если по ошибке пользователь вводит буквы TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы ElseIf res = 2 Then 'если введенное значение равно 0 TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы End If s = TextBox2.Value 'присваиваем значение второго текстового окна переменной Р Call pr(s, res) 'вызываем подпрограмму wwod и производим аналогичные действия If res = 4 Then TextBox2.SetFocus Exit Sub ElseIf res = 2 Then TextBox2.SetFocus Exit Sub End If s = TextBox3.Value 'аналогично Call pr(s, res) If res = 4 Then TextBox3.SetFocus Exit Sub ElseIf res = 2 Then TextBox3.SetFocus Exit Sub End If pi = 3.14 fp = CSng(TextBox1) 'присваиваем значения переменным из P = CSng(TextBox2) 'соответствующих текстовых полей R = CSng(TextBox3) C = Round(1 / (pi * P * fp * R), 3) 'производим необходимые расчеты по формулам TextBox4.Text = CStr(C) End Sub Private Sub CommandButton2_Click() TextBox1 = "" 'очистка текстовых полей с 1 по 4 TextBox2 = "" TextBox3 = "" TextBox4 = "" End Sub 30 Private Sub CommandButton3_Click() UserForm1.Hide 'процедура выхода из программы End Sub Private Sub UserForm_Initialize() Label1.Caption = "Частота пульсации, Гц" 'устанавливаем подписи окон Label2.Caption = "Коэффициент пульсации" Label3.Caption = "Изменение нагрузки, Ом" Label4.Caption = "Полученная ёмкость конденсатора, Ф" Frame1.Caption = "Исходные данные" ' устанавливаем название рамок Frame2.Caption = "Полученные данные " CommandButton1.Caption = "Считать" 'устанавливаем на кнопках надписи, соответствующие выполняемым действиям CommandButton2.Caption = "Очистить" CommandButton3.Caption = "Выход" CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем за ней CommandButton1.ControlTipText = "Нахождение неизвестных величин" 'всплывающую подсказку CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую подсказку CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую подсказку и CommandButton3.Cancel = True 'присваиваем значение клавиши Escape End Sub Sub pr(s, res) 'подпрограмма обработки введенных данных If IsNumeric(s) = False Then 'проверяем,не является ли введеная величина числом res = MsgBox("Введеная величина не число", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура выхода из подпрограммы End If If CSng(s) = 0 Then 'проверяем,является ли введеная величина равной 0 res = MsgBox("Введеная величина 0", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммы End If If CSng(s) < 0 Then 'проверяем, является ли введеная величина меньше 0 res = MsgBox("Введеная величина должна быть положительной", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммыEnd If End Sub 'окончание подпрограммы обработки введенных данных Пример: fn = 50 Гц; P = 0,5; R = 0,01 Ом; C = 1,274 Ф. 31 Произвести расчёт параметров трансформатора, где число первичной обмотки w1, число витков вторичной обмотки w2, площадь сечения сердечника S, площадь сечения окна сердечника S’. Исходные данные: напряжение первичной обмотки U1, ток и напряжение вторичной обмотки I2 и U2, КПД трансформатора При расчёте использовать формулы: U2 I 2 /(U1I1 ) , S U1I1 откуда S U 2 I 2 / w1 50U1 / S w2 50U 2 / S Значение диаметра провода без изоляции : d1, 2 0,8 I1, 2 По вычисленным значениям d1 и d2 выбрать ближайшие стандартные значения диаметров проводов с изоляцией – dиз1 и dиз2..Площадь сечения окна сердечника S1 определить по формуле . S 0,8( w1dиз2 1 w2 dиз2 2 ) I1 U1 I2 w1 w2 U2 32 Блок-схема: Начало Вводим U1, U2, I1, да да isNu meric нет = false Csng =0 нет да Csng<0 нет S = Sqr(U2 * I2 / n) Вывод S I1 = U2 * I2 / (n * U1) d1,2 = 0.8 * (Sqr(I1,2)) S1 = 0.8 * (w1 * d1 ^ 2 + w2 * d2 ^ 2) Вывод S1 конец w1,2 = 50 * U1,2 / S Вывод w1,2 33 Экранная форма: Программный код : Private Sub CommandButton1_Click() Dim U1 As Single 'определяем типы переменных величин, Dim U2 As Single 'используемых в программе Dim I2 As Single Dim n As Single Dim I1 As Single Dim S As Single Dim S1 As Single Dim w1 As Single Dim w2 As Single Dim d1 As Single Dim d2 As Single P = TextBox1.Value 'присваиваем значение первого текстового окна переменной Р Call wwod(P, res) 'вызываем подпрограмму wwod,которая будет использовать переменные Р и res If res = 4 Then 'если по ошибке пользователь вводит буквы 34 TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы ElseIf res = 2 Then 'если введенное значение равно 0 TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы End If P = TextBox2.Value 'присваиваем значение второго текстового окна переменной Р Call wwod(P, res) 'вызываем подпрограмму wwod и производим аналогичные действия If res = 4 Then TextBox2.SetFocus Exit Sub ElseIf res = 2 Then TextBox2.SetFocus Exit Sub End If P = TextBox3.Value 'аналогично Call wwod(P, res) If res = 4 Then TextBox3.SetFocus Exit Sub ElseIf res = 2 Then TextBox3.SetFocus Exit Sub End If P = TextBox4.Value 'аналогично Call wwod(P, res) If res = 4 Then TextBox4.SetFocus Exit Sub ElseIf res = 2 Then TextBox4.SetFocus Exit Sub End If U1 = CSng(TextBox1.Text) 'присваиваем значения переменным из I2 = CSng(TextBox2.Text) 'соответствующих текстовых полей U2 = CSng(TextBox3.Text) n = CSng(TextBox4.Text) 35 I1 = U2 * I2 / (n * U1) 'производим необходимые расчеты по формулам S = Sqr(U2 * I2 / n) w1 = 50 * U1 / S w2 = 50 * U2 / S d1 = 0.8 * (Sqr(I1)) d2 = 0.8 * (Sqr(I2)) S1 = 0.8 * (w1 * d1 ^ 2 + w2 * d2 ^ 2) TextBox5.Text = Int(CStr(w1)) 'присваиваем значения найденных TextBox6.Text = Int(CStr(w2)) 'величин соответствующим текстовым полям TextBox7.Text = CStr(S) TextBox8.Text = Int(CStr(S1)) End Sub Private Sub CommandButton2_Click() TextBox1.Text = "" 'очистка текстовых полей с 1 по 8 TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" TextBox8.Text = "" End Sub Private Sub CommandButton3_Click() UserForm1.Hide 'процедура выхода из программы End Sub Private Sub UserForm_Initialize() TextBox5.Enabled = False 'запрещаем доступ к полям,куда будут TextBox6.Enabled = False 'помещены результаты TextBox7.Enabled = False TextBox8.Enabled = False UserForm1.Caption = "Расчёт параметров трансформатора" Label1.Caption = "Напряжение первичной обмотки,В" Label2.Caption = "Ток вторичной обмотки,А" Label3.Caption = "Напряжение вторичной обмотки,В" Label4.Caption = "КПД трансформатора,%" Label5.Caption = "Число витков первичной обмотки,шт" Label6.Caption = "Число витков вторичной обмотки,шт" 36 Label7.Caption = "Площадь сечения сердечника,кв. м" Label8.Caption = "Площадь сечения окна сердечника,кв. м" CommandButton1.Caption = "Считать" 'устанавливаем на кнопках надписи,соответствующие выполняемым действиям CommandButton2.Caption = "Очистить" CommandButton3.Caption = "Выход" CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем за ней CommandButton1.ControlTipText = "Нахождение неизвестных величин" 'всплывающую подсказку CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую подсказку CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую подсказку и CommandButton3.Cancel = True 'присваиваем значение клавиши Escape End Sub Sub wwod(P, res) 'подпрограмма обработки введенных данных If IsNumeric(P) = False Then 'проверяем,не является ли введеная величина числом res = MsgBox("Введеная величина не является числом", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура выхода из подпрограммы End If If CSng(P) = 0 Then 'проверяем,является ли введеная величина равной 0 res = MsgBox("Введеная величина равна 0", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммы End If If CSng(P) < 0 Then 'проверяем,является ли введеная величина меньше 0 res = MsgBox("Введеная величина должна быть положительной", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммы End If End Sub 'окончание подпрограммы обработки введенных данных 37 Пример : U1=10 U2=20 n=40 I1=30 w1=1.29 w2=387 S=3.87 S1=4065 Задание: Провести расчет индуктивности многослойной катушки, имеющей размеры d min, d max, b и число витков w.Индуктивность многослойных катушек определяется по формуле: Расчетная формула: Где d=0.5*(d max+d min) L=(0.08*d^2*w^2)/(3*d+9*b+10*c), c=0.5*(d max-d min) Обозначения: В задаче: В программе: dmin dmax b w L dmin dmax b w L 38 Блок-схема: Начало Ввод Dmin, Dmax,b,w, проверка на ошибки да isNumeric = false нет да Csng = 0 нет да Csng<0 нет L = (0.08 * (0.5 * (dmax + dmin)) ^ 2 * w ^ 2) / 3 * (0.5 * (dmax + dmin)) + 9 * b + 10 * (0.5 * (dmax - dmin)) Вывод L конец 39 Экранная форма: 40 Программный код: Private Sub CommandButton1_Click() Dim dmax As Single Dim dmin As Single Dim b As Single Dim w As Single Dim L As Single Q = TextBox1.Value 'присваиваем значение первого текстового окна переменной Р Call prow(Q, res) 'вызываем подпрограмму wwod,которая будет использовать переменные Р и res If res = 4 Then 'если по ошибке пользователь вводит буквы TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы ElseIf res = 2 Then 'если введенное значение равно 0 TextBox1.SetFocus 'устанавливаем курсор в первое текстовое окно Exit Sub 'процедура досрочного выхода из программы End If Q = TextBox2.Value 'присваиваем значение второго текстового окна переменной Р Call prow(Q, res) 'вызываем подпрограмму wwod и производим аналогичные действия If res = 4 Then TextBox2.SetFocus Exit Sub ElseIf res = 2 Then TextBox2.SetFocus Exit Sub End If Q = TextBox3.Value 'аналогично Call prow(Q, res) If res = 4 Then TextBox3.SetFocus Exit Sub ElseIf res = 2 Then TextBox3.SetFocus Exit Sub End If Q = TextBox4.Value 'аналогично Call prow(Q, res) If res = 4 Then TextBox4.SetFocus Exit Sub ElseIf res = 2 Then TextBox4.SetFocus 41 Exit Sub End If dmax = CSng(TextBox1.Text) 'присваиваем значения переменным из dmin = CSng(TextBox2.Text) 'соответствующих текстовых полей b = CSng(TextBox3.Text) w = CSng(TextBox4.Text) L = Round((0.08 * (0.5 * (dmax + dmin)) ^ 2 * w ^ 2) / 3 * (0.5 * (dmax + dmin)) + 9 * b + 10 * (0.5 * (dmax - dmin)), 2) TextBox5.Enabled = True TextBox5.Text = CStr(L) End Sub Private Sub CommandButton2_Click() TextBox1.Text = "" 'очистка текстовых полей с 1 по 6 TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" End Sub Private Sub CommandButton3_Click() UserForm1.Hide End Sub Private Sub UserForm_Initialize() TextBox5.Enabled = False 'запрещаем доступ к полям, куда будут помещены результаты UserForm1.Caption = "Расчет индуктивности многослойной катушки" Label1.Caption = "Максимальный диаметр,мм" Label2.Caption = "Минимальный диаметр,мм" Label3.Caption = "Ширина катушки,мм" Label4.Caption = "Число витков,шт." Label5.Caption = "Индуктивность,Гн" CommandButton1.Caption = "Вычислить" 'устанавливаем на кнопках надписи, соответствующие выполняемым действиям CommandButton2.Caption = "Сброс" CommandButton3.Caption = "Отмена" CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем за ней CommandButton1.ControlTipText = "Вычисление неизвестных величин" 'всплывающую подсказку CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую подсказку 42 CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую подсказку и CommandButton3.Cancel = True 'присваиваем значение клавиши Escape End Sub Sub prow(Q, res) 'подпрограмма обработки введенных данных If IsNumeric(Q) = False Then 'проверяем, не является ли веденая величина числом res = MsgBox("Введеная величина не является числом", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура выхода из подпрограммы End If If CSng(Q) = 0 Then 'проверяем,является ли введеная величина равной 0 res = MsgBox("Введеная величина равна 0", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммы End If If CSng(Q) < 0 Then 'проверяем,является ли введеная величина меньше 0 res = MsgBox("Введеная величина должна быть положительной", 53, "Курсовая работа") 'если да,выводим сообщение об этом на экран Exit Sub 'процедура досрочного выхода из подпрограммы End If End Sub 'окончание подпрограммы обработки введенных данных Пример dmax = 10 dmin = 1 b=5 w = 15 L = 1088,25 43 Расчет числа витков катушки индуктивности и диаметра провода с изоляцией. 0,01Dw 2 Используя формулу L ,рассчитать число витков катушки 0,44 (a / D) индуктивности. Затем определить значение диаметра провода с изоляцией: d из а / w Исходные данные: D-диаметр катушки, a-длина намотки, w-число витков. Обозначения: B задаче: a D d из w L Экранная форма: Програмный код: Private Sub CommandButton1_Click() Dim d As Single 'диаметр катушки Dim a As Single 'длина намотки Dim L As Single 'индуктивность Dim w As Single 'число витков В программе: a D s w L 44 d = TextBox1.Value 'проверяем является ли d числом Call wwod(d, res, res1) If res = 4 Then TextBox1.SetFocus Exit Sub End If 'проверяем d=0 или d<0 If res1 = 4 Then TextBox1.SetFocus Exit Sub End If 'проверяем является ли a числом a = TextBox2.Value Call wwod(a, res, res1) If res = 4 Then TextBox1.SetFocus Exit Sub End If 'проверяем a=0 или a<0 If res1 = 4 Then TextBox1.SetFocus Exit Sub End If 'проверяем является ли L числом L = TextBox3.Value Call wwod(L, res, res1) If res = 4 Then TextBox1.SetFocus Exit Sub End If 'проверяем L=0 или L<0 If res1 = 4 Then TextBox1.SetFocus Exit Sub End If w = (L * (0.44 + (a / d) / 0.01 * d)) ^ 0.5 d = CSng(d) a = CSng(a) L = CSng(L) w = CSng(w) TextBox4.Value = w 45 End Sub Private Sub CommandButton2_Click() Dim w As Single 'число витков Dim b As Single 'диаметр провода с изоляцией Dim a As Single 'длина намотки a = TextBox2.Value w = TextBox4.Value w = TextBox4.Value a = CInt(TextBox2.Value) s=a/w TextBox5.Value = s End Sub Private Sub CommandButton3_Click() TextBox1.Value = "" TextBox2.Value = "" TextBox3.Value = "" TextBox4.Value = "" TextBox5.Value = "" End Sub Private Sub UserForm_Initialize() Label1.Caption = "введите диаметр катушки,м" UserForm1.Caption = "РАСЧЕТ" Label2.Caption = "введите длину намотки,м" Label3.Caption = "введите значение индуктивности,Гн" CommandButton1.Caption = " вычислить " Label4.Caption = "вычисленное число витков" Label5.Caption = "вычисленный диаметр провода с изоляцией,м" CommandButton3.Caption = "сброс" CommandButton2.Caption = "вычислить" End Sub Процедура проверки корректности данных: Sub wwod(a, res, res1) If IsNumeric(a) = False Then res = MsgBox("введён символ", 53, "ошибка ввода") Exit Sub End If 46 If a = 0 Or a < 0 Then res1 = MsgBox("введите положительное число", 53, "введены 0 или отрицательное число") Exit Sub End If End Sub Пример: L=0,25 Гн a=0,4 м D=0,2 м W=3,551 dиз=0,1408 м Составить схему алгоритма определения числа витков и диаметра провода с изоляцией для катушек индуктивности, обеспечивающих наименьшее активное сопротивление, которое достигается при отношении a/D=0,4. April 2002 Вт Ср April Чт Пт 2002 Сб Вс Пн 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 Формулы для расчёта: 0,01Dw 2 L d a/w 0,44 a / D ; из Исходные данные: индуктивность L , значения диаметра катушки D изменяются в пределах от 1 до 10 см с шагом 1 см, число витков w , длина намотки a Значение L=10мкГ задать в операторе присваивания; изменяющиеся значения диаметра катушки индуктивности D задать в операторе цикла. 47 Обозначения: В задаче: L D a w dиз В программе: l d a w diz Экранная форма: Программный код: Private Sub CommandButton1_Click() Dim l As Single 'определяем переменныe Dim d As Single Dim a As Single Dim w As Single Dim diz As Single q = TextBox1.Value 'значение первого текстового присваиваем q Call Proverka(q, otv) 'подпрограммa Proverka If otv = 4 Then 'вводены буквы TextBox1.SetFocus ' курсор устанавливается в первое текстовое окно 48 Exit Sub ' досрочный выход из программы ElseIf otv = 2 Then ' введен 0 TextBox1.SetFocus Exit Sub End If q = TextBox2.Value If q < 1 Or q > 10 Then MsgBox "Введи целое число от 1 до 10" TextBox2.SetFocus Exit Sub End If Call Proverka(q, otv) If otv = 4 Then TextBox2.SetFocus Exit Sub ElseIf otv = 2 Then TextBox2.SetFocus Exit Sub End If l = CSng(TextBox1.Text) 'назначаем значения из текстовых полей d = CSng(TextBox2.Text) a = Round(0.4 * d, 1) 'расчеты w = Round(10 * Sqr(l * (0.84) / d), 0) diz = Round(a / w, 2) TextBox3.Enabled = True 'разрешаем доступ к полям результатов TextBox4.Enabled = True TextBox3.Text = CStr(w) 'присваиваем значения переменных текстовым полям TextBox4.Text = CStr(diz) End Sub Private Sub CommandButton2_Click() TextBox1.Text = "" 'очищаем текстовые поля TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" End Sub Private Sub CommandButton3_Click() UserForm1.Hide ' выход из программы End Sub Private Sub UserForm_Initialize() TextBox3.Enabled = False 'запретим доступ к полям результата TextBox4.Enabled = False Label3.Caption = "число витков,шт" Label2.Caption = "диаметр,мм" Label1.Caption = "индуктивность,Гн" Label4.Caption = "диаметр повода с изоляцией,мм" CommandButton1.Caption = "Вычислить" 'устанавливаем на кнопках надписи,соответствующие выполняемым действиям CommandButton2.Caption = "Очистить" CommandButton3.Caption = "Отмена" CommandButton1.Default = True 'присваиваем первой кнопке значение клавиши Enter и закрепляем за ней CommandButton1.ControlTipText = "Нахождение неизвестных величин" 'всплывающую подсказку 49 CommandButton2.ControlTipText = "Очистить поля ввода" 'закрепляем за 2 кнопкой всплывающую подсказку CommandButton3.ControlTipText = "Выход из программы" 'закрепляем за 3 кнопкой всплывающую подсказку и CommandButton3.Cancel = True 'присваиваем значение клавиши Escape UserForm1.Caption = "Расчет числа витков и диаметра провода" End Sub Sub Proverka(q, otv) 'обработкa данных If IsNumeric(q) = False Then 'является ли q числом otv = MsgBox("Эта величина не является числом", 53, "Проверка") Exit Sub 'выход из подпрограммы End If If CSng(q) = 0 Then 'является ли q = 0 otv = MsgBox("Bеличина равна 0", 53, "Проверка") Exit Sub 'выход из подпрограммы End If If CSng(q) < 0 Then 'является ли q < 0 otv = MsgBox("Bеличина < 0", 53, "Проверка") Exit Sub 'выход из подпрограммы End If End Sub Составить схему алгоритма расчета сопротивления R проводов из 10 различных материалов, используя формулу: l=d2R/4 Исходные данные: длина провода диаметр провода удельные сопротивления - l d Обозначения: В задаче: l d R В программе: l d sop R 50 Экранная форма: 51 Программный код: Private Sub CommandButton1_Click() Dim d As Single 'диаметр сечения провода Dim p As Single 'удельное сопротивление металла Dim met As String 'металл Dim i As Integer 'номер строки листа Dim R As Single 'сопротивление провода l = TextBox2.Value 'присваиваем значение текстовых полей переменным d = TextBox3.Value Call wwod(l, Res, Res1) 'вызываем модуль проверки If Res = 4 Then TextBox2.SetFocus 'устанавливеат курсор на текстовое поле 2 Exit Sub End If If Res1 = 4 Then TextBox2.SetFocus Exit Sub End If Call wwod(d, Res, Res1) 'вызываем модуль проверки If Res = 4 Then TextBox3.SetFocus Exit Sub End If If Res1 = 4 Then TextBox3.SetFocus 'устанавливеат курсор на текстовое поле 3 Exit Sub End If l = CSng(l) число d = CSng(d) 'переменные представляем из последовательности символов в met = ListBox1.Value 'присваиваем переменной met значение выбранного элемента списка For i = 1 To 10 'цикл с условием; выбираем значение "p" соответствующее выбранному металлу If Worksheets(1).Cells(i, 1) = met Then p = Worksheets(1).Cells(i, 2) End If Next i Label1.Caption = p 'присваиваем надписи значение "p" в качестве заголовка R = 4 * l * p / (3.14 * d ^ 2) 'определяем значение "R" TextBox1.Value = R 'присваиваем текстовому полю 1 значение "R" End Sub Private Sub ListBox1_Click() 52 met = ListBox1.Value 'присваиваем переменной met значение выбранного элемента списка For i = 1 To 10 'цикл с условием; выбираем значение "p" соответствующее выбранному металлу If Worksheets(1).Cells(i, 1) = met Then p = Worksheets(1).Cells(i, 2) End If Next i Label1.Caption = p 'присваиваем надписи значение "p" в качестве заголовка End Sub Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) TextBox2.Value = " " 'при установке курсора на тектовое поле 2 присваиваем ему значение пробела End Sub Private Sub TextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) TextBox3.Value = " " 'при установке курсора на тектовое поле 3 присваиваем ему значение пробела End Sub Private Sub UserForm_Initialize() Frame1.Caption = "Введите данные для расчета" 'записываем заголовок With ListBox1 'заполняем список данными с листа For i = 1 To 10 .AddItem Cells(i, 1) Next i End With CommandButton1.Caption = "Вычислить" Label1.Caption = " " Label2.Caption = "Искомое сопротивление" Label3.Caption = "Длина провода" Label4.Caption = "Диаметр сечения" Label5.Caption = "Удельное сопротивление " UserForm1.Caption = "Расчет сопротивления проводов" End Sub Sub wwod(A, Res, Res1) 'подпрограмма проверки If IsNumeric(A) = False Then Res = MsgBox("Введен символ", 53, "Введи число") End If If A < 0 Or A = 0 Then Res1 = MsgBox("Введено недопустимое числовое значение", 53, "Введи число ") End If End Sub 53 Задание : Составить схему алгоритма определения диаметра провода для обеспечения нужного сопротивления при заданном материале и длине. При расчете использовать формулу : l Получив расчетное значение диаметра значение . d 2 R 4 (1) d , выбрать ближайшее стандартное Обозначения : В задаче l R В программе L R R1 серебра Алгоритм решения задачи 1.Ввод исходных данных l = 30м R = 100 Ом серебра = 0,016 Ом мм 2 /м и проверка их на ошибки . 2.Вычисление диаметра по расчетной формуле : d= l 4 R которую получили из формулы (1) Private Sub CommandButton1_Click() Dim L As Single Dim R As Single Dim R1 As Single Dim d As Single If IsNumeric(TextBox1.Text) = False Then MsgBox "Введите длину", vbInformation, "ввод" TextBox1.SetFocus Exit Sub End If If IsNumeric(TextBox2.Text) = False Then MsgBox "Введите сопротивление", vbInformation, "ввод" TextBox2.SetFocus Exit Sub End If If CSng(TextBox2.Text) = 0 Then MsgBox "Введите сопротивление серебра", vbInformation, "ввод" TextBox2.SetFocus Exit Sub End If 54 If IsNumeric(TextBox3.Text) = False Then MsgBox "Введите удельное сопротивление серебра", vbInformation, "ввод" TextBox3.SetFocus Exit Sub End If L = CSng(TextBox1.Text) R = CSng(TextBox2.Text) R1 = CSng(TextBox3.Text) d = Sqr(L * 4 * R1 / 3.14 * R) TextBox4.Text = CStr(d) End Sub Тестовый пример Расчет делителя напряжения цепи постоянного тока Произвести расчет делителя напряжения цепи постоянного тока (рис.18). Исходные данные:Uи –напряжение источника подводимое к делителю; Uнапряжение, снимаемое с делителя, изменяется в пределах от 20 до 100 В с шагом 10 В; I-ток потребителя; I2- ток через сопротивление R2 делителя. Результатом решения задачи являются значения сопротивления делителя R1 и R2 для различных значений напряжения U. Расчетные соотношения вывести из рис.18. R1 (U И U ) (I I2 ) R2 U I2 55 __ I1 Uи I + + R2 I2 U К потребителю R1 Рис.18 Исходные данные: В программе В формуле uu Uи – напряжение источника, подводимое к делителю; u U – напряжение, снимаемое с делителя, изменяется в пределах от 20 до 100В с шагом 10В; i I – ток потребителя; ii I2 – ток через сопротивление R2 делителя. Программный код: Private Sub CommandButton1_Click() ' Вычисление Dim uu As Single ' переменная Dim u(1 To 9) As Single 'массив от 1 до 9 Dim i As Single Dim ii As Single Dim g As Single ' Dim k As Integer ' счетчик Dim r(1 To 9) As Single 'массив Dim rr(1 To 9) As Single 'массив pr = TextBox1.Text 'проверка на ошибки g = IsNumeric(pr) 'наличие букв If g = False Then MsgBox "В первом поле нет числа", vbInformation, "Ошибка ввода" TextBox1.SetFocus 'установка курсора в поле № 1 Exit Sub End If uu = CSng(TextBox1.Text) pr = TextBox2.Text g = IsNumeric(pr) If g = False Then MsgBox "Во втором поле нет числа", vbInformation, "Ошибка ввода" TextBox2.SetFocus Exit Sub End If i = CSng(TextBox2.Text) 56 If i = 0 Then 'проверка на 0 MsgBox "Во втором поле 0", vbInformation, "Ошибка ввода" TextBox2.SetFocus 'установка курсора во второе поле Exit Sub End If pr = TextBox3.Text g = IsNumeric(pr) If g = False Then MsgBox "В третьем поле нет числа", vbInformation, "Ошибка ввода" TextBox3.SetFocus Exit Sub End If ii = CSng(TextBox3.Text) If ii = 0 Then MsgBox "В третьем поле 0", vbInformation, "Ошибка ввода" TextBox3.SetFocus Exit Sub End If k=1 For g = 20 To 100 Step 10 u(k) = g 'заполнение массива переменной k = k + 1 ' счетчик Next g For k = 1 To 9 r(k) = (uu - u(k)) / (i + ii) 'вычисление всех значений r1 rr(k) = u(k) / ii 'вычисление всех значений r2 Next k ListBox1.List = Array(r(1), r(2), r(3), r(4), r(5), r(6), r(7), r(8), r(9)) 'заполнение листа №1 ListBox2.List = Array(rr(1), rr(2), rr(3), rr(4), rr(5), rr(6), rr(7), rr(8), rr(9)) 'заполнение листа № 2 End Sub Задание: Произвести расчет делителя напряжения цепи постоянного тока. Расчетные формулы: R1 (Uи U ) /( I I 2 ) ; R2 U / I 2 . Исходные данные: Uи, U, I, I2 Размерность: Напряжение источника -Uи [В],напряжение, снимаемое с делителя, изменяется в пределах от 20 до 100 В с шагом 10В- U[В], ток потребителяI [А], ток через сопротивление делителя I2-[А], сопротивление - R1,R2 [Oм]. 57 Обозначения: В задаче: U,(напряжение) Uи,( напряжение источника) I,( ток потребителя) I2,( ток делителя ) R1, (сопротивление) R2, (сопротивление) В программе: u, (напряжение ) ui,( напряжение источника) i,( ток потребителя) i2,( ток делителя) r1, (сопротивление) r2, (сопротивление) Алгоритм решения задачи: 1. Ввод данных и проверка их на наличие ошибок. 2. Вычисление сопротивлений при заданных параметрах. 3. Вывести результаты вычислений, очистить поля ввода. Тестовый пример: 58 Программный код: DefSng A-G Private Sub CommandButton1_Click() If IsNumeric(TextBox1.Text) = False Then MsgBox " Значение в поле 1 не число! Исправьте! ", 16, "Контроль ввода данных" TextBox1.SetFocus 'Устанавливает фокус в поле 1 Exit Sub End If If CSng(TextBox1.Text) = 0 Or CSng(TextBox1.Text) < 0 Then MsgBox "Напряжение не может быть равно или быть меньше 0! Исправьте!", 16, "Контроль ввода данных" TextBox1.SetFocus 'Устанавливает фокус в поле 1 Exit Sub End If If IsNumeric(TextBox2.Text) = False Then MsgBox " Значение в поле 2 не число! Исправьте! ", 16, "Контроль ввода данных" TextBox2.SetFocus 'Устанавливает фокус в поле 2 Exit Sub End If If CSng(TextBox2.Text) < 20 Or CSng(TextBox2.Text) > 100 Then MsgBox "Вы вышли за пределы допустимых значений! Исправьте!", 16, "Контроль ввода данных" TextBox2.SetFocus 'Устанавливает фокус в поле 2 Exit Sub End If If IsNumeric(TextBox3.Text) = False Then MsgBox " Значение в поле 3 не число ! Исправьте! ", 16, "Контроль ввода данных" TextBox3.SetFocus 'Устанавливает фокус в поле 3 Exit Sub 59 End If If CSng(TextBox3.Text) = 0 Or CSng(TextBox3.Text) < 0 Then MsgBox "Ток не может быть равен или быть меньше 0! Исправьте!", 16, "Контроль ввода данных" TextBox3.SetFocus 'Устанавливает фокус в поле 3 Exit Sub End If If IsNumeric(TextBox6.Text) = False Then MsgBox " Значение в поле 4 не число ! Исправьте! ", 16, "Контроль ввода данных" TextBox6.SetFocus 'Устанавливает фокус в поле 6 Exit Sub End If If CSng(TextBox6.Text) = 0 Or CSng(TextBox6.Text) < 0 Then MsgBox "Ток не может быть равен или быть меньше 0! Исправьте!", 16, "Контроль ввода данных" TextBox6.SetFocus 'Устанавливает фокус в поле 6 Exit Sub End If ui = CSng(TextBox1.Text) 'Присвоить переменной ui числовое значение поля 1 u = CSng(TextBox2.Text) 'Присвоить переменной u числовое значение поля 2 i = CSng(TextBox3.Text) 'Присвоить переменной i числовое значение поля 3 i2 = CSng(TextBox6.Text) 'Присвоить переменной i2 числовое значение поля 6 r1 = (ui - u) / (i + i2) 'Формула для расчета сопротивления R1 TextBox4.Text = CStr(r1) 'Занести результат в поле 4 r2 = u / i2 'Формула для расчета сопротивления R2 TextBox7.Text = CStr(r2) 'Занести результат в поле 7 CommandButton3.SetFocus 'Устанавливает фокус на кнопку очистки полей End Sub Private Sub CommandButton3_Click() TextBox1.Value = "" 'Очищает поле ввода 1 TextBox2.Value = "" 'Очищает поле ввода 2 TextBox3.Value = "" 'Очищает поле ввода 3 TextBox4.Value = "" 'Очищает поле ввода 4 TextBox6.Value = "" 'Очищает поле ввода 6 TextBox7.Value = "" 'Очищает поле ввода 7 TextBox1.SetFocus 'Устанавливает фокус в поле 1 End Sub Private Sub CommandButton2_Click() UserForm1.Hide 'Работает кнопка отмены End Sub Расчет числа витков и диаметра провода с изоляцией катушки индуктивности Задача №34 Определить число витков и диаметр провода с изоляцией для катушек индуктивности, обеспечивающих наименьшее активное сопротивление, которое достигается при отношении: a/D=0,4 (1) Для расчета воспользоваться формулами: L =0,01*D*w^2/(0,44+a/D) Dиз = a / w (2) 60 Где D- диаметр катушки индуктивности; а – длина намотки; w- число витков, Dиз – диаметр провода с изоляцией. Исходные данные: индуктивность L, значение диаметра D катушки изменяются в пределах от 1 до 10 см. Обозначения: В задаче Dиз D a w L В программе Di D a w L Пример решения для катушки индуктивностью 120 МГн и диаметра 40 мм Private Sub ListBox1_Click() Dim x As Integer ' задание типа переменной x x = ListBox1.Text ' присвоение значению переменной x значения из списка Select Case x ' Начало выбора переменной x Case "1" ' Выбор значения "1" TextBox2.Text = 10 ' Помешение в тестовое поле 2 значение = 10 Case "2" ' Выбор значения "2" TextBox2.Text = 20 ' Помешение в тестовое поле 2 значение = 20 Case "3" ' Выбор значения "3" TextBox2.Text = 30 ' Помешение в тестовое поле 2 значение = 30 Case "4" ' Выбор значения "4" TextBox2.Text = 40 ' Помешение в тестовое поле 2 значение = 40 Case "5" ' Выбор значения "5" TextBox2.Text = 50 ' Помешение в тестовое поле 2 значение = 50 Case "6" ' Выбор значения "6" TextBox2.Text = 60 ' Помешение в тестовое поле 2 значение = 60 Case "7" ' Выбор значения "7" TextBox2.Text = 70 ' Помешение в тестовое поле 2 значение = 70 Case "8" ' Выбор значения "8" TextBox2.Text = 80 ' Помешение в тестовое поле 2 значение = 80 Case "9" ' Выбор значения "9" TextBox2.Text = 90 ' Помешение в тестовое поле 2 значение = 90 Case "10" ' Выбор значения "10" TextBox2.Text = 100 ' Помешение в тестовое поле 2 значение = 100 End Select ' Конец выбора End Sub Private Sub CommandButton1_Click() ' Задание типа переменной Dim L As Single Dim a As Single Dim w As Single Dim D As Single 61 Dim Di As Single L = (TextBox1.Value) ' Задание значения переменной L = значению в текстовом поле 1 D = (TextBox2.Value) ' Задание значения переменной D = значению в текстовом поле 2 a = 0.4 * D ' Расчет длины намотки a по формуле w = Sqr(L * (0.44 + (a / D)) / (0.01 * D)) ' Расчет количества витков w по формуле Di = a / w ' Расчет диаметра провода с изоляцией Dиз по формуле w = Int(w + 0.5) ' Округление числа витков до ближайшего большего целого числа Label3.Caption = "Число витков катушки = " & w & " шт." ' Вывод значения числа витков Label4.Caption = "Диаметр провода с изоляцией = " & Di & " мм" ' Вывод значения диаметра провода с изоляцией End Sub Private Sub CommandButton2_Click() UserForm1.Hide End Sub Private Sub CommandButton3_Click() TextBox1.Text = "" ' Помешение в текстовое поле 1 значение пустоты TextBox2.Text = "" ' Помешение в текстовое поле 2 значение пустоты Label3.Caption = "" ' Присвоение надписи 3 имени " " Label4.Caption = "" ' Присвоение надписи 4 имени " " End Sub Private Sub UserForm_Initialize() ListBox1.List = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") ' Заполнение спика ' Задание всплывающих подсказок TextBox1.ControlTipText = "Введите значение индуктивности" ListBox1.ControlTipText = "Выберите значение диаметра катушки, см" TextBox2.ControlTipText = "Диаметр катушки, мм" TextBox2.Locked = True ' Блокировка окна ввода End Sub Программа решения системы 3-х линейных уравнений Программа решения системы линейных уравнений Введите коэффициенты уравнений a11 = 3 a12 = 7 a13 = 15 a21 = 1 a22 = -3 a23 = -10 a31 = -3 a32 = -4 a33 = -5 Корни уравнений системы x1 = 10 x2 = 38 x3 = -6,4 Проверка найденных корней уравнений системы x1 200 = 200 x2 -40 = -40 x3 -150 = -150 Программа завершена. Надеюсь, вы довольны результатом Private Sub CommandButton1_Click() Dim f(3) As Single Dim t As Integer Dim i As Integer Dim j As Integer Dim k As Integer b1 = b2 = b3 = 200 -40 -150 62 Dim l As Integer Dim a(3, 3) As Single Dim b(3) As Single Dim a1(3, 5) As Single Dim delta As Single Dim deltaS(3) As Single Dim x(3) As Single CommandButton1.Left = 96 UserForm2.Height = 217.5 'Лист1.Cells(1, 1).Value = " Программа решения системы линейных уравнений" 'Лист1.Cells(2, 1).Value = " Введите коэффициенты уравнений" 'For i = 1 To 3 ' For j = 1 To 3 ' Лист1.Cells(i + 2, 2 * j - 1).Value = "a" & i & j & " = " ' t=2*j-1 ' Next j 'Next i 'For i = 1 To 3 ' Лист1.Cells(i + 2, t + 2).Value = "b" & i & " = " 'Next i 'For i = 1 To 3 ' For j = 1 To 3 ' a(i, j) = Лист1.Cells(i + 2, 2 * j).Value ' t=2*j ' Next j 'N'ext i 'For i = 1 To 3 ' b(i) = Лист1.Cells(i + 2, t + 2).Value 'Next i 't = 0 'TextBox1.SetFocus If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Or _ TextBox5.Text = "" Or TextBox6.Text = "" Or TextBox7.Text = "" Or TextBox8.Text = "" Or _ TextBox9.Text = "" Or TextBox10.Text = "" Or TextBox11.Text = "" Or TextBox12.Text = "" Then TextBox1.SetFocus UserForm2.Hide TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" TextBox7.Text = "" TextBox8.Text = "" 63 TextBox9.Text = "" TextBox10.Text = "" TextBox11.Text = "" TextBox12.Text = "" Load UserForm5 UserForm5.Show End If a(1, 1) = CSng(TextBox1.Text) a(1, 2) = CSng(TextBox2.Text) a(1, 3) = CSng(TextBox3.Text) b(1) = CSng(TextBox4.Text) a(2, 1) = CSng(TextBox5.Text) a(2, 2) = CSng(TextBox6.Text) a(2, 3) = CSng(TextBox7.Text) b(2) = CSng(TextBox8.Text) a(3, 1) = CSng(TextBox9.Text) a(3, 2) = CSng(TextBox10.Text) a(3, 3) = CSng(TextBox11.Text) b(3) = CSng(TextBox12.Text) For l = 1 To 4 1: For i = 1 To 3 For j = 1 To 3 a1(i, j) = a(i, j) Next j Next i If l = 4 Then GoTo 2 For i = 1 To 3 a1(i, l) = b(i) Next i 2: For i = 1 To 3 For k = 1 To 2 a1(i, k + 3) = a1(i, k) Next k Next i If l = 4 Then delta = Опред(a1()): GoTo 3 Else deltaS(l) = Опред(a1()) 't = l 'If t = 3 Then t = t + 1: GoTo 1 Next l 3: If delta = 0 Then TextBox1.SetFocus UserForm2.Hide TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" 64 TextBox7.Text = "" TextBox8.Text = "" TextBox9.Text = "" TextBox10.Text = "" TextBox11.Text = "" TextBox12.Text = "" CommandButton1.Left = 96 UserForm2.Height = 217.5 Load UserForm4 UserForm4.Show Exit Sub End If For i = 1 To 3 x(i) = deltaS(i) / delta Next i Label10.Visible = True Label11.Visible = True Label12.Visible = True TextBox13.Visible = True TextBox14.Visible = True TextBox15.Visible = True TextBox13.Text = x(1) TextBox14.Text = x(2) TextBox15.Text = x(3) 'delta1 = a(2, 2) * b(1) - a(1, 2) * b(2) 'delta2 = a(1, 1) * b(2) - b(1) * a(2, 1) 'delta = a(1, 1) * a(2, 2) - a(1, 2) * a(2, 1) 'x(1) = delta1 / delta 'x(2) = delta2 / delta 'Лист1.Cells(6, 1).Value = " Корни уравнений системы" 'For i = 1 To 3 ' Лист1.Cells(7, 2 * i - 1).Value = "x" & i & " = " 'Next i 'For i = 1 To 3 ' Лист1.Cells(7, 2 * i).Formula = x(i) 'Next i 'Лист1.Cells(8, 1).Value = " Проверка найденных корней уравнений системы" 'f(1) = 0: f(2) = 0: f3 = 0 'For i = 1 To 3 ' For j = 1 To 3 ' f(i) = f(i) + a(i, j) * x(j) ' Next j 'Next i 'For i = 1 To 3 ' Лист1.Cells(8 + i, 1).Value = "x" & i ' Лист1.Cells(8 + i, 2).Value = f(i) & " = " & b(i) 'Next i 65 'Лист1.Cells(12, 1).Value = "Программа завершена. Надеюсь, вы довольны результатом." CommandButton2.Visible = True CommandButton3.Left = 96 CommandButton3.Top = 204 UserForm2.Height = 257.25 End Sub Private Function Опред(z() As Single) As Single Dim s1 As Single Dim s2 As Single Dim p As Single s1 = 0: s2 = 0 For l = 0 To 2 p1 = 1: p2 = 1 For j = 1 To 3 If (j + l) = 3 Then w = 3 Else w = (j + l) Mod 3 p1 = p1 * z(j, w) If (4 - j + l) = 3 Then q = 3 Else q = (4 - j + l) Mod 3 p2 = p2 * z(j, q) Next j s1 = s1 + p1 s2 = s2 + p2 Next l Опред = s1 - s2 End Function Private Sub CommandButton2_Click() Dim a(3, 3) As Single Dim b(3) As Single Dim x(3) As Single UserForm2.Height = 289.5 a(1, 1) = CSng(TextBox1.Text) a(1, 2) = CSng(TextBox2.Text) a(1, 3) = CSng(TextBox3.Text) b(1) = CSng(TextBox4.Text) a(2, 1) = CSng(TextBox5.Text) a(2, 2) = CSng(TextBox6.Text) a(2, 3) = CSng(TextBox7.Text) b(2) = CSng(TextBox8.Text) a(3, 1) = CSng(TextBox9.Text) a(3, 2) = CSng(TextBox10.Text) a(3, 3) = CSng(TextBox11.Text) b(3) = CSng(TextBox12.Text) x(1) = CSng(TextBox13.Text) x(2) = CSng(TextBox14.Text) x(3) = CSng(TextBox15.Text) 66 Label13.Caption = a(1, 1) & " * " & x(1) & " " & a(1, 2) & " * " & x(2) & " " & a(1, 3) & " * " & x(3) & " = " & a(1, 1) * x(1) + a(1, 2) * x(2) + a(1, 3) * x(3) Label14.Caption = a(2, 1) & " * " & x(1) & " " & a(2, 2) & " * " & x(2) & " " & a(2, 3) & " * " & x(3) & " = " & a(2, 1) * x(1) + a(2, 2) * x(2) + a(2, 3) * x(3) Label15.Caption = a(3, 1) & " * " & x(1) & " " & a(3, 2) & " * " & x(2) & " " & a(3, 3) & " * " & x(3) & " = " & a(3, 1) * x(1) + a(3, 2) * x(2) + a(3, 3) * x(3) Label16.Caption = b(1) Label17.Caption = b(2) Label18.Caption = b(3) CommandButton3.Visible = True UserForm2.Height = 337.5 CommandButton3.Left = 96 CommandButton3.Top = 282 CommandButton3.Caption = "Завершить" UserForm2.Top = 100 End Sub Private Sub CommandButton3_Click() UserForm2.Hide Load UserForm1 UserForm1.Show End Sub VBA – ПРИЛОЖЕНИЕ «МНОГОМЕРНЫЕ LП – ЧИСЛА» ДЛЯ СТОХАСТИЧЕСКИХ МЕТОДОВ ОПТИМИЗАЦИИ (МОДИФИКАЦИЯ МЕТОДА БОКСА) При решении задач оптимального управления достойное место могут занять стохастические методы многокритериального поиска. Стохастические методы или методы случайного поиска получили достаточно широкое распространение при построении оптимальных решений в различных приложениях. Это объясняется в первую очередь тем, что с ростом размерности задач резко снижается эффективность регулярных методов поиска (детерминированных), так называемое “проклятие размерности”. Во-вторых, зачастую информация об оптимизируемом объекте слишком мала для того, чтобы можно было применить детерминированные методы. Стохастические алгоритмы часто используют при поиске оптимального решения в системах управления, когда отклик можно получить только при задании управляющих воздействий на входах системы. В таких ситуациях стохастические алгоритмы могут оказаться значительно эффективнее детерминированных. Известно, что стохастические методы наиболее эффективны при решении задач оптимизации большой размерности или при поиске глобального экстремума многомерной функции. Принято считать, что преимущество таких методов проявляется с ростом размерности задач, так как вычислительные затраты в детерминированных методах поиска с ростом размерности растут быстрее, чем в стохастических алгоритмах [1—3]. 67 Стохастическими методами поиска считаются методы, использующие элемент случайности либо о сборе информации о целевой функции при пробных шагах, либо для улучшения значений функции при рабочем шаге. Случайным образом может выбираться направление спуска, длина шага, величина штрафа при нарушении ограничения. Практически в каждом стохастическом методе, так или иначе, используются случайные равномерно распределенные последовательности чисел. В действительности, даже в одномерном случае не вполне ясно, что значит «равномерно». Вопрос еще более усложнится, если точки придется размещать в кубе или n-мерном кубе (гиперкубе), не нарушая равномерности. В теории равномерно распределенных последовательностей исследуются бесконечные последовательности точек P0 , P1,..., Pi ,..., обладающие тем свойством, что группа точек P0 , P1,..., Pi ,...PN 1 при каждом N в каком-то смысле равномерно расположена в кубе. При увеличении N «плотность заполнения» увеличивается, а равномерность сохраняется. Среди известных в настоящее время равномерно распределенных последовательностей наилучшими характеристиками равномерности (с увеличением количества элементов) обладают LП последовательности. Нами рассматривается технология формирования комплекса точек, являющихся LП -числами, на примере реализации комплексного метода Бокса [4-5]. Комплексный метод Бокса представляет модификацию метода деформируемого многогранника и применяется для решения задач многомерной нелинейной оптимизации с ограничениями. Достоинствами комплексного метода Бокса являются его простота, удобство для программирования, надежность в работе. Метод на каждом шаге использует информацию только о значениях целевой функции и функций ограничений задачи. Все это обусловливает успешное применение его для решения различных задач нелинейного программирования. Ограничения могут быть заданы как явно, так и неявно. f x f x1,..., xn min l j x j u j , j 1,..., n g x b , i 1,..., m t i На каждой итерации необходимо выбрать 2n точек, равномерно распределенных в области, задаваемой ограничениями. Множество этих точек называется комплексом. В каждой точке комплекса вычисляется значение целевой функции. Начальная точка x 1 , удовлетворяющая всем ограничениям, предполагается известной. В классическом методе Бокса остальные точки выбираются случайным образом: xij l j r u j l j , j 1,..., n, i 2,...,2n , где r – случайная величина, равномерно распределенная в интервале (0,1). При формировании начального комплекса с использованием равномерно распределенной случайной величины возникает вопрос о «равномерности» в nмерном кубе. 68 Мы предлагаем для формирования точек комплекса использовать те точки в многомерном пространстве параметров, координаты которых представляют собой LП -числа. Точки Q0 , Q1 ,...,Qi ,... LП -последовательности легко вычисляются с помощью весьма простого алгоритма [6]. Этот алгоритм предполагает наличие таблицы так называемых направляющих точек V t Q2t 1 . Таблица, содержащая 20 направляющих точек, позволяет вычислить 220, т.е. более миллиона точек последовательности. Пусть V t V1t ,...,Vnt , так что V j t – это направляющие числа. Если в двоичной системе i em ...e2e1 , то координаты qi1 ,..., qin точки Q, вычисляются по формуле: qij e1V j1 e2V j2 ... emV jm , 1 j n. Так как все V j t – двоично-рациональные числа, то удобнее хранить таблицу числителей. Такие таблицы составлены для l t 20, l j 51 и позволяют легко вычислять точки Qi размерности n 51 в количестве N < 221. Быстрые программы для расчета точек Qi сравнительно просто составляются в кодах любой ЭВМ. Нами предлагается вычислять точки LП -последовательностей с помощью направляющих чисел, представляющих собой элементы матрицы переменной размерности. Матрица генерируется с помощью предлагаемого оригинального алгоритма на основе строковой константы длиной 1960 символов, что позволяет вычислить 220, т.е. более миллиона точек последовательности, при максимальной конструктивной размерности, равной 14. Алгоритм отличается от [6] тем, что не использует битовые операции. Для реализации генератора многомерных LП -чисел предлагается применение технологии VBA с использованием электронных таблиц Excel. Такой выбор обусловлен удобством дальнейшего использования полученных LП чисел. Во-первых, с их помощью можно реализовывать собственные алгоритмы поиска, считывая данные с листа электронной таблицы. Во-вторых, такое представление LП -чисел позволяет использовать их в стандартных функциях оптимизации Excel. Процедура расчета направляющих чисел записывается на VBA следующим образом: Sub lp_tau_15_Dim() a = "00001000010000100001000010000100001000010000100001" + _ "0000100001000010000100001" + _ "00001000030000500015000170005100085002550025700771" + _ "0128503855043690310721845" + _ "00001000010000700011000130006100085000790046500721" + _ "0082304091041250414128723" + _ "00001000030000700005000070004300049001470043901013" + _ "0072700987058890691516647" + _ 69 "00001000010000500003000150005100125001410017700759" + _ "0028503855043690310721845" + _ "00001000030000500015000170005100085002550025700771" + _ "0026701839069291624116565" + _ "00001000030000100001000090005900025000890032100835" + _ "0083304033039131164318777" + _ "00001000010000300007000310004700109001730018100949" + _ "0047102515062110214703169" + _ "00001000030000300009000090005700043000430022500113" + _ "0160100579017310119707241" + _ "00001000030000700013000030003500089000090023500929" + _ "0047103855043690314703169" For k = 1 To 10 For j = 1 To 15 b(k, j) = Mid$(a, 75 * (k - 1) + 5 * (j - 1) + 1, 5) n1(k, j) = Val(b(k, j)) Next j Next k End Sub Для создания последовательности LП -чисел используется процедура: Sub tau_coord(i, n) Dim m As Integer, j As Integer, k As Integer, t As Integer ' i номер точки ' n размерность m = 1 + Int(Log(i) / 0.693147) For j = 1 To n s=0 For k = 1 To m n2 = 0 For t = k To m bb = n1(j, t) n2 = n2 + Int(2 * fnd(i / 2 ^ t)) * Int(2 * fnd((bb / 2 ^ (t + 1 - k)))) Next t s = s + fnd(0.5 * n2) / (2 ^ (k - 1)) 70 Next k q(j) = s 'очередная точка с п координатами Next j ' пошаговый тест For tt = 1 To n For j2 = 1 To tt Worksheets(2).Cells(i, j2).Formula = q(j2) Next j2 Next tt End Sub Существует возможность переноса данных в какой-нибудь математический пакет, например Matlab, и также использовать в стандартных функциях пакета: %матрица опорных точек function Matr = form(i,j) M = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 3, 5, 15, 17, 51, 85, 255, 257, 771, 1285, 3855, 4369, 3107, 21845; 1, 1, 7, 11, 13, 61, 85, 79, 465, 721, 823, 4091, 4125, 4141, 28723; 1, 3, 7, 5, 7, 43, 49, 147, 439, 1013, 727, 987, 5889, 6915, 16647; 1, 1, 5, 3, 15, 51, 125, 141, 177, 759, 285, 3855, 4369, 3107, 21845; 1, 3, 5, 15, 17, 51, 85, 255, 257, 771, 267, 1839, 6929, 16241, 16565; 1, 3, 1, 1, 9, 59, 25, 89, 321, 835, 833, 4033, 3913, 11643, 18777; 1, 1, 3, 7, 31, 47, 109, 173, 181, 949, 471, 2515, 6211, 2147, 3169; 1, 3, 3, 9, 9, 57, 43, 43, 225, 113, 1601, 579, 1731, 1197, 7241; 1, 3, 7, 13, 3, 35, 89, 9, 235, 929, 471, 3855, 4369, 3147, 3169]; Matr = M(i,j); %получение i-й lpt-точки размерности n function q = tauc(i, n) m = 1 + floor(log(i) / 0.693147); for j=1:n s = 0; for k = 1:m n2 = 0; for t = k:m b = form(j,t); n2 = n2 + floor(2 * fnd(i / (2 ^ t))) * floor(2 * fnd((b / (2 ^ (t + 1 - k))))); end s = s + fnd(0.5 * n2)/(2 ^ (k - 1)); end q(j) = s; end %получение дробной части числа function f = fnd(x) f = x - floor(x); %получение p числа lpt-точек размерности n 71 function mq = lptau (p, n) for i = 1:p m = 1 + floor(log(i) / 0.693147); for j=1:n s = 0; for k = 1:m n2 = 0; for t = k:m b = form(j,t); n2 = n2 + floor(2 * fnd(i / (2 ^ t))) * floor(2 * fnd((b / (2 ^ (t + 1 - k))))); end s = s + fnd(0.5 * n2)/(2 ^ (k - 1)); end mq(i,j) = s; end end %получение дробной части числа function f = fnd(x) f = x - floor(x); LП -последовательности Так как описанные представляют собой детерминированные последовательности в единичном гиперкубе n-мерного пространства, то это позволяет нам решать задачи многопараметрической оптимизации [7]. И, наконец, основной методический аргумент предлагаемой технологии моделирования — существование возможности импорта LП—чисел из таблицы Excel в математические пакеты, например MatLab, MathCAD, Maple, и использования в стандартных функциях оптимизации [8]. Литература 1. Соболь И.М., Статников Р.Б. Выбор оптимальных параметров в задачах со многими критериями. – М.: Наука, 1981, 186с. 2. Соболь И.М., Статников Р.Б. Наилучшие решения – где их искать. – М.: Знание, 1982, 64с. 3. Банди Б. Методы оптимизации. – М.: Радио и связь, 1988, 128с. 4. Box M.J. A new method of constrained optimization and a comparison with other methods. Comp.J. 8 (1965), pp.42—52. 5. Richardson J.A., Kuester J.L. The Complex Method for Constained Optimization. – Communications of the ACM, 1973, V.16, N8, pp.487—489. 6. Соболь И.М. Точки, равномерно заполняющие многомерный куб. – М.: Знание, сер. Математика, кибернетика, 1985, N2, 32с 7. Клинаев Ю.В. Статистические модели ЛБВО – анализ, синтез, управление параметрами. – Саратов, СГТУ, 1998, 274с.. 8. Клинаев Ю.В., Кац А.М., Ставский Ю.В. Технологии VBA и MatLab в базовом курсе «Вычислительная математика». «ИТО—2002» – ХII Межд. конф.–выставка «Информационные технологии в образовании»: Сб.трудов уч.конф. Часть III.– М.:МИФИ, 2002.– с.32—33.