ガウスニュートン法による関数フィッティング

いくつかのデータ群から関数フィッティングを行う手法はいくつかあり、ガウスニュートン法はその一つである。

今回は調べていたら偶然見つけたガウスニュートン法のMATLABスクリプトを修正、関数化して使いやすくてみた。

プログラムは以下の通り。

function [serror,yfit]=gaussnewton(xdata,ydata,error)
syms a b x y

f = a*x/(x+b);
R = y - f;
S = R^2;

Jacob=subs(jacobian(R,[a,b]),{x,y},{xdata,ydata}); 
v = [0.9;0.2];
iteration = 100;
SEF = subs(S,{x,y},{xdata,ydata});

r = subs(R,{x,y},{xdata,ydata});

for i = 1:iteration
   J = double(subs(Jacob,[a,b],v'));
   df = double(subs(r,[a,b],v'));
   delta = - ( J.' * J )\J.' *  df;
   v = v + delta;

   SOE = double(subs(SEF,[a,b],v'));
   temp = SOE.' * SOE;
   if i==1
       serror=temp;
   else
       serror=horzcat(serror,temp);
   end
   clear temp
   if error>=serror(i)
       break;
   end
end

yfit = double( subs(subs(f,x,xdata),[a,b],v') );

end

トラブルがあれば今後修正する。

参考資料

  1. MATLABで非線形最小二乗フィッティングする手順メモ
  2. ガウス・ニュートン法

コメント

タイトルとURLをコピーしました