Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Реализация в Excel ⇐ ПредыдущаяСтр 2 из 2 Создаем таблицу с переменными a, b, константой V и формулами: h = V /(ab); S = 2(аb + ah + bh). Таким образом, имеем задачу безусловной оптимизации с двумя переменными a, b и целевой функцией S. Задаемся начальным приближением a, b. Поочередно варьируем с постоянным малым шагом значениями первой и второй переменными, на каждом шаге находим минимальное значение S. Для быстрого поиска минимального значения целевой функции по строкам в столбце «Е3:Е15» помещаем в ячейку «Е16» функцию «=МИН(E3:E15)» (рисунок 3), а в столбце «F3:F15» – функцию от «ЕСЛИ(E3=E$16;"<=";"")» до =ЕСЛИ(E15=E$16;"<=";"").
Рисунок 3 – Экранная форма задачи в Excel Значение переменной, соответствующей минимуму S, устанавливаем во всех ячейках данного столбца и переходим к варьированию другой переменной. Затем возвращаемся к первой переменной и так до тех пор, пока не перестанут меняться оптимальные значения переменных a, b и соответственно целевая функция S. Увеличение точности вычислений достигается уменьшением шага варьирования переменных. В случае многих переменных, решение подобным образом является крайне трудоемкой задачей. В этом случае можно создать следующий макрос, написанный в редакторе Visual Basic:
Sub Optim() Dim shag() As Double, amin() As Double, amax() As Double Dim k As Integer, funk As Double, stroka As Integer, stroka0 As Integer Dim stolbec As Integer, z As String, S As String, p As Double Dim strokak As Integer, N As Integer, f0 As Double, f00 As Double Dim pmin As Double, pmax As Double, i As Integer ReDim shag(20), amin(20), amax(20) N = 2 'Число переменных stroka0 = 3 'Начальная строка strokak = 15 'Конечная строка shag(1) = 0.001 'Шаг первой переменной shag(2) = 0.001 'Шаг второй переменной amin(1) = 0.001 'Минимальное значение первой переменной amin(2) = 0.001 'Минимальное значение второй переменной amax(1) = 10 'Максимальное значение первой переменной amax(2) = 10 'Максимальное значение второй переменной f0 = Worksheets(1).Range("E8").Value 'Средняя ячейка столбца целевой функции Do f00 = f0 For stolbec = 1 To N z = Chr(stolbec + 64) k = (strokak - stroka0) / 2 S = z & Mid(Str(k), 2) p = Worksheets(1).Range(S).Value pmin = p - shag(stolbec) * k If pmin < amin(stolbec) Then pmin = amin(stolbec) pmax = pmin + shag(stolbec) * (strokak - stroka0) If pmax > amax(stolbec) Then pmax = amax(stolbec) p = pmax - shag(stolbec) * (strokak - stroka0) For stroka = stroka0 To strokak S = z & Mid(Str(stroka), 2) Worksheets(1).Range(S).Value = p p = p + shag(stolbec) Next stroka f0 = 1E+15 For stroka = stroka0 To strokak S = "E" & Mid(Str(stroka), 2) 'Столбец целевой функции funk = Worksheets(1).Range(S).Value If funk < f0 Then f0 = funk: i = stroka Else Exit For Next stroka For stroka = stroka0 To strokak S = z & Mid(Str(stroka), 2) Worksheets(1).Range(S).Value = Worksheets(1).Range(z & Mid(Str(i), 2)).Value Next stroka Next stolbec Loop Until f00 = f0 End Sub
Вначале следует задаться относительно большим шагом переменных, а затем уменьшать его, увеличивая тем самым точность вычисления минимума целевой функции.
|