正文
tf.global_variables_initializer().run()
zs_ = tf.where(tf.abs(zs) < R, zs**2 + xs, zs)
not_diverged = tf.abs(zs_) < R
step = tf.group(
zs.assign(zs_),
ns.assign_add(tf.cast(not_diverged, tf.float32))
for i in range(ITER_NUM): step.run()
final_step = ns.eval()
final_z = zs_.eval()
zs就对应我们之前迭代公式的z,而xs就对应迭代公式中的c。为了方便起见,只要计算时数值的绝对值大于一个事先指定的值R,就认为其发散。每次计算使用tf.where只对还未发散的值进行计算。结合ns和zs_就可以计算颜色,得到经典的Mandelbrot图像。
Julia集合
Julia集合和Mandelbrot集合差不多,但这次我们固定c,转而计算发散的z的值。
即c是固定的常数(可以任取),数列变成 z,z^2+c,(z^2+c)^2+c......。如果该数列发散,对应的z就属于Julia集合。对此,我们只要在原来的程序中修改两行内容,就可以生成Julia集合:
xs = tf.constant(np.full(shape=Z.shape, fill_value=c, dtype=Z.dtype))
zs = tf.Variable(Z)
我们在fill_value=c处指定了Julia集合中的c值,只要使用不同的c值,就可以生成完全不同的Julia集合!
默认:
c=-0.835-0.2321i:
将c值变为 c=-0.
8i
,并调整颜色
(调整方法参考Github页面的说明):
选用 c=0285+0.01i,图案又变得完全不同: