点到平面的最短距离¶
本例演示了如何使用基于问题的方法提出并解决最小二乘法(LSM)优化问题。
安装库¶
如果您的环境中没有安装最新版本的JuMP
软件包,请取消注释并运行下面的方框:
Pkg.add(["Ipopt", "JuMP"])
#Pkg.add("JuMP");
要在安装完成后启动新版本的程序库,请单击 "我的账户 "按钮:
然后点击 "停止 "按钮:
按下 "Start 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))
您已经找到了原点与给定平面之间的最短距离。
结论¶
在本例中,我们采用基于问题的方法,用最小二乘法(LSM)解决了从坐标原点(点$(0,0,0)$ )到平面$x_1+2x_2+4x_3=7$ 的最短距离问题。