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)

しかし、代わりに、「plot for」コマンドを使用して、上記と同様の値を使用して t を反復処理したい場合、segfaults が発生するか、終了していないように見えます (長時間待っても応答がありません)。

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)

タウ = 1000 でステップ = 10 の場合、問題はないので、イテラブルのサイズが問題であると想定しています。これを回避する方法はありますか、それとも何か間違っていますか?

@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

これで、正の数を期待していたところに負の数ができました。

編集

gnuplot は、Python が何であれ、4 バイト整数を使用しているようsys.maxintです。私のubuntu x86_64マシンでは、pythonのsys.maxintはgnuplotの整数が処理できるよりもはるかに大きいです(まだ上限があります2**31-1)。

于 2012-12-10T13:13:42.030 に答える