FreeMat v4.0 日本語ドキュメント
最適化およびカーブフィッティング

 

ドキュメント目次

  • interplin1  線形1次元補間
  • fitfun  関数へのフィッティング
  • gausfit  ガウシアンカーブフィッティング
  • poly  多項式係数の解をカバー
  • polyder  多項式係数差分を求める
  • polyfit  多項式近似
  • polyint  多項式係数のインテグレーション
  • polyval  所定のポイントで多項式近似を評価する
  • roots  多項式の解を求める

---------------------------------------------------------------------------------------------
interplin1 線形1次元補間

  [構文]

 yi = interplin1(x1,y1,xi)
 xiは単調増加データ。データx1,y1に対してxiの座標で補間します。
 xiがx1の範囲を超える場合は、Nanを返します。 

 yi = interplin1(x1,y1,xi,extrapflag)
 上記の文法でNanを返す場合は、引数にextrapflagを設定し
 回避できます。またextrapflagには以下の文字列を設定します。
 * 'nan' - 外挿値はnanが設定されます。
* 'zero' - 外挿値は0が設定されます。
* 'endpoint' - 外挿値は最後の値が設定されます。
* 'extrap' - 線形外挿されます。

  [例] まず、補間される波形を作成します。
--> x = linspace(-pi*7/8,pi*7/8,15);
--> y = cos(x);
--> plot(x,y,'ro');

その後interplin1にて補間します。
--> xi = linspace(-4,4,100);
--> yi_nan = interplin1(x,y,xi,'nan');
--> yi_zero = interplin1(x,y,xi,'zero');
--> yi_endpoint = interplin1(x,y,xi,'endpoint');
--> yi_extrap = interplin1(x,y,xi,'extrap');
-->plot(x,y,'ro',xi,yi_nan,'g-x',...
xi,yi_zero,'g-x',xi,yi_endpoint,'g-x',xi,yi_extrap,'g-x');

補間の様子を以下に示します。


---------------------------------------------------------------------------------------------
fitfun 関数へのフィッティング
  [構文]
 [xopt,yopt] = fitfun(fcn,xinit,y,weights,tol,params...)
最小二乗とLevenberg-Marquardtアルゴリズムを使用しています。
fcn	---> フィットさせる関数の名前
xinit	---> フィットさせる(推測する)最初の値
y	---> 右側
weights	---> 
tol	---> カバーする許容値
params	---> 下記のように関数fcnの他の入力引数

----------------------------------------------------------
gausfit ガウシアンカーブフィッティング

  [構文]
 [mu,sigma,dc,gain,yhat] = gausfit(t,y,w,mug,sigmag,dcg,gaing)
(入力引数) 
* t - 独立なデータ(時間軸データtなど)
* y - 独立なデータ (f(t)など)
 ※以下はオプション
 * mug - 平均値(mean)の初期推定値
* sigmag - 標準偏差の初期推定値
* dcg - DC値の初期推定値
* gaing - gainの初期推定値

内部の処理は、
yhat=gain*exp((t-mu).^2/(2*sigma^2))+dc
である。
(出力引数) 
 * sigma - フィットさせた後の標準偏差
* dc - フィットさせた後のDC値
* gain - ガウシアンフィットのゲイン値
* yhat - フィット後の出力

補間される値は非線形なので最初の補間する値がポイントとなります。そのため
mug, sigmag, dcg, gaingを使用してそれぞれの最初の値を与えます。また
与えられない最初の値はシンプルなアルゴリズムを使用して推測されます。 
特にDC値はyの最小値、gain値はyの範囲から推測されます。また平均値、
準偏差はyの1次・2次オーダーのモーメントにより推測されます。

  [例] 

--> t = linspace(-pi,pi);
--> y = cos(t);
--> [mu,sigma,dc,gain,yhat] = gausfit(t,y);
--> plot(t,y,'rx',t,yhat,'g-'); 

---------------------------------------------------------------------------------------------
poly 多項式係数の解をカバー

  [構文]

 p = poly(r)
 解rを持つ多項式の係数pを出力する。
 
 ※ GPLライセンス:Paulo Xavierさんより提供されている。 

    [例]
(1)

--> r=[1 1]

r =

 1 1

--> a=poly(r)

a =

  1 -2  1

(2)

--> A = [1,2,3;4,5,6;7,8,0]

A =

1 2 3
4 5 6
7 8 0

--> p = poly(A)

p =

1.0000 -6.0000 -72.0000 -27.0000

--> r = roots(p)

r =

12.1229
-5.7345
-0.3884


---------------------------------------------------------------------------------------------
polyder 多項式係数差分を求める

  [構文]

 pder = polyder(p)
 差動多項式pから多項式係数を求める。
 
 convp1p2der = polyder(p1,p2)
 conv(p1,p2)から多項式係数を求める。
 
 [nder,dder] = polyder(n,d)
 n/dから多項式係数を求める。nderは分子係数、dderは分母
係数。 
 
 ※ GPLライセンス:Paulo Xavierさんより提供されている。 
 
  [例] 


????


---------------------------------------------------------------------------------------------
polyfit 多項式近似

  [構文]
 p = polyfit(x,y,n)
 x,yはデータ、nは次元。
 
 ※ 関数内部では、Vandermonde行列を使用し処理する。

  [例] 

--> x = linspace(0,1,20);
--> y = sin(2*pi*x);
--> plot(x,y,'r-')

 

 次に3次の多項式をsin波に適用させ、ployvalを使用してプロットします。

--> p = polyfit(x,y,3)

p =

21.9170 -32.8756 11.1897 -0.1156

--> f = polyval(p,x);
--> plot(x,y,'r-',x,f,'ko');

 近似精度を高めるため、次数を増やします。 

--> p = polyfit(x,y,11)

p =

1.0e+02 *

Columns 1 to 10

0.1246 -0.6855 1.3006 -0.7109 -0.3828 -0.1412 0.8510 -0.0056 -0.4129 -0.0000

Columns 11 to 12

0.0628 -0.0000

--> f = polyval(p,x);
--> plot(x,y,'r-',x,f,'ko');


---------------------------------------------------------------------------------------------
polyint 多項式係数のインテグレーション
多項式pから得られる多項式係数を返します。
  [構文]

 pint = polyint(p,k)
 pint = polyint(p);	※k=0

  [例] 
--> polyint([2,3,4])

ans = 
    0.6667    1.5000    4.0000         0 

And

--> polyint([2,3,4],5)

ans = 
    0.6667    1.5000    4.0000    5.0000 





-----------------------------------------------------------
polyval 所定のポイントで多項式近似を評価する

  [構文]
 y = polyval(p,x)

  [例] 
--> p = [1 0 0 0]

p =
1 0 0 0

--> x = linspace(-1,1);
--> y = polyval(p,x);
--> plot(x,y,'r-')





---------------------------------------------------------------------------------------------
roots 多項式の解を求める

  [構文]
   z = roots(p)


  [例] 
多項式 の解法は、

--> roots([1 -6 -72 -27])

ans = 
   12.1229 
   -5.7345 
   -0.3884