Gnuplot 如何绘制函数的函数

Gnuplot 如何绘制函数的函数,gnuplot,Gnuplot,我想要一个这样的情节 它在Gnuplot中生成,但从文件打印 包含所有函数的Gnuplot脚本如下所示: set encoding iso_8859_1 set key right top font "Helvetica,17" set ylabel "Received power, P_t (dBm)" font "Helvetica,18" set xlabel "Separation distance, r (m)" font "Helvetica,18" set xtics font

我想要一个这样的情节

它在Gnuplot中生成,但从文件打印

包含所有函数的Gnuplot脚本如下所示:

set encoding iso_8859_1
set key right top font "Helvetica,17"
set ylabel "Received power, P_t (dBm)" font "Helvetica,18"
set xlabel "Separation distance, r (m)" font "Helvetica,18"
set xtics font "Helvetica,16"
set ytics font "Helvetica,16"
set size 1, 1.2
set terminal postscript color eps enhanced
set grid xtics ytics
set key spacing 1.5
set key box linestyle 1 width 3
set logscale x
set grid xtics mxtics
set output "link-up-test.eps"
h1=1.85
h2=0.5
r(x) = sqrt((h1 - h2)**2 + x**2 )
lmb = 300/865.7
H(x) = sqrt( 1- (4*h1*h2)/(x**2 + (h1 + h2)**2 ) )
theta(x) = 2*pi/lmb*( sqrt((h1 + h2)**2+x**2 ) - sqrt((h1 - h2)**2+ x**2) )
q_e(x) = H(x)**2*(sin(theta(x)))**2 + (1 - H(x)*cos(theta(x)))**2
P_x_G = 4
sigma = 1.94
invsqrt2pi = 0.398942280401433
normal(x,mu,sigma)=sigma<=0?1/0:invsqrt2pi/sigma*exp(-0.5*((x-mu)/sigma)**2)
rnd(x) = 10**(-normal(x,0,sigma)/10)
pot_t(x) = 10*log10( 1000*(P_x_G*1.622*((300/lmb)**2) *0.5*1) / (((4*pi*r(x))**2) *1.2*1)*q_e(x)*rnd(x) )
plot [1:12][] pot_t(x) t "up"  w lines ls 1
设置编码iso_8859_1
设置键右上角字体“Helvetica,17”
设置标签“接收功率,功率(dBm)”字体“Helvetica,18”
设置xlabel“分隔距离,r(m)”字体“Helvetica,18”
设置xtics字体“Helvetica,16”
设置ytics字体“Helvetica,16”
设置大小1,1.2
设置终端postscript颜色增强
将网格设置为xtics-ytics
将键间距设置为1.5
设置键框线型1宽度3
设置对数刻度x
设置栅格xtics mxtics
设置输出“连接测试.eps”
h1=1.85
h2=0.5
r(x)=sqrt(h1-h2)**2+x**2)
lmb=300/865.7
H(x)=sqrt(1-(4*h1*h2)/(x**2+(h1+h2)**2))
θ(x)=2*pi/lmb*(sqrt((h1+h2)**2+x**2)-sqrt((h1-h2)**2+x**2))
q_e(x)=H(x)**2*(sin(θ(x))**2+(1-H(x)*cos(θ(x))**2
P_x_G=4
西格玛=1.94
invsqrt2pi=0.398942280401433

正常(x,mu,sigma)=sigma您的rnd(x)函数没有随机性。只要画出rnd(x),你就能看到。为什么不将gnuplot的rand()函数与正态分布结合使用?

我想给出这个问题的解决方案。 我使用了Box-Muller方法来生成高斯样本

h1=1.85
h2=0.5
r(x) = sqrt((h1 - h2)**2 + x**2 )
lmb = 300/865.7
H(x) = sqrt( 1- (4*h1*h2)/(x**2 + (h1 + h2)**2 ) )
theta(x) = 2*pi/lmb*( sqrt((h1 + h2)**2+x**2 ) - sqrt((h1 - h2)**2 + x**2) )
q_e(x) = H(x)**2*(sin(theta(x)))**2 + (1 - H(x)*cos(theta(x)))**2
P_G = 4

sigma = 1.94


normal(x,mu,sigma) = sqrt(-2.0 * log(rand(0))) * cos(2*pi * rand(0)) * sigma + mu
rnd(x) = 10**(-normal(x,0,sigma)/10)

pot_t(x) = 10*log10( 1000*(P_G*1.622*((lmb)**2) *0.5*1) / (((4*pi*r(x))**2) *1.2*1)*q_e(x)*rnd(x) )
set samples 1000
plot [1:12][] pot_t(x) t "up"  w lines ls 1
这将创建此绘图:

使用函数
normal(x,mu,sigma)
生成样本。 这个解决方案只有一个问题 当我用
set logscale x
绘图时,当
x轴
更集中时,点的绘图应该更密集(参见上面的第一个绘图),但Gnuplot似乎首先制作
x轴
的对数刻度,然后在图中取等距样本,将对数刻度作为线性刻度处理。如果有人能回答这个问题或改进解决方案,我将不胜感激


你是对的。我需要的是生成随机高斯数,将其添加到每个
y
数中。Gnuplot能生成高斯函数的随机实现吗?谢谢。我想我解决了这个问题。我用Box-Muller变换生成了高斯函数,效果很好。我将删除这个问题,因为我认为这不是一个可以帮助其他人的真正问题。如果你解决了这个问题,发表你自己的答案。我认为在gnuplot中生成高斯会引起人们的兴趣。您可以首先使用x轴的线性刻度创建数据,并将结果存储在数据块中,然后切换到对数刻度并绘制数据块:
unset log x;设置表格$data;图[1:12]pot_t(x)w lp;未设置表;设置日志x;绘图$数据标题“向上”w行ls 1