lsqnonlinで同じ評価関数・変数・入力に対して,普通に使用した場合と分割して使用した場合とで結果が違うのは何故なのでしょうか.
Afficher commentaires plus anciens
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が限りなく近くなるように設定できると思うのですが,
どうするのがよいのでしょうか.
ご回答よろしくお願い致します.
Réponse acceptée
Plus de réponses (0)
Catégories
En savoir plus sur 数学 dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
