lsqnonlinで同じ評価関数・変数・入力に対して,普通に使用した場合と分割して使用した場合とで結果が違うのは何故なのでしょうか.
3 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
michio
2019-10-14
問題設定を完全には把握できていませんが、
case1:num 個分のデータ組み合わせすべてに対して、まとめて非線形最小二乗問題を解く
case2:小分けにされた1つ1つに対して、個別に非線形最小二乗問題を解く
の2つだと、そもそも解いている問題が別のものになっており、後者の方がノルム(誤差)は小さくなりそうな気がしました。直感的にですが。num 個の組み合わせ、それぞれが同じデータであれば case 1 と case 2 は同値・・でしょうか?
3 个评论
michio
2019-10-15
原理的に違う問題、、というところが引っかかってよい方法が思いつきません。。申し訳ありません。
できれば case 1 の方でまとめて実行したいということかと想像していますが、その理由としては、、そちらの方が実行速度が速いからでしょうか?
num の値の大きさにもよりますが、
r_ = [r_;optr];
optresidual_ = [optresidual_;optresidual];
で、r_, optresidual_ 両変数の配列サイズが動的に変わっています。ここを事前確保しておくだけで処理速度は向上すると思います。
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 非線形最適化 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!