我正在用scipy.integrate的odeint软件包求解一组耦合的微分方程。
对于我所拥有的集成时间:
t=numpy.linspace(0,8e+9,5e+06)
其中5e+06是时间步长。
然后我画出我所拥有的方程式:
plt.xscale('symlog') #x axis logarithmic scale
plt.yscale('log',basey=2) #Y axis logarithmic scale
plt.gca().set_ylim(8, 100000) #Changing y axis ticks
ax = plt.gca()
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.title("Example graph")
plt.xlabel("time (yr)")
plt.ylabel("quantity a")
plt.plot(t,a,"r-", label = 'Example graph')
plt.legend(loc='best')
其中a是时间依赖变量。(这只是众多图表中的一个。)
然而,图看起来有点锯齿,而不是振荡,我得到了这个错误:
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)
我不太确定这个错误是什么意思,我看过其他答案,但不知道如何实现'agg.path.chunksize‘。
此外,集成+绘图需要大约7个小时,这是与一些CPU处理黑客,所以我真的不想实现任何会增加时间的东西。
我如何克服这个错误?
我试图减少时间步长,但是我得到了这个错误:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
发布于 2018-07-22 18:14:28
如错误消息所示,您可以使用set the chunksize to a larger value。
plt.rcParams['agg.path.chunksize'] = 1000
但是,您也可以批判性地反思为什么首先会发生此错误。只有当您试图在图表上绘制不合理的大量数据时,才会发生这种情况。这意味着,如果您尝试绘制200000000个点,渲染器可能会在将它们全部保留在内存中时遇到问题。但人们可能应该问问自己,为什么有必要绘制这么多点?一个屏幕可能在横向上显示大约2000个点,一张打印纸可能显示6000个点。一般来说,使用更多的点是没有意义的。
现在,如果微分方程的解需要很大的点密度,这并不意味着您需要将它们全部绘制出来。
例如,一个人可以每100个点绘制一次,
plt.plot(x[::100], y[::100])
很可能甚至不会影响可视化的绘图外观。
https://stackoverflow.com/questions/51461298
复制相似问题