## 非線形制約

いくつかの最適化ソルバーは、`fmincon``fseminf``fgoalattain``fminimax`Global Optimization Toolbox ソルバー `ga` (Global Optimization Toolbox)`gamultiobj` (Global Optimization Toolbox)`patternsearch` (Global Optimization Toolbox)`paretosearch` (Global Optimization Toolbox)`GlobalSearch` (Global Optimization Toolbox)`MultiStart` (Global Optimization Toolbox) などの非線形制約を受け入れます。非線形制約では、平滑化関数で表すことができる任意の領域に解を制限できます。

メモ

たとえば、以下の不等式を制約として考えてみましょう。

`$\begin{array}{c}\frac{{x}_{1}^{2}}{9}+\frac{{x}_{2}^{2}}{4}\le 1,\\ {x}_{2}\ge {x}_{1}^{2}-1.\end{array}$`

これらの制約を関数ファイルに以下のように記述します。

```function [c,ceq] = ellipseparabola(x) c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = []; end```
`ellipseparabola` は、非線形等式制約関数 `ceq` に空のエントリ `[]` を返します。また 2 番目の不等式は ≤ 0 の形式に書き換えられます。

```fun = @(x)exp(x(1) + 2*x(2)); nonlcon = @ellipseparabola; x0 = [0 0]; A = []; % No other constraints b = []; Aeq = []; beq = []; lb = []; ub = []; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)```
```Local 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. x = -0.2500 -0.9375```

### 制約関数に勾配を含める

c と ceq の勾配を指定すると、ソルバーの実行速度が上がり、より信頼できる結果が得られます。

```function [c,ceq,gradc,gradceq] = ellipseparabola(x) c(1) = x(1)^2/9 + x(2)^2/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = []; if nargout > 2 gradc = [2*x(1)/9, 2*x(1); ... x(2)/2, -1]; gradceq = []; end```

`gradc`i, j = [∂`c`(j)/∂xi].

ソルバーに非線形制約の勾配を使用させるには、`optimoptions` を使用してこれらが存在することを指示します。

`options = optimoptions(@fmincon,'SpecifyConstraintGradient',true);`

オプション構造体を必ずソルバーに渡すようにしてください。

```[x,fval] = fmincon(@myobj,x0,A,b,Aeq,beq,lb,ub, ... @ellipseparabola,options)```

Symbolic Math Toolbox™ のライセンスをおもちの場合は、勾配とヘッシアンを自動的に計算することができます (Symbolic Math Toolbox を使用した勾配とヘッシアンの計算を参照)。

### 非線形制約の無名関数

`$\begin{array}{c}\frac{{x}_{1}^{2}}{9}+\frac{{x}_{2}^{2}}{4}\le 1,\\ {x}_{2}\ge {x}_{1}^{2}-1.\end{array}$`

${x}_{2}=\mathrm{tanh}\left({x}_{1}\right)$.

```c = @(x)[x(1)^2/9 + x(2)^2/4 - 1; x(1)^2 - x(2) - 1]; ceq = @(x)tanh(x(1)) - x(2); nonlinfcn = @(x)deal(c(x),ceq(x));```

```obj = @(x)cosh(x(1))+sinh(x(2)); opts = optimoptions(@fmincon,'Algorithm','sqp'); z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)```
```Local 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. ```
```z = 2×1 -0.6530 -0.5737 ```

`[cout,ceqout] = nonlinfcn(z)`
```cout = 2×1 -0.8704 0 ```
```ceqout = 0 ```

`z` は、`ConstraintTolerance` 制約の既定の許容誤差、`1e-6` 内ですべての制約を満たしています。

## 参考

| | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox) | (Global Optimization Toolbox)