Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como gerar o Triângulo de Sierpinski usando contrações?

+1 voto
110 visitas
perguntada Dez 5, 2015 em Matemática por danielcajueiro (5,566 pontos)  
Compartilhe

1 Resposta

0 votos
respondida Dez 5, 2015 por danielcajueiro (5,566 pontos)  

Pode-se gerar o Triângulo de Sierpinski usando a união do conjunto imagem dos seguintes operadores:

\[T_1(x,y)=\frac{1}{2}\left[\begin{array}{c} x \\ y \\ \end{array}\right]\]
\[T_2(x,y)=\frac{1}{2}\left[\begin{array}{c} x-1 \\ y \\ \end{array}\right]+ \left[\begin{array}{c} 1 \\ 0 \\ \end{array}\right]\]
\[T_3(x,y)=\frac{1}{2}\left[\begin{array}{c} x-1/2 \\ y-\sqrt{3}/2 \\ \end{array}\right]+ \left[\begin{array}{c} 1/2 \\ \sqrt{3}/2 \\ \end{array}\right]\]

É fácil interpretar geometricamente o papel de \(T_1\), \(T_2\) e \(T_3\). \(T_1\) contrai o ponto \((x,y)\) a metade. \(T_2\) e \(T_3\) contraem um shift do ponto original a metade e dão um pequeno shift nele.

Defina \(T(x,y)=T_1(x,y)\cup T_2(x,y) \cup T_3(x,y)\). Pode-se mostrar que \(T\) é uma contração em \(\mathbb{R}^2\). Usando o teorema do Ponto Fixo de Banach, sabemos que a aplicação repetida dessa contração convergirá para um conjunto compacto, que é justamente o conjunto desejado:

Iteração 1:

sierpinski  www.prorum.com

Iteração 3:

sierpinski  www.prorum.com

Iteração 5:

sierpinski  www.prorum.com

Como você pode notar esse é o Triângulo de sierpinski.

Implementei esse código para gerar essas imagens:

import numpy as np
import matplotlib.pyplot as plt

def contraction(plane):
    [m,n]=np.shape(plane)
    newRegion=np.empty([3*m,2])
    count=-1
    for i in range(m):
        count=count+1
        newRegion[count,0]=(1.0*plane[i,0])/2.0
        newRegion[count,1]=(1.0*plane[i,1])/2.0        

    for i in range(m):
        count=count+1
        newRegion[count,0]=(1.0*plane[i,0]-1.0)/2.0  + 1
        newRegion[count,1]=(1.0*plane[i,1])/2.0        

    for i in range(m):
        count=count+1
        newRegion[count,0]=(1.0*plane[i,0]-0.5)/2.0 +0.5
        newRegion[count,1]=(1.0*plane[i,1]-np.sqrt(3.0)/2.0)/2.0 + np.sqrt(3.0)/2.0
    return newRegion

def generatePlane(N):
    plane=np.empty([N*N,2])
    count=-1
    for i in range(N):
       for j in range(N):
           count=count+1
           plane[count,0]=1.0*i/N
           plane[count,1]=1.0*j/N
    return plane
if __name__ == '__main__':

# Generate Data
    N=100
    plane=generatePlane(N)

    #iteration 1
    region=contraction(plane)
    #iteration 2
    region=contraction(region)
    #iteration 3
    region=contraction(region)
    #iteration 4    
    region=contraction(region)  
    #iteration 5    
    region=contraction(region)  



    fig = plt.figure()
    ax = fig.add_subplot(111)  
    fig.hold()
    ax.plot(region[:,0],region[:,1],'b.',markersize=10, markeredgewidth=0)
    ax.set_ylabel('y')
    ax.set_xlabel('x')  

Referencia:

A.A. Kirillov A tale of two fractals. Springer, 2013.

...