Документация Engee
Notebook

Кратчайшее расстояние от точки до плоскости

В этом примере продемонстрировано, как сформулировать и решить задачу оптимизации методом наименьших квадратов (МНК), используя проблемно-ориентированный подход.

Мы воспользуемся функциями библиотеки JuMP.jl для формулировки оптимизационной задачи и библиотекой нелинейной оптимизации Ipopt.jl.

Установка библиотек

Если в вашем окружении не установлена последняя версия пакета JuMP, раскомментируйте и запустите ячейку ниже:

In [ ]:
#Pkg.add("JuMP");

Для запуска новой версии библиотеки после завершения установки нажмите на кнопку «Личный кабинет»:

screenshot_20240710_134852.png Затем нажмите на кнопку «Стоп»:

screenshot_20240710_2.png

Перезапустите сессию нажатием кнопки «Старт Engee»:

screenshot_20240710_135431.png

Описание задачи

Цель задачи – найти кратчайшее расстояние от начала координат (точки $(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:

In [ ]:
using JuMP;

Подключите библиотеку нелинейного решателя Ipopt:

In [ ]:
using Ipopt;

Создание задачи оптимизации

Создайте оптимизационную задачу с помощью функции Model() и укажите название решателя в скобках:

In [ ]:
plane_prob = Model(Ipopt.Optimizer)
Out[0]:
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: EMPTY_OPTIMIZER
Solver name: Ipopt

Создайте переменную x, содержащую три значения, – $x_1$, $x_2$ и $x_3$:

In [ ]:
@variable(plane_prob, x[1:3]);

Создайте целевую функцию для решения задачи минимизации:

In [ ]:
@objective(plane_prob, Min, sum(x[i]^2 for i in 1:3))
Out[0]:
$$ x_{1}^2 + x_{2}^2 + x_{3}^2 $$

Задайте условие решения оптимизационной задачи $x_1+2x_2+4x_3=7$. Вы можете воспользоваться функцией dot() для скалярного произведения двух векторов или записать уравнение традиционным способом:

In [ ]:
v = [1, 2, 4]
@constraint(plane_prob, dot(x, v) == 7)
Out[0]:
$$ x_{1} + 2 x_{2} + 4 x_{3} = 7.0 $$

Формулировка задачи завершена. Вы можете просмотреть и проверить задачу:

In [ ]:
println(plane_prob)
Min x[1]² + x[2]² + x[3]²
Subject to
 x[1] + 2 x[2] + 4 x[3] = 7.0

Решение задачи

Решите оптимизационную задачу:

In [ ]:
optimize!(plane_prob)
This is Ipopt version 3.14.13, running with linear solver MUMPS 5.6.1.

Number of nonzeros in equality constraint Jacobian...:        3
Number of nonzeros in inequality constraint Jacobian.:        0
Number of nonzeros in Lagrangian Hessian.............:        3

Total number of variables............................:        3
                     variables with only lower bounds:        0
                variables with lower and upper bounds:        0
                     variables with only upper bounds:        0
Total number of equality constraints.................:        1
Total number of inequality constraints...............:        0
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  0.0000000e+00 7.00e+00 0.00e+00  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  2.3333333e+00 0.00e+00 0.00e+00  -1.0 1.33e+00    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 1

                                   (scaled)                 (unscaled)
Objective...............:   2.3333333333333330e+00    2.3333333333333330e+00
Dual infeasibility......:   0.0000000000000000e+00    0.0000000000000000e+00
Constraint violation....:   0.0000000000000000e+00    0.0000000000000000e+00
Variable bound violation:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   0.0000000000000000e+00    0.0000000000000000e+00
Overall NLP error.......:   0.0000000000000000e+00    0.0000000000000000e+00


Number of objective function evaluations             = 2
Number of objective gradient evaluations             = 2
Number of equality constraint evaluations            = 2
Number of inequality constraint evaluations          = 0
Number of equality constraint Jacobian evaluations   = 1
Number of inequality constraint Jacobian evaluations = 0
Number of Lagrangian Hessian evaluations             = 1
Total seconds in IPOPT                               = 0.001

EXIT: Optimal Solution Found.

Сохраните значения x в переменной:

In [ ]:
sol = value.(x);

Выведите результаты оптимизации. Вы можете использовать функцию round, чтобы округлить избыточно точные значения:

In [ ]:
println("Оптимизированные значения x = ", round.(sol, digits=4))
Оптимизированные значения x = [0.3333, 0.6667, 1.3333]

Таким образом, кратчайшее расстояние от точки $(0,0,0)$ до плоскости $x_1+2x_2+4x_3=7$ находится в точке $(0.3333, 0.6667, 1.3333)$. Теперь мы можем рассчитать расстояние между двумя точками:

In [ ]:
origin = [0, 0, 0]
distance = sqrt(sum((sol .- origin).^2))
println("Расстояние ", round(distance, digits=4))
Расстояние 1.5275

Вы нашли кратчайшее расстояние между началом координат и заданной плоскостью.

Заключение

В данном примере мы решили задачу по поиску кратчайшего расстояния от начала координат (точки $(0,0,0)$) до плоскости $x_1+2x_2+4x_3=7$ с помощью метода наименьших квадратов (МНК), используя проблемно-ориентированный подход.