ハンドルクラス内のfmincon使用に関する不具合
조회 수: 3 (최근 30일)
이전 댓글 표시
現在、私は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
채택된 답변
Atsushi Ueno
2022년 6월 14일
【回答】無名関数@(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 日本(問題の構造体を使用する)
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 インストールとライセンスの紹介에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!