Кратчайшее расстояние от точки до плоскости¶
В этом примере продемонстрировано, как сформулировать и решить задачу оптимизации методом наименьших квадратов (МНК), используя проблемно-ориентированный подход.
Установка библиотек¶
Если в вашем окружении не установлена последняя версия пакета JuMP
, раскомментируйте и запустите ячейку ниже:
#Pkg.add("JuMP");
Для запуска новой версии библиотеки после завершения установки нажмите на кнопку «Личный кабинет»:
Затем нажмите на кнопку «Стоп»:
Перезапустите сессию нажатием кнопки «Старт Engee»:
Описание задачи¶
Цель задачи – найти кратчайшее расстояние от начала координат (точки $(0,0,0)$) до плоскости $x_1+2x_2+4x_3=7$.
Таким образом, задача состоит в минимизации функции: $$f(x)=x_1^2+x_2^2+x_3^2$$
При условии ограничения: $$x_1+2x_2+4x_3=7$$
Функция $f(x)$ является целевой функцией, а $x_1+2x_2+4x_3=7$ является ограничением равенства.
Более сложные задачи могут содержать другие ограничения равенства, ограничения неравенства, а также ограничения верхней или нижней границы.
Подключение библиотек¶
Подключите библиотеку JuMP
:
using JuMP;
Подключите библиотеку нелинейного решателя Ipopt
:
using Ipopt;
Создание задачи оптимизации¶
Создайте оптимизационную задачу с помощью функции Model()
и укажите название решателя в скобках:
plane_prob = Model(Ipopt.Optimizer)
Создайте переменную x
, содержащую три значения, – $x_1$, $x_2$ и $x_3$:
@variable(plane_prob, x[1:3]);
Создайте целевую функцию для решения задачи минимизации:
@objective(plane_prob, Min, sum(x[i]^2 for i in 1:3))
Задайте условие решения оптимизационной задачи $x_1+2x_2+4x_3=7$. Вы можете воспользоваться функцией dot()
для скалярного произведения двух векторов или записать уравнение традиционным способом:
v = [1, 2, 4]
@constraint(plane_prob, dot(x, v) == 7)
Формулировка задачи завершена. Вы можете просмотреть и проверить задачу:
println(plane_prob)
Решение задачи¶
Решите оптимизационную задачу:
optimize!(plane_prob)
Сохраните значения x
в переменной:
sol = value.(x);
Выведите результаты оптимизации. Вы можете использовать функцию round
, чтобы округлить избыточно точные значения:
println("Оптимизированные значения x = ", round.(sol, digits=4))
Таким образом, кратчайшее расстояние от точки $(0,0,0)$ до плоскости $x_1+2x_2+4x_3=7$ находится в точке $(0.3333, 0.6667, 1.3333)$. Теперь мы можем рассчитать расстояние между двумя точками:
origin = [0, 0, 0]
distance = sqrt(sum((sol .- origin).^2))
println("Расстояние ", round(distance, digits=4))
Вы нашли кратчайшее расстояние между началом координат и заданной плоскостью.
Заключение¶
В данном примере мы решили задачу по поиску кратчайшего расстояния от начала координат (точки $(0,0,0)$) до плоскости $x_1+2x_2+4x_3=7$ с помощью метода наименьших квадратов (МНК), используя проблемно-ориентированный подход.