タイトルで説明されているこの問題を解決する必要があります。アイデアは、2 つの非線形不等式制約と共に、4 つの変数に 2 つの非線形方程式があるということです。この状況で必要なすべてを設定できるため、関数fminconがおそらく最良のアプローチであることがわかりました(そうでない場合はお知らせください)。ただし、実装段階で疑問があります。以下に完全なケースを公開します。実際の形にするのに十分単純だと思います。
私が最初にしたことは、別のファイルで目的関数を定義することでした。
function fcns=eqns(x,phi_b,theta_b,l_1,l_2)
fcns=[sin(theta_b)*(x(1)*x(4)-x(2)*x(3))+x(4)*sqrt(x(1)^2+x(2)^2-l_2^2)-x(2)*sqrt(x(3)^2+x(4)^2-l_1^2);
cos(theta_b)*sin(phi_b)*(x(1)*x(4)-x(2)*x(3))+x(3)*sqrt(x(1)^2+x(2)^2-l_2^2)-x(1)*sqrt(x(3)^2+x(4)^2-l_1^2)];
次に、不等式制約も別のファイルにあります。
function [c,ceq]=nlinconst(x,phi_b,theta_b,l_1,l_2)
c=[-x(1)^2-x(2)^2+l_2^2; -x(3)^2-x(4)^2+l_1^2];
ceq=[];
次のステップは、スクリプトで実際に実行することでした。以下では、目的関数には追加の変数が必要なので、無名関数を定義しましたf。次の行では、制約 (無名関数) に対して同じことを行いました。その後、それはかなり自明です。
f=@(x)norm(eqns(x,phi_b,theta_b,l_1,l_2));
f_c=@(x)nlinconst(x,phi_b,theta_b,l_1,l_2);
x_0=[15 14 16 18],
LB=0.5*[l_2 l_2 l_1 l_1];
UB=1.5*[l_2 l_2 l_1 l_1];
[res,fval]=fmincon(f,x_0,[],[],[],[],LB,UB,f_c),
最初に気付くのは、元の目的関数を を使用して変換する必要があったことです。normそうしないと、"User supplied objective function must return a scalar value."エラー メッセージが表示されます。それで、これは最善のアプローチですか、それともこれを回避するためのより良い方法はありますか?
これは実際には機能しますが、私の調査によると (実際には stackoverflow からの 1 つの質問です!)、目的関数から等式制約を定義すると、最適化手順を導くことができます。これは理にかなっています。制約ファイルで次のコードを使用してそれを行いました。
ceq=eqns(x,phi_b,theta_b,l_1,l_2);
dealその後、関数を使用して、スクリプト内で制約を定義できることがわかりました。
c=@(x)[-x(1)^2-x(2)^2+l_2^2; -x(3)^2-x(4)^2+l_1^2];
f_c=@(x)deal(c(x),f(x));
それで、それを行うための最良の方法はどれですか?制約ファイルを介して、またはこの機能を使用して?
さらに、MATLAB のドキュメントで、これらの場合に設定することが提案されていることがわかりました。
f=@(x)0;
元の目的関数は既に等式制約にあるためです。ただし、最適化は明らかに最初の推測を超えません (コスト値はすべてのソリューションで既に 0 です) 。 mathworks.com/help/optim/ug/nonlinear-systems-with-constraints.html )。
長い文章で申し訳ありませんが、まだ理解していない場合は詳しく説明したいと思います... ありがとうございます!