3

fminsearch私の日常業務の中で、私は;を利用して特定の機能を最大化する必要があります。コードは次のとおりです。

clc
 clear all
 close all

 f = @(x,c,k) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2;
 c = 10.1;
 k = 2.3;
 X = fminsearch(@(x) f(x,c,k),[4,10,20]);

期待どおりに正常に動作しますが、問題は発生していません。次のように、xを特定の制限内にバインドする必要があります。

 4 < x(1) < 5
 10 < x(2) < 15
20 < x(3) < 30

適切な結果を得るには、残念ながら手渡すことができない最適化ツールボックスを使用する必要があります。

fminsearchだけを使って同じ分析を行う方法はありますか?

4

3 に答える 3

3

fminsearch を直接使用するわけではありませんが、ファイル交換からfminsearchbndをダウンロードする場合は、はい。fminsearchbndは、fminsearch のオーバーレイとして、一般目的関数の範囲制約付き最小化を行います。fminsearch を呼び出して、問題に境界を適用します。

本質的には、目的関数が制約付きの問題を解決しているかのように見えるように、問題を変換するという考え方です。完全に透明です。関数、パラメーター空間の開始点、および下限と上限のセットを指定してfminsearchbndを呼び出します。

たとえば、関数 rosenbrock を最小化すると、fminsearch によって [1,1] で最小値が返されます。しかし、変数ごとに 2 の問題に純粋な下限を適用すると、fminsearchbnd は [2,4] で制限付きの解を見つけます。

rosen = @(x) (1-x(1)).^2 + 105*(x(2)-x(1).^2).^2;

fminsearch(rosen,[3 3])     % unconstrained
ans =
   1.0000    1.0000

fminsearchbnd(rosen,[3 3],[2 2],[])     % constrained
ans =
   2.0000    4.0000

変数に制約がない場合は、対応する境界として -inf または inf を指定します。

fminsearchbnd(rosen,[3 3],[-inf 2],[])
ans =
       1.4137            2
于 2012-05-02T12:13:32.697 に答える
2

をバインドする最も単純な方法は、範囲内にないものにx大きなペナルティを与えることです。x

例えば:

   function res = f(x,c,k)
        if x(1)>5 || x(1)<4
            penalty = 1000000000000;
        else
            penalty = 0;
        end
        res = penalty - (x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2;
   end

よりスムーズな方法でペナルティを与えることで、このアプローチを改善できます。

于 2012-05-02T12:07:44.193 に答える
2

Andrey は正しい考えを持っており、ペナルティを与えるよりスムーズな方法は難しくありません。方程式に距離を追加するだけです。

匿名関数を使い続けるには:

f = @(x,c,k, Xmin, Xmax) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2 ...
+ (x< Xmin)*(Xmin' - x' + 10000) + (x>Xmax)*(x' - Xmax' + 10000) ;
于 2012-05-02T12:29:35.810 に答える