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