2.4.7 自适应绘制图形

为了更加深入地研究渗透原理,程序开发的下一步可以编写一个程序,用于绘制给定n值时渗透概率q与网格空置概率p的函数图形。也许产生此类图形的最佳方法是首先推导出函数的数学方程,然后基于方程式绘制图形。然而,对于渗透原理,迄今为止还没有人能够推导出这样的方程,所以替代的选项是使用蒙特卡洛方法,即运行模拟并绘制结果。

随即而来,我们将面临许多决策。应该基于多少p值计算和估计渗透概率?我们将选择哪一个p值?这些计算的目标精度为多少?这些决策构成了实验设计问题。尽管我们希望对任何给定的n值可以立即产生曲线的准确再现,但计算成本可能十分高昂。例如,首先我们想到要使用stdstats.py(程序2.2.5)绘制,比方说100到1000个等间隔点。但是,正如读者已经通过程序estimate.py了解到,要计算每个点足够精度的渗透概率可能需要花费几秒钟甚至更长时间,所以整个绘制过程可能需要几分钟、几个小时或更长时间。另外,很明显许多计算时间纯属浪费,因为我们知道对于小的p值结果为0,对于大的p值结果为1。我们可以倾向于花费更多的时间计算中间值p。但问题是如何实现呢?

程序2.4.7(percplot.py)实现了一个递归的方法,广泛适用于类似问题。其基本思想十分简单:我们选择x坐标值之间的最短路径(称为间距容限,gap tolerance),能够容忍的y坐标的最小误差(称为误差容限,error tolerance),以及我们想要测试的每个点的实验次数。递归函数绘制一条位于给定x区间[x0x1]中从(x0y0)到(x1y1)的直线。对于我们所研究的问题,从(0,0)到(1,1)绘制图形。基本情况(如果x0x1之间的距离小于间距容限,或两个端点连线中点与函数值之间的距离小于误差容限)则简单地绘制一条从点( ...

Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.