仓库源文站点原文


layout: post title: gnuplot动画 categories:


2015-01-18 14:29:06

利用gnuplot的gif终端可以制作简单的动画, 制作时可以使用reread命令, 像马欢的博文中介绍的那样. 更简单的方法是使用do for命令.

下面是指数函数和高斯函数卷积的动画, 具体的理论请参看以前的博文.

<pre class="line-numbers" data-start="0"><code class="language-bash"># Language: gPL A=1; B=2 a=1; b=50; k=0.1 f(x)=A*exp(-a*x)*(x>0? 1:0) g(x,t)=B*exp(-b*(t-x)**2) h(x)=.5*A*B*sqrt(pi/b)*exp(-a*(x-.25*a/b))*erfc(-sqrt(b)*x+.5*a/sqrt(b)) set tit"Convolution of Exponential and Gaussian Function" set xl"t/{/symbolpi t}"; set yl"Value" set xr [-2:3] do for [t=-1/k:2/k] { #set object circle at k*t,h(k*t) fillcolor rgb 'red' fillstyle solid noborder plot f(x) lw 6 t"f({/symbolpi t})=exp(-{/symbolpi t}^2), {/symbolpi t}>0", \ g(k*t,x) lw 6 t"g({/symbolpi t})=2*exp(-50*{/symbolpi t}^2)", \ f(x)*g(k*t,x) lw 6 t"f(t)g(t-{/symbolpi t})", \ h(x) lw 6 t"h(t)", \ '+' u (k*t):(h(k*t)) w p pt 7 ps 4 t"" } </code></pre>

Fig. 1

<pre class="line-numbers" data-start="0"><code class="language-bash"># Language: gPL A=1; B=2 a=1; b=50; k=0.1 f(x)=A*exp(-a*x)*(x>0? 1:0) g(x,t)=B*exp(-b*(t-x)**2) h(x)=.5*A*B*sqrt(pi/b)*exp(-a*(x-.25*a/b))*erfc(-sqrt(b)*x+.5*a/sqrt(b)) set tit"Convolution of Exponential and Gaussian Function" set xl"t/{/symbolpi t}"; set yl"Value" set xr [-2:3] do for [t=-1/k:2/k] { set label front at k*t,h(k*t) "" point pt 7 ps 4 #set object circle at k*t,h(k*t) fillcolor rgb 'red' fillstyle solid noborder plot f(x) lw 6 t"f({/symbolpi t})=exp(-{/symbolpi t}^2), {/symbolpi t}>0", \ g(k*t,x) lw 6 t"g({/symbolpi t})=2*exp(-50*{/symbolpi t}^2)", \ f(x)*g(k*t,x) lw 6 t"f(t)g(t-{/symbolpi t})", \ h(x) lw 6 t"h(t)" } </code></pre>

Fig. 2

绘制单个点时, gnuplot有三种方法, 使用set label绘点, 各个点会同时存在于最终的动画中, 而使用+set object绘点各个点不会叠加到图上.

另外, gnuplot 5.0版本支持单独的各种虚线形式, 参考下面的讨论.