将单元段递归分成两部分(二维情况)

时间:2017-03-30 12:34:22

标签: python numpy recursion

最近我问了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索引)是上面提供的示例中输出数组的索引。

根据这种模式填写:

It fills according to this pattern

但是,我希望它能像这样填充:

I expect it to be like this one

1 个答案:

答案 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))