经过前几节进行一些简单的2D绘图后,今天让我们来了解一下如何用gnuplot进行数据拟合,有时候我们需要对实验数据进行拟合去求得某些信息。万事从简单开始做起,先来讲讲线性拟合,用到的数据列于linearfit.dat文件中,如:
利用gnuplot作图可得(略过作图步骤,此处可以忽略,只是为了先让大家看看文件中的数据是怎么分布的):
线型A呈直线,对其进行线性拟合可输入如下命令:
> f(x)=a*x+b #定义一元一次函数f(x)
> fit f(x) "linearfit.dat" using 1:2 via a, b 利用fit函数对第一二列数据进行拟合,变量为a和b
按回车键后目录中为出现一个fit.log文件,而且终端也会显示出相关信息,包括变量a, b的值和误差,并没有发现R2的值,拟合结果为f(x)=2.00333x+0.986667,如:
那么,要如何得到R2的值呢,首先来推导一波,
忘记刚开始的拟合,重新输入以下命令可以得到R2,即COD系数(coefficient of determination), 如:
> mean(x)=yfit #yfit为拟合所得y值
> fit mean(x) 'linearfit.dat' u 1:2 via yfit
> A=FIT_WSSR #求总体方差
> f(x)=a*x+b
> fit f(x) 'linearfit.dat' u 1:2 via a, b
> B=FIT_WSSR #求残差平方和
> print "R^2=", 1-B/A #求R2
可得:a=2.00333, b=0.986667, R2的值为0.9992,与下图中的从excel拟合得来的方程和R2一致,完美。
如果你想在图中显示出方程以及R2的值,那就在之前的命令后面加上以下命令,即:
> plot a*x+b w line lw 2 title "A-fit", "linearfit.dat" using 1:2 w point pt 4 lc black lw 2 title "A"
> set label "f(x)=2.00333x+0.986667" at 5,14 #关键词label可以在图中加入字符串或文本
> set label "R^2=0.9992" at 5,13 #将字符串置于(5,13)处
> set key center at 1,16 #后面是对图例的例常美化
> set key reverse
> set key Left
> set key spacing 1.5
> set key samplen 4
可得:
线型B用二元二次函数来拟合,详细过程解释此处就不赘述了,如:
> mean(x)=yfit
> fit mean(x) 'linearfit.dat' u 1:3 via yfit
> A=FIT_WSSR
> f(x)=a*x**2+b*x+c
> fit f(x) 'linearfit.dat' u 1:3 via a, b, c
> B=FIT_WSSR
> print "R^2=", 1-B/A
> plot a*x**2+b*x+c w line lw 2 title "B-fit", "linearfit.dat" using 1:3 w point pt 4 lc black lw 2 title "B"
> set label "f(x)=1.02781x^2+2.76582x+1.06182" at 5,70
> set label "R^2=0.9999" at 5,60
> set key center at 1,80
> set key reverse
> set key Left
> set key spacing 1.5
> set key samplen 4
可得:
同样地,得到了与excel拟合同样的数据,完美+1。
好了,今天介绍到这。记得把模板保存下来哈,下次拟合就方便多了。下回预告:阶梯图的绘制。
领取专属 10元无门槛券
私享最新 技术干货