Сообщество Engee

Минимизация целевой функции

Автор
avatar-artpgchartpgch
Notebook
Простейший способ минимизации целевой функции

Данный алгоритм выполняет поиск значений переменных и , при которых целевая функция:

принимает минимальное значение в пределах

Импортируем необходимые пакеты:

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).")
Функция принимает минимальные значения при x = 3.0, y = 0.5.
Минимальное значение функции: 0.0.

Построим 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)

На графике видно, что целевая функция принимает значение при и .

Недостатком данного способа является необходимость вычислений и перебора всех значений целевой функции и как следствие высокая нагрузка на вычислительные мощности, особенно при высоких точностях вычислений.

Преимуществом является простота программной реализации метода.