1

我可以在 gnuplot 4.4 中绘制一个变量值与我需要的一样大的函数:

gnuplot> t = 10000*365.25*24*3600
gnuplot> f(x) = alpha*delta*exp(-alpha*x)*(sin(omega*t-alpha*x)-cos(omega*t-alpha*x))
gnuplot> plot f(x)

但是,如果我想使用与上面类似的值来迭代 t,通过使用“plot for”命令,我会得到段错误或者它似乎没有结束(我等了很长时间,但仍然没有响应):

tau = int(40000*365.25*24*3600)
step = int(10000*365.25*24*3600)
f(x,t) = alpha*delta*exp(-alpha*x)*(sin(omega*t-alpha*x)-cos(omega*t-alpha*x))
plot for [t=0:tau:step] f(x,t)

如果我有 tau = 1000,并且 step = 10 那么就没有问题,所以我假设 iterables 的大小是问题所在。有什么办法可以解决这个问题还是我做错了什么?

@mgilson 的回答之后的一些更多信息:我的系统是 64 位的,python 可以处理一些非常大的整数:

>>> import sys
>>> sys.maxint
9223372036854775807
>>> tau = int(40000*365.25*24*3600)
>>> print tau
1262304000000

虽然 gnuplot 不能:

gnuplot> tau = int(40000*365.25*24*3600)
gnuplot> print tau
-2147483648

如果您想尝试,这是绘图文件:

tau   = int(40000*365.25*24*3600)
delta = 10
kappa = 1e-6
omega = 2*pi/tau  # angular frequency
alpha = sqrt(omega/(2*kappa))  # a simplifying factor

# set the range of x and time, t
set xrange[0:3000]
step = int(10000*365.25*24*3600)

f(x,t) = alpha*delta*exp(-alpha*x)*(sin(omega*t-alpha*x)-cos(omega*t-alpha*x))
plot for [t=0:tau:step] f(x,t)
4

1 回答 1

1

快速将其中的一些放入 python 解释器中:

>>> tau = int(40000*365.25*24*3600)
>>> tau
1262304000000L
>>> step = int(10000*365.25*24*3600)
>>> step
315576000000L

注意L整数末尾的 ?这意味着这些数字溢出了系统的最大整数大小,即:

>>> import sys
>>> sys.maxint   #2**31 - 1
2147483647

对于我的系统。Python 通过使用自定义类型 ( long) 优雅地处理此问题,该类型允许整数占用无限数量的字节。gnuplot 处理这个问题的方式是溢出环绕......

gnuplot> tau = int(40000*365.25*24*3600)
gnuplot> print tau
-2147483648

现在你有负数,而你期望正数。

编辑

无论 pythonsys.maxint是什么,gnuplot 似乎都使用 4 字节整数。在我的 ubuntu x86_64 机器上,pythonsys.maxint比 gnuplot 的整数可以处理的要大得多(仍然上限为2**31-1)。

于 2012-12-10T13:13:42.030 回答