gnuplotによる数値計算 

 gnuplotでは与えられた関数やテキストファイル(txt,csvなど)に基づいてグラフを描くだけでなく,非線型方程式の解法,数値積分,微分方程式の解法,最小二乗法などの数値計算を行い,その結果を表示することもできます。 do for 文, while 文が使用可能になって非常に便利になりました。
非線型方程式の例として f(x)=2x-x2=0 のグラフを描きニュートン法によって解を求めています。まずグラフを描くとx軸との交点が3つあります。x=2,4という解は自明ですね。3番目の解は初期値を-1(交点近くの適当な値),収束判定定数を0.001として繰り返しの結果 x= -0.76684 という解が得られます。グラフィック画面にテキストを書くには数値 a の書式を指定して set label sprintf("a = %10.8f",a) at 座標 font フォント 色 のようにします。数値の場合は gprintf でも可能。
数値積分の例としては f(x)=4/(1+x2) を 0 から 1 までステップ 0.01 のシンプソンの積分公式で計算しました。解析値 π となるもので非常にいい精度です。図はすべてクリック拡大します。
回帰分析の例としては 20行2列から成るテキストファイル ex.txt の数値を f(x)=a/(1+b*x2) で近似するものです。結果は a=2.06,b=1.11 と求まります。図において+印はex.txtのデータ値で,実線は y=f(x)です。
code result
####方程式###
 f(x)=2**x-x**2
unset label
set label 5 center at screen 0.5,0.9 "2^x - x^2 = 0" 
   font "Times,18" textcolor lt 1

clear
set yrange[-5:10]
set grid;unset key
plot f(x) with lines  

####初期値###
x1=-1
set label 1 sprintf("initial = %10.5f",x1) at graph 0.02,0.12 
   font "Times,14" textcolor lt 3

####ニュートン法###
h=0.005
i=1
while(abs(f(x1))>0.00001){
 gx1=(f(x1+h)-f(x1-h))/(2*h)
 x2=x1-f(x1)/gx1
 i=i+1;x1=x2
}
set label sprintf("answer = %10.7f",x2) at graph 0.02,0.05 
   font "Times,14" textcolor lt 3
#set arrow from x2,-2  to x2,0 lw 2 lt 3
replot
クリック拡大
#定積分
#関数の定義とプロット
f(x)=4/(1+x*x)
set grid;unset key
set xrange[-5:5];set yrange[-2:5]
plot f(x)
#積分の上限下限ステップ
a=0;b=1
h=0.01
n=floor((b-a)/h)
s=0
#シンプソンの公式
do for [i=0:n-2] {
  xi=a+h*i   
  if (i%2==0){ s=s+f(xi)+4*f(xi+h)+f(xi+2*h)}
} 
s=s*h/3.
set label sprintf("Integral [a:b] = %10.8f",s) at graph 0.3,0.05 
   font "Times,14" textcolor lt 3
set label 5 center at screen 0.5,0.9 "f(x)=4/(1+x*x)" 
   font "Times,14" textcolor lt 1
set arrow from b,0 to b,f(b) lw 2 lt 3 nohead
set arrow from a,0 to a,f(a) lw 2 lt 3 nohead
replot
pause -1
  
クリック拡大
 
#非線形回帰分析 
#近似する関数
f(x)=a/(1+b*x*x) 
fit f(x) "data/ex.txt" using 1:2 via a,b
plot  "data/ex.txt" using 1:2 with points,f(x) with lines
pause -1

==結果==
Final set of parameters   a= 2.06521 +/- 0.05472 (2.65%)   b= 1.11246 +/- 0.0822 (7.389%)
クリック拡大