Engee 文档
Notebook

点到平面的最短距离

此示例演示如何使用面向问题的方法来制定和解决最小二乘优化问题。

我们将使用[跳转的功能。jl]图书馆(https://github.com/jump-dev/JuMP ...jl)用于优化问题的制定和非线性优化的库Ipopt.jl

安装库

如果您的环境中未安装最新版本的软件包 JuMP,取消注释并运行下面的单元格:

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

要在安装完成后启动新版本的库,请单击"个人帐户"按钮:

Screenshot_20240710_134852.png 然后点击"停止"按钮: Screenshot_20240710_2.png

通过单击"Start Engee"按钮重新启动会话:

Screenshot_20240710_135431.png

任务说明

任务的目标是找到距离原点的最短距离(点 )到飞机上 .

因此,任务是最小化功能:

受限制:

功能 是目标函数,并且 是相等约束。

更复杂的任务可能包含其他相等约束、不等式约束和上限或下限约束。

连接图书馆

连接库 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 包含三个值, – , :

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 $$

设置求解优化问题的条件 . 您可以使用该功能 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]

因此,从点的最短距离是 上飞机 位于点 . 现在我们可以计算两点之间的距离。:

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

您已找到原点和指定平面之间的最短距离。

结论

在这个例子中,我们解决了从原点(点)找到最短距离的问题 )到飞机上 使用最小二乘法(OLS),使用面向问题的方法。