lsqnonlinで同じ評価関数・変数・入力に対して,普通に使用した場合と分割して使用した場合とで結果が違うのは何故なのでしょうか.
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
lsqnonlinにおいて,評価関数として次の関数
fuction values = funcOpt(num,r,X,Y)
values = [];
for i=1:1:num
Y_ = Y(3*i-2+3*i,:); % 3*1ベクトル
r_ = r(7*i-6+7*i);
A = setA(r_(1:2)); % 3*3行列
B = setB(r_(3:4)); % 3*4行列
value = reshape(Y_-A*B*X,[],1);
values = [values;value];
end
end
を用いるとき,変数と入力の組み合わせnum個に対して,
下記のコードA・コードBのように使用しました.
% コードA:普通に使用した場合
myfun = ...
@(r) ( funcOpt(num,r,X,Y) );
[optr,optresnorm,optresidual,optexitflag,optoutput] ...
= lsqnonlin(myfun,rini,rlow,rup,optoptions);
%コードB:分割して使用した場合
r_ =[];
optresidual_ =[];
for i=1:1:num
Y_ = Y(3*i-2+3*i,:);
rini_ = rini(7*i-6+7*i);
rlow_ = rlow(7*i-6+7*i);
rup_ = rup(7*i-6+7*i);
%%%
myfun = ...
@(r) ( funcOpt(1,r,X,Y) );
[optr,optresnorm,optresidual,optexitflag,optoutput] ...
= lsqnonlin(myfun,rini_,rlow_,rup_,optoptions);
%%%
r_ = [r_;optr];
optresidual_ = [optresidual_;optresidual];
end
optr = r_;
optresidual = optresidual_;
このとき,optrとoptresidualがコードA・コードBで違いました.
そして,optresidualのノルムはコードBの方が小さかったです.
これは何故なのでしょうか.
恐らく,optoptionsの設定によってoptrとoptresidualが限りなく近くなるように設定できると思うのですが,
どうするのがよいのでしょうか.
ご回答よろしくお願い致します.
0 Kommentare
Akzeptierte Antwort
michio
am 14 Okt. 2019
問題設定を完全には把握できていませんが、
case1:num 個分のデータ組み合わせすべてに対して、まとめて非線形最小二乗問題を解く
case2:小分けにされた1つ1つに対して、個別に非線形最小二乗問題を解く
の2つだと、そもそも解いている問題が別のものになっており、後者の方がノルム(誤差)は小さくなりそうな気がしました。直感的にですが。num 個の組み合わせ、それぞれが同じデータであれば case 1 と case 2 は同値・・でしょうか?
3 Kommentare
michio
am 15 Okt. 2019
原理的に違う問題、、というところが引っかかってよい方法が思いつきません。。申し訳ありません。
できれば case 1 の方でまとめて実行したいということかと想像していますが、その理由としては、、そちらの方が実行速度が速いからでしょうか?
num の値の大きさにもよりますが、
r_ = [r_;optr];
optresidual_ = [optresidual_;optresidual];
で、r_, optresidual_ 両変数の配列サイズが動的に変わっています。ここを事前確保しておくだけで処理速度は向上すると思います。
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu 非線形最適化 finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!