最近我问了question如何在1-D中生成一个简单的多重分形(二项式测量),我得到了一个很好的答案。现在,我想生成二维二项式测量,但我在实现这个方面遇到了困难。
可以按如下方式生成1-D案例:
二项式度量是一种概率度量,通过递归构造方便地定义。首先将$ I:= [0,1] $拆分为两个子区间$ I_0 $和$ I_1 $等长,并将质量$ m_0 $和$ m_1 = 1 - m_0 $分配给它们。使用两个子间隔,以相同的方式进行,依此类推:在第二阶段,例如,四个子区间$ I_ {00},I_ {01},I_ {10},I_ {11} $分别具有质量$ m_0m_0,m_0m_1 m_1m_0 m_1m_1 $。
Rudolf H. Riedi. Introduction to Multifractals
直观地说,2-D的概括似乎很容易。在2-D中,我们有一个单位正方形,而不是单位区间上的区间,递归地分成四个子方形,质量为m0,m1,m2,m3给定m0 + m1 + m2 + m3 = 1,然后分为16个子区间,64等等。
MWE(1-D案例):
import matplotlib.pyplot as plt
from sympy import var
def binom_measuare(iterations, p=0.4, current_layer=None):
var('m0 m1')
if current_layer is None:
current_layer = [1]
next_layer = []
for item in current_layer:
next_layer.append(m0*item)
next_layer.append(m1*item)
if iterations != 0:
return binom_measuare(iterations - 1, current_layer=next_layer)
else:
return [i.subs(m0, p).subs(m1, 1 - p) for i in next_layer]
让我们绘制输出
y = binom_measuare(iterations=12)
x = [(i+1) / len(y) for i in range(len(y))]
x = [0] + x
y = [0] + y
plt.plot(x, y)
2-D案例的MWE:
def binom_measuare_2D(iterations, p1=0.4, p2=0.2, p3=0.3, p4=0.1, current_layer=None):
var('mx0 mx1 my0 my1')
if current_layer is None:
current_layer = [1]
next_layer = []
for item in current_layer:
next_layer.append(mx0*item)
next_layer.append(mx1*item)
next_layer.append(my0*item)
next_layer.append(my1*item)
if iterations != 0:
return binom_measuare_2D(iterations-1, p1, p2, p3, p4, next_layer)
else:
return [i.subs(mx0, p1).subs(mx1, p2).subs(my0, p3).subs(my1, p4) for i in next_layer]
使用示例:
import numpy as np
iterat = 1
z = binom_measuare_2D(iterations=iterat, p1=0.1, p2=0.2, p3=0.3, p4=0.4)
z = np.array(z)
z = z.reshape(2**(1 + iterat), 2**(1 + iterat))
print(z)
它似乎在输出中有正确的值,但我不知道如何为列表中的每个坐标x和y指定值。它返回子方形的值,但不返回一般方形的行,因此可以很容易地显示它。让我说明一下我的意思。令(行索引; col索引)是上面提供的示例中输出数组的索引。
根据这种模式填写:
但是,我希望它能像这样填充:
答案 0 :(得分:1)
与我在之前的回答中所写的相似,我建议,而不是考虑分裂细胞,考虑用四个新细胞替换每个细胞,一种双重有丝分裂。可以像这样计算新单元格中的值,除了将结果重新整形以形成4x4矩阵。通过迭代当前图层的单元格并将4x4结果放入下一代图层,可以从当前图层计算下一代图层。
>>> from sympy import *
>>> var('m0 m1 m2 m3')
(m0, m1, m2, m3)
>>> def mitosis(aCell):
... return ((m0**3, m0**2*m1, m0*m1**2, m1**3), (m0**2*m2, m0*m1*m2, m0*m1*m3, m1**2*m3), (m0*m2**2, m0*m2*m3, m1*m2*m3, m1*m3**2), (m0**3, m2**2*m3, m2*m3**2, m3**3))
...
>>> first = (m0,m1,m2,m3)
>>> mitosis(first)
((m0**3, m0**2*m1, m0*m1**2, m1**3), (m0**2*m2, m0*m1*m2, m0*m1*m3, m1**2*m3), (m0*m2**2, m0*m2*m3, m1*m2*m3, m1*m3**2), (m0**3, m2**2*m3, m2*m3**2, m3**3))