Gnuplot函数绘图与预期不符:无随机性及Y轴水平异常排查
问题分析:Gnuplot脚本未呈现随机性且Y轴异常的原因
你想要生成带有rnd(x)函数随机性的Gnuplot图,参考图有明显的随机波动,但自己写的脚本生成的图只有相似形态却没有随机效果,还存在Y轴水平不符合预期的问题。我来帮你拆解这两个问题的核心原因:
一、随机性缺失的关键原因
你误解了Gnuplot内置函数的用途:
normal(x,mu,sigma)是正态分布的概率密度函数(PDF),它是一个确定性函数,输入x会返回对应位置的概率密度值,而不是生成随机数!你现在的rnd(x)是基于x计算的固定值,整个pot_t(x)自然是完全确定的曲线,没有随机波动。- 要生成服从正态分布的随机数,得用Gnuplot的
rand(0)函数结合转换方法(比如Box-Muller算法)来实现。
修正方法
替换脚本里的随机数生成部分:
# 初始化随机种子,每次运行生成不同的随机序列 set seed time(0) # Box-Muller算法生成标准正态分布随机数 rand_normal() = sqrt(-2*log(rand(0)))*cos(2*pi*rand(0)) # 生成符合你需求的随机项 rnd(x) = 10**(-(rand_normal()*sigma)/10)
这样每次计算rnd(x)时,都会生成一个新的正态随机数,让pot_t(x)产生预期的随机波动。
二、Y轴水平不符的原因
你的脚本里的尺寸设置和终端参数可能导致了Y轴显示异常:
set size 1, 1.2会把图的纵向拉长1.2倍,可能让Y轴看起来“不水平”;- 你用的
postscript终端默认尺寸可能和参考图不匹配,导致轴的显示比例失调。
修正方法
- 可以先尝试去掉
set size 1, 1.2,或者调整为更均衡的比例(比如set size 1,1); - 给终端添加明确的尺寸参数,保证输出比例正常:
set terminal postscript color eps enhanced size 8, 6
(尺寸数值可以根据你的需求调整,8和6代表宽高的英寸数)
修正后的完整脚本示例
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 set terminal postscript color eps enhanced size 8, 6 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 # 修正后的随机数生成逻辑 set seed time(0) rand_normal() = sqrt(-2*log(rand(0)))*cos(2*pi*rand(0)) rnd(x) = 10**(-(rand_normal()*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) ) # 用linespoints可以更清晰看到随机波动的细节 plot [1:12][] pot_t(x) t "up" w linespoints ls 1
内容的提问来源于stack exchange,提问作者pablo
相关产品推荐
相关产品推荐

