0

fmincon オプティマイザーで非線形制約を課そうとしています。問題は、パラメーターの 1 つが負の場合にのみ、非線形制約が関連する必要があることです。コードは次のようになります。

function [c, ceq] = confun_Model11(param)
% Nonlinear inequality constraints: c(x)<=0
if  param(6)<0
    c = (-4)*param(5)*param(7) + param(6)^2+eps;
else
    c = [];
end

%Nonlinear equality constraints: ceq(x)=0
ceq = [];
end

問題は、たとえば、診断オプションを使用すると、Matlab が非線形制約がないと言うことです。

Constraints
 Number of nonlinear inequality constraints: 0
 Number of nonlinear equality constraints:   0

また、最適化の検索中に、この非線形制約に違反します。非線形条件付き制約を適切に定義していない場合、誰かが指摘できますか?

4

1 に答える 1

2

実行時に変更される制約の数に fmincon が対応できるかどうかはわかりません。

制約をアクティブにしたくない場合は、コード評価内で制約をオフにしようとするよりも、制約 c(x)<=0 を満たす値を返す方がよいでしょう。

function [c, ceq] = confun_Model11(param)
% Nonlinear inequality constraints: c(x)<=0
c = (-4)*param(5)*param(7) + param(6)^2+eps;

% Ensure constraint isn't violated if param(6) is positive
if param(6) >= 0
    c = -abs(c);
end

%Nonlinear equality constraints: ceq(x)=0
ceq = [];
end

パラメータに対する他の(線形?)制約によっては、制約関数が不連続になる可能性があるためです。一般に、制約関数が連続的で滑らかであれば、最適化に成功する可能性がはるかに高くなります。そのため、制約関数を「if」ステートメントまたは「abs」関数を使用せずに何かに再定義してみてください...つまり. 制約を適用したい場所でゼロを横切るもの。

この目標を達成するために、複数の非線形制約を使用することが理にかなっている場合があります。

于 2013-04-02T04:45:14.110 に答える