Напомним, что алгоритмы SOS-оптимизации умеют решать следующую задачу.
Вход: многочлен линейный относительно и линейная функция
Выход: Максимальное значение среди наборов чисел , для которых - SOS относительно .
Пример: Чему равно наибольшее значение , при котором является суммой квадратов?
using SumOfSquares
using DynamicPolynomials
using Mosek
using MosekTools
using SemialgebraicSets
opt = optimizer_with_attributes(Mosek.Optimizer, "QUIET" => true);
model = SOSModel(opt)
@polyvar z
S = @set -1 <= z && z <= 1 # живем на [-1, 1]
d = 10
@variable(model, a[0:d])
p = sum([a[i] * z^i for i in 0:d])
@objective(model, Max, a[d]) # функция L, которую оптимизируем
@constraint(model, p <= 1, domain = S)
@constraint(model, p >= -1, domain = S)
optimize!(model)
value(p)
round(value(p), digits = 3)
opt = optimizer_with_attributes(Mosek.Optimizer, "QUIET" => true);
model = SOSModel(opt)
@polyvar z
S = @set (z - 2) * (z - 1) * (z + 1) * (z + 2) <= 0 # NEW
# живем [-2, -1] в [1, 2]
d = 4
@variable(model, a[0:d])
p = sum([a[i] * z^i for i in 0:d])
@objective(model, Max, a[d])
@constraint(model, p <= 1, domain = S)
@constraint(model, p >= -1, domain = S)
optimize!(model)
value(p)
round(value(p), digits = 5)
Видно, что здесь приятные рациональные числа! Для других значений d всё менее очевидно - надо раскладывать в цепные дроби и подбирать. Если есть интерес - смело пробуйте