曼德勃罗特集是一个
几何图形,曾被称为“上帝的指纹”。 这个
点集均出自公式:Zn+1=(Zn)^2+C,对于
非线性迭代公式Zn+1=(Zn)^2+C,所有使得无限迭代后的结果能保持有限数值的复数z的集合(也称该
迭代函数的Julia集)连通的c,构成曼德勃罗集。它是曼德勃罗教授在二十世纪七十年代发现的。
图形介绍
这是一个迭代公式,式中的变量都是复数。
只要计算的点足够多,不管把图案放大多少倍,都能显示出更加复杂的局部,这些局部既与整体不同,又有某种相似的地方。图案具有无穷无尽的细节和
自相似性。如图2所示形产生过程,其中后一个图均是前一个图的某一
局部放大:
如下是产生图3的出发点。
出发点:
实部 Real 0.2537269133080432 ,
虚部 Imag. 0.000365995381749671135
The width of that screen is 9.45e-17
图形来源
图形是由美国数学家曼徳勃罗教授于1975年夏天一个夜晚,在冥思苦想之余翻看儿子的
拉丁文行为艺术
计算编程
曼德勃罗特集是易
并行计算的一个典型例子。采用分治技术,
并行算法设计时分为静态
任务分配和动态任务分配(可用work-pool or processor farm)。
其中底部的数据(real_min, imag_min) to (real_max, imag_max)表示
复平面窗口,real_min表示实部
最小值,,imag_min表示虚部最小值,real_max表示实部
最大值,imag_max表示虚部最大值.
2.曼德勃罗特集的计算
显示曼德勃罗特集是处理
位映射图像的一个例子。首先要对图像进行计算,且计算量很大。
曼德勃罗特集是
复数平面中的
点集,当对一个函数
迭代计算时,这些点将处于准稳定状态(
quasi-
stable),即将会增加或减少,但不会超过某一限度。通常该函数为:
式中zk+1是复数z = a + bi的第k+1次迭代,c是确定该点在
复平面中位置的复数值。z的初始值为0。
迭代将一直进行下去,直到z的
幅值(向量长度,这里为22ba+)大于2或者迭代次数已经达到某种任意的规定的限度。
用zreal表示z的实部,zimag表示z的虚部。则:
3.顺序代码
因此,所有给定的曼德勃罗特点必将处在以原点为中心,半径为2的圆中。
计算和显示这些点的代码需要对
坐标系统进行一定的缩放来与显示区域的坐标系统相匹配。
假设显示高度为disp_height,宽度为disp_
width。而点在显示区域中的位置为(x, y)。
如果显示
复数平面的这个窗口具有最小值(real_min, imag_min)和最大值(real_max, imag_max),则每个点需用以下系数加以缩放。
设置
缩放代码:
4.并行代码
4.1. 静态任务分配
假定显示区域为640 × 480,在一个进程中要计算10行。即将10 × 640像素变为一组,共48个进程。
伪代码如下:
主进程Master
从进程Slave (process i)
改进:
成组发送数据.减少通信启动次数。先将结果保存在数组中,然后以一个消息将整个数组发送给主进程。主进程可用一个
通配符以任意顺序接收来自从进程的消息。
4.2. 动态任务分配—工作池/处理器农庄(work pool / processor farm)
动态
负载平衡可以用工作池方法实现。在问题中,像素集(更确切应该是坐标集)构成了任务。任务数是固定的,要计算的
像素数在计算前是已知的。各个处理器从工作池中请求下一个像素子集的坐标。
主进程
从进程