gnuplotのfit関数を使ったフィッティング～その１～

Matplotlibに続いて、gnuplotで3dのグラフを書く際のカスタマイズ方法とフィッティングについてです。
最近z=f(x,y)の形のデータプロットをフィッティングする必要に迫られ、Pythonのcurve_fitを使うか、Maximaを使うか迷ったのですが、gnuplotの勉強も兼ねてgnuplotを選択しました。
その中で役立ったリンク先を含めて以下ご紹介します。
いざ書き始めると長くなってしまったので、２、３回に分けたいと思います。

#gnuplotのフィッティングデモ
まずなにはともあれ以下のリンクを見てみてください。

[gnuplotデモリンク](http://gnuplot.sourceforge.net/demo/fit.html)

私が目を惹かれたのは、上記リンクの"the scattered points, fitted curve"です。
フィッティングする曲面と、実験データの関係が一目で見やすく、設定も簡単そうだと感じました。
<img width="415" alt="gnuplotDemo.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/9db463c3-0ec0-5476-521d-45feecc89ed2.png">


このリンクの以下のコマンドから、fit関数と、.datファイルを使えば、与えたデータに近い関数パラメーターをフィッティングで求められるのだろうということは分かりましたが、肝心のデータの与え方が分かりませんでした。

```gnuplot:Demo
fit h(x,y) 'hemisphr.dat' using 1:2:3 via r, x0, y0, z0
set title 'the scattered points, fitted curve'
splot 'hemisphr.dat' using 1:2:3, h(x,y)
````

以下、フィッティングにたどり着くまで少し時間がかかりますが、データの設定の仕方→Plotの仕方→フィッティングの仕方の流れでご紹介します。
（私が辿った経緯のままで綺麗にまとまっておらずすみません）

#gnuplotの実験データの与え方
2dplotのデータの与え方については参考になるサイトが多くあったのですが、3dplot用のデータはなかなか見つけられませんでした。
最終的に私が参照したのは以下のサイトになります。
[gnuplot実験データ](http://psy.swansea.ac.uk/staff/carter/gnuplot/gnuplot_3d.htm)
上記リンクの"Table3:XYZ Format"でデータを与えることにしました。
具体的には以下のような形でデータを与えています。
　　x　　　　　　y　　　　　　z 
0.249402768	2.759875858	7.67911652
0.982415773	4.417552518	20.47991102
1.70574064	2.403588299	8.68678793
2.424333709	2.615355897	12.71748044
3.273830003	3.587892959	23.59093886
3.107301641	3.458134639	21.61401877
2.554010616	1.34484958	8.331590679
　　・　　　　　　・　　　　　・
　　・　　　　　　・　　　　　・
　　・　　　　　　・　　　　　・

こちらの数値はz=x^2+y^2に対して、x,yを0～5の乱数で与えただけのデータなので、特に意味ある数値ではないですが、試しに上記のデータを実験データとしてプロットしてみます。

#実験データの読み込み→プロット
.datファイルではなく、テキスト形式で読み込みます。
Cドライブの直下に"Fitting"フォルダを作成し、その下に、Sample3D.txtファイルを作成して、上記のような適当なXYZデータを書き込みます。

まずは、なにも装飾なしで、読み込んだデータをただプロットします。

```gnuplot:3Dplot
splot 'C:\Fitting\Sample3D.txt'
```
ちょっと味気ないですが、ひとまず下図のように3Dplotができることは確認できました。
<img width="393" alt="Simple3dplot.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/1699fe8a-c506-1699-4ed0-f028dc4e4784.png">


#曲面の生成について
上記のようにひとまずプロットはできたものの、プロットの点数が思ったより少なかったので、どうも曲面のイメージが掴みにくいですね。フィッティングをするためにはデータの大まかな動きを把握しておいた方が良いので、プロットではなく、曲面の形が見たいところです。
調べた所、離散的に分布しているデータから滑らかな曲面を生成するコマンドがあるようなので、各コマンドで曲面を生成してみます。
コマンドは"qnorm"と"splines"の２種類があるようです。（以下のリンクを参照しました）

[gnuplot曲面](http://www.phy.ntnu.edu.tw/demolab/html.php?html=doc/gnuplot-doc/html/dgrid3d)

## qnorm
qnormは、格子点と入力データの距離に応じた重みづけを行うようです。
ひとまずなにも考えず上記リンクのコマンドを真似てプロットしてみます。

```gnuplot:qnorm
set dgrid3d 20,20 qnorm 1
splot 'C:\\Fitting\\Sample3D.txt' with lines
```

<img width="404" alt="Simpleqnorm.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/e0699cab-5442-1206-868a-5fdd90f346e6.png">

今回x^2+y^2に近いプロットをしているはずなので、どうも本来の曲面を表現できているとは言い難いですね。
確かに乱数分の誤差を与えたので、データにばらつきはありますが、たかだか大きくて1E-7程度なので、もう少し滑らかな曲線を作ってくれるかと思ったのですが、、、。
qnormを使ったグラフ作成については、[HP](http://www.symphonic-net.com/cesolution/gnuplot.html)でもう少し詳細に記載していきたいと思います。

## splines

```gnuplot:spline
set dgrid3d splines
splot 'C:\\Fitting\\Sample3D.txt' with lines
```

やはりsplineが一番きれいですね。
<img width="410" alt="SplinePNG.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/5b348ea1-6b14-cf81-e47e-d058b5c185c3.png">

ひとまず今回はここで、一区切りとして、次回グラフのまとめ方と、フィッティングをまとめていきたいと思います。