Main Content

平面までの最短距離

問題

この例では、問題ベースのアプローチを使用して線形最小二乗問題を定式化する方法を示します。

問題は、原点 (点 [0,0,0]) から平面 x1+2x2+4x3=7 までの最短距離を求めることです。つまり、この問題は、x1+2x2+4x3=7 という制約の下で f(x)=x12+x22+x32 を最小化することです。関数 f(x) は "目的関数" と呼ばれ、x1+2x2+4x3=7"等式制約" と呼ばれます。より複雑な問題では、他の等式制約、不等式制約、上限または下限の制約を含むことがあります。

問題の設定

問題ベースのアプローチを使用してこの問題を定式化するため、pointtoplane という名前の最適化問題オブジェクトを作成します。

pointtoplane = optimproblem;

3 つの成分がある連続変数として問題変数 x を作成します。

x = optimvar('x',3);

目的関数を作成し、pointtoplaneObjective プロパティに含めます。

obj = sum(x.^2);
pointtoplane.Objective = obj;

線形制約を作成し、問題に含めます。

v = [1,2,4];
pointtoplane.Constraints = dot(x,v) == 7;

問題の定式化は完了です。エラーをチェックするため、問題を確認します。

show(pointtoplane)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       sum(x.^2)


	subject to :
       x(1) + 2*x(2) + 4*x(3) == 7
     

定式化は正しく行われています。

問題を解く

solve を呼び出して問題を解きます。

[sol,fval,exitflag,output] = solve(pointtoplane);
Solving problem using lsqlin.

Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
disp(sol.x)
    0.3333
    0.6667
    1.3333

解の検証

解を検証するため、問題を解析的に解きます。非ゼロの t について、ベクトル t*[1,2,4] = t*v が平面 x1+2x2+4x3=7 に対して垂直になることを思い出してください。したがって、方程式 dot(t*v,v) = 7 を満たす t の値について、解の点 xoptt*v になります。

t = 7/dot(v,v)
t = 0.3333
xopt = t*v
xopt = 1×3

    0.3333    0.6667    1.3333

ベクトル xopt は、solve で求めた点 sol.x と確かに等しくなっています。

関連するトピック