-1

MATLAB で fmincon を使用しようとしていますが、何が問題なのかよくわかりません。私の機能は次のとおりです。

function f = myfun(x4)

f = (C * x4 - d) .^ 2;

end

そして私はそれを次のように呼びます:

lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@myfun,x0,[],[],[],[],lb,[]);

しかし、私がそれを実行すると、

??? ==> mtimes の使用エラー 内部行列の次元は一致する必要があります。

ただし、確認したところ、C は 112x3、d は 112x1 で、x4 はまったく初期化されていません。これが解決しようとしているからです。「ダミー」x4 を作成すると、 (C * x4 - d) .^ 2 を問題なく実行できます。

何かご意見は?これは lsqr または lsqlin を lb 0 で使用するのと同じであり、これは lsqnonneg にも相当しますが、それがポイントです。これらのメソッドの結果をさまざまな方法で検証しようとしています。

4

2 に答える 2

2

ここにはいくつかの問題があります。

まず、最適化されていないパラメーターを渡す方法を学ぶ必要があります。関数 myfun は、ネストされた関数でない限り、関数には独自のワークスペースがあるため、C と d を認識できません。

次に、制約に従って線形最小二乗を計算しているため、二乗和を返す必要があります。fmincon にはスカラー目的関数が必要です。ベクトルを返すときに何をすべきかを理解していません。

個人的には、明示的な m-file を定義することさえ気にしません。関数ハンドルを使用してこれを定義します。したがって、おそらく次の目標を試すことができます。

myfun = @(x4) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(myfun,x0,[],[],[],[],lb,[]);

関数ハンドルは C と d の値を見ることができるため、ハンドルが作成されると、これらの変数は関数ハンドル ワークスペース内に保持されます。

二乗和を計算するためにノルムを使用していることに注意してください。実際、ここでは二乗和の sqrt です。しかし、平方和が最小化される場合、その数の平方根も最小化されます。標準で少しきれいに見えます。

もう 1 つのオプションは、C と d の値を明示的に渡す myfun のバージョンを使用することです。ここでは、myfun 引数を指定してから、基本的に myfun の関数ハンドル ラッパーを作成しました。myfun の m ファイル バージョンでも同じことができます。

myfun = @(x4,C,d) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@(x4) myfun(x4,C,d),x0,[],[],[],[],lb,[]);
于 2013-07-19T23:48:06.950 に答える
0

渡す関数はfmincon 、スカラー値を返す必要があります。関数では、112 行 1 列のベクトルを返します。変える必要があるのか​​もしれません

f = (C * x4 - d) .^ 2;

f = sum((C * x4 - d) .^ 2);
于 2013-07-19T23:13:35.410 に答える