Минимизация целевой функции
Простейший способ минимизации целевой функции
Данный алгоритм выполняет поиск значений переменных и , при которых целевая функция:
принимает минимальное значение в пределах
Импортируем необходимые пакеты:
Pkg.add("Plots")
using DSP, Plots
plotlyjs()
Инициализируем исходные данные:
fs = 10.0^-1 # точность вычислений
lb = -4.5 # нижняя граница
ub = 4.5 # верхняя граница
dxy = lb:fs:ub
l = length(dxy)
Инициализируем целевую функцию:
# целевая функция
OFun = function(Var)
(1.5 - Var[1] + Var[1] * Var[2])^2 + (2.25 - Var[1] + Var[1] * Var[2]^2)^2 + (2.625 - Var[1] + Var[1] * Var[2]^3)^2
end
Создадим координатную сетку:
# координатная сетка
x = repeat(dxy', length(dxy), 1)
y = repeat(dxy, 1, length(dxy))
Используя вложенный цикл, вычислим все значения функции в точках dxy:
# вычисление значений функции
f = zeros(l, l)
for p in 1:l
for q in 1:l
f[p, q] = OFun((x[p, q], y[p, q]))
end
end
Используя условие и вложенный цикл, найдём минимум целевой функции:
# Поиск минимума
fmin = f[1, 1]
xmin = x[1, 1]
ymin = y[1, 1]
for p in 1:l
for q in 1:l
if f[p, q] < fmin
fmin = f[p, q]
xmin = x[p, q]
ymin = y[p, q]
end
end
end
Выведем результаты вычислений:
println("Функция принимает минимальные значения при x = $(xmin), y = $(ymin).")
println("Минимальное значение функции: $(fmin).")
Построим 3D-график целевой функции и отобразим точку минимума:
surface(x, y, f, xlabel="x", ylabel="y", zlabel="f(x,y)", title="Целевая функция", legend=false, colorscale=:Jet, opacity=0.7)
scatter!([xmin], [ymin], [fmin], markersize=3, markercolor=:red)
На графике видно, что целевая функция принимает значение при и .
Недостатком данного способа является необходимость вычислений и перебора всех значений целевой функции и как следствие высокая нагрузка на вычислительные мощности, особенно при высоких точностях вычислений.
Преимуществом является простота программной реализации метода.