これは、非線形の制約付き最適化カテゴリにうまく適合します。ここでは fmincon が役立ちます。Fmincon を使用すると、解ベクトルに上限と下限を設定しながら、非線形システムを解くことができます。問題は、解決策が出発点に依存することです...したがって、解決策がどこにあるべきかについて良い推測があれば、それは大いに役立ちます。
この類推は、ソルバーに目の前の山の頂上に登るように依頼したり、ランダムな出発点からバックパッキングしてヨーロッパで最も高い山を見つけるように依頼したりするようなものです。近くにいるときは、「上に」歩くことができます。
とにかく、これを行う方法は次のとおりです。
function test()
a = .05
b = 88
xo = [100 100 100 100 a b]
options = optimset('MaxFunEvals',1E5, ...
'MaxIter', 1E5, ...
'TolFun', 1E-32, ...
'TolX', 1E-32, ...
'TolCon', 1E-32);
x = fmincon(@(X) Ftest(X), xo, [], [], [], [], ...
[-inf -inf -inf -inf a b], [], [], options)
Final_Project_2(x)
function F = Ftest(x)
F = norm(Final_Project_2(x))
end
function F = Final_Project_2(x)
F = [(1/x(1)) + (1/x(2))- (2/(7*x(3)));
(x(3)+2*x(4))*(15*x(2))/((x(1)+x(2))*x(3)-0.7/x(3))-14;
(x(3)*((0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)))/(x(3)+(0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)) - x(5);
((0.576*x(2)*x(3)/(x(1)+x(2))*x(3)) - 0.27*x(4)/x(3))-x(6)];
end
end
×=
258.0438 84.3372 24.9576 34.8035 3.0926 88.0000
ans =
0.0043 -0.0000
0.0001 -0.0000
ソルバーが b の下限にどのように衝突したかに注目してください。最初の推測で遊んでみて、より良い分を見つけることができるかどうかを確認できます。解決策は保証されていません...
これは楽しい部分です。もっと上手にできます。システムは単なるコスト関数ではなく、 x の制約です。同様のコードですが、その情報を使用すると、強力なソリューションが得られます。
function test()
a = .05
b = 88
xo = [100 100 100 100 a b]
options = optimset('MaxFunEvals',1E4, ...
'MaxIter', 1E4, ...
'TolFun', 1E-32, ...
'TolX', 1E-32, ...
'TolCon', 1E-32);
x = fmincon(@(X) Ftest(X), xo, [], [], [], [], ...
[-inf -inf -inf -inf a b], [], @(X) xcon(X), options)
Final_Project_2(x)
function F = Ftest(x)
F = norm(Final_Project_2(x))
end
function [c,ceq] = xcon(x)
c = []
ceq = [(1/x(1)) + (1/x(2))- (2/(7*x(3)));
(x(3)+2*x(4))*(15*x(2))/((x(1)+x(2))*x(3)-0.7/x(3))-14;
(x(3)*((0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)))/(x(3)+(0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)) - x(5);
((0.576*x(2)*x(3)/(x(1)+x(2))*x(3)) - 0.27*x(4)/x(3))-x(6);
(x(3)*((0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)))/(x(3)+(0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)) - x(5);
((0.576*x(2)*x(3)/(x(1)+x(2))*x(3)) - 0.27*x(4)/x(3))-x(6)];
end
function F = Final_Project_2(x)
F = [(1/x(1)) + (1/x(2))- (2/(7*x(3)));
(x(3)+2*x(4))*(15*x(2))/((x(1)+x(2))*x(3)-0.7/x(3))-14;
(x(3)*((0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)))/(x(3)+(0.576*x(2)/(x(1)+x(2))*x(3)) - 0.27/x(3)) - x(5);
((0.576*x(2)*x(3)/(x(1)+x(2))*x(3)) - 0.27*x(4)/x(3))-x(6)];
end
end
×=
360.8859 132.2940 27.6590 34.2885 3.6943 117.8688
ans =
1.0e-14 *
-0.0002 0.1776 -0.0444 0
2 番目の方法は、バックパッカーに使用する一連のトレイル/道路を提供するものと考えてください。R^6 空間を介してソルバーをガイドします。