2015-01-18 14:29:06
利用gnuplot的gif终端可以制作简单的动画, 制作时可以使用reread
命令, 像马欢的博文中介绍的那样.
更简单的方法是使用do for
命令.
下面是指数函数和高斯函数卷积的动画, 具体的理论请参看以前的博文.
# 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""
}
# 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)"
}
绘制单个点时, gnuplot有三种方法,
使用set label
绘点, 各个点会同时存在于最终的动画中, 而使用+
或set object
绘点各个点不会叠加到图上.
另外, gnuplot 5.0版本支持单独的各种虚线形式, 参考下面的讨论.