ハンドルクラス内のfmincon使用に関する不具合
11 views (last 30 days)
Show older comments
現在、私はMATLABで強化学習を行っています。ハンドルクラスを作成し、その中のfunction内でfminconを使用していますが値0しか返さない状態になって困っています。以下にコードを示します。
x;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = [];
x0 = [0,0];
obj.fun = @(x)100*(obj.x(2)-obj.x(1)^2)^2 + (1-obj.x(1))^2;
obj.x = fmincon(obj.fun,obj.x0,obj.A,obj.b,obj.Aeq,obj.beq,obj.lb,obj.ub,obj.nonlcon)
私は最初のコードの一部であるobj.fun = @(x)をobj.fun = @(obj.x)と記述していないことが原因なのではないかと考えているのですが、この記述方法ではドットを使用しているので実行時に「演算子の使用が無効です。」とエラーが出てきてしまいます。fminconが0しか返さない原因はこのobj.funの記述が悪いからでしょうか?また、その場合、どのようにすればハンドルクラス内でobj.funを定義できるのでしょうか?
0 Comments
Accepted Answer
Atsushi Ueno
on 14 Jun 2022
【回答】無名関数@(x)の引数はxです。引数xを使わなければ、引数xを渡した意味がありません。
obj.fun = @(x)100*(obj.x(2)-obj.x(1)^2)^2 + (1-obj.x(1))^2; % 【誤】
obj.fun = @(x)100*( x(2)- x(1)^2)^2 + (1- x(1))^2; % 【正】
>最初のコードの一部であるobj.fun = @(x)をobj.fun = @(obj.x)と記述していないことが原因なのではないかと...
⇒@(x)のxは無名関数の引数です。同関数内でobj.xやobj.x0にアクセスすると無名関数を使う意味がなくなります。
>fminconが0しか返さない原因はこのobj.funの記述が悪いからでしょうか?
はい。obj.funの記述を上記のように変更すべきである事は間違いありません。obj.xはfmincon関数の答えを格納する為のメモリなのに、最小化関数obj.funの要素としてアクセスしてしまっています。仮にobj.xに何らかの値が入っていればそれを使った答えが再びobj.xに代入される事になるでしょう。ただ「fminconが0しか返さない」問題を再現しようとしてもエラーが出てしまい再現できませんでした。何か背景が異なるのだと思います。
fminconの例にある非線形制約関数 unitdisk (添付ファイル) も追加し、出力が同ドキュメントと同じになる事を確認しました。
obj = MyHandleClass();
obj.fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
obj.nonlcon = @unitdisk;
obj.x0 = [0,0];
obj.x = fmincon(obj.fun,obj.x0,obj.A,obj.b,obj.Aeq,obj.beq,obj.lb,obj.ub,obj.nonlcon)
制約付き非線形多変数関数の最小値を求める - MATLAB fmincon - MathWorks 日本(問題の構造体を使用する)
More Answers (0)
See Also
Categories
Find more on インストールとライセンスの紹介 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!