Iteracja punktów środkowych

Iteracja punktów środkowych#

W tym przykładzie zbadamy co się dzieje z wielokątami, które powstają przez połączenie punktów środkowych kolejnych krawędzi.

Iterując odwzorowanie jesteśmy w stanie zaobserwować pewne ‘’zaokrąglanie się’’ wyjściowego kształtu. Dlaczego tak się dzieje?

def AvPt(x,y):
    xv=vector(x)
    yv=vector(y)
    vv=(xv+yv)*(1/2);
    return (vv[0],vv[1])
r7=[exp(2*pi*I*k/7) for k in [0..6]]
polylist=[(x.real_part(),x.imag_part()) for x in r7]

polyiter=[AvPt(polylist[i],polylist[(i+1)% 7]) for i in [0..6]]
show(polygon(polylist,color='black')+polygon(polyiter,color='red'),axes=False)
_images/b915af0f0bd4ea4009e0cf4efc91ac5e88e57dcc19619db1b86f1b7962e26834.png
#ta procedure generuje nowe punkty środkowe wielokąta z poprzednich
def AvPoly(polylist):
    n=len(polylist)
    return [AvPt(polylist[i],polylist[(i+1)% n]) for i in [0..(n-1)]]

Zaokrąglanie#

Zaokrąglanie (i uwypuklanie się) losowej figury startowej

#losowa wartość parametru na przedziale [-1,1]
def ra():
    return 2*random()-1
#rysowanie procesu uśredniającego dla losowego kształtu
polyiter=[(ra(),ra()) for i in [1..12]]
gra=polygon(polyiter,color="black")
for i in [1..10]:
    polyiter=AvPoly(polyiter)
    if i%2==0:
        gra=gra+polygon(polyiter,color="black")
    else:
        gra=gra+polygon(polyiter,color="red")
        

gra
_images/bd585263fbd6adb453a7f1ec22f0daa43795fb7619affb2c41d7a6532088105b.png
#Regulujemy skalę, aby kształt nie zmniejszał się. To jeszcze bardziej uwidacznia ''zaokgrąglanie się'' iterowanego kształtu.
def AvPtScale(x,y,s):
    xv=vector(x)
    yv=vector(y)
    vv=(xv+yv)*(s/2);
    return (vv[0],vv[1])
def AvPolyScale(polylist,scale):
    n=len(polylist)
    return [AvPtScale(polylist[i],polylist[(i+1)% n],scale) for i in [0..(n-1)]]
polyiter=[(ra(),ra()) for i in [1..15]]
gra0=polygon(polyiter,color="black")
for i in [1..30]:
    polyiter=AvPolyScale(polyiter,2^(1/15))
gra=polygon(polyiter,color="red")
gra0+gra
_images/e0ceb342545a46d10cb061c28382c9a5832a857ece6630b4f1f268f1b1b8dc4e.png

Zachowania graniczne#

Wyjaśnij dlaczego iterowany kształt staje się coraz bardziej okrągły? (Wskazówka: pomyśl o operatorze uśredniającym jako operatorze liniowym na punktach. Jakie są jego wartości własne?)

#trzy wierzchołki
#[z1,z2,z3]---->[(z1+z2)/2,(z2+z3)/2,(z3+z1)/2]


m=matrix([[1/2,1/2,0],[0,1/2,1/2],[1/2,0,1/2]])

#norma wartości własnych leży w przedziale [0,1]

x=var('x')
2^3*m.charpoly().subs(x=x/2+1/2).expand() #czy zawsze otrzymujemy wielomian postaci x^n-1?
x^3 - 1
def Cycle(li1):
    return [li1[len(li1)-1]]+li1[0:len(li1)-1]


def CyclicMatrix(li):
    n=len(li)
    longlist=li
    for i in [2..n]:
        li=Cycle(li)
        longlist=longlist+li
    return matrix(QQ,n,longlist)

def Mat1(n):
    return CyclicMatrix([1/2,1/2]+[0 for i in [2..(n-1)]])

x=var('x')
(Mat1(6).characteristic_polynomial()).subs(x=x/2+1/2).expand()

#lista wartości własnych
liroo=[x[0].norm() for x in (Mat1(11).characteristic_polynomial()).roots(CC)]
liroo.sort()
list_plot(liroo) #norma wartości własnych należy do przedziału [0,1]
_images/37161056cc6ab632d15cf8561a14d5571b5f53a87c050578c55073476688c82b.png
def Mat2(n,p):
    return CyclicMatrix([p,1-p]+[0 for i in [2..(n-1)]])

n=11
mn=Mat2(n,1/5)
v1=mn.eigenvectors_right()
graphics_array(list((polygon([CC(v1[j][1][0][k]) for k in [0..(n-1)]],axes=False) for j in [0..(n-1)]))).show()
list_plot(list(map(norm,mn.eigenvalues()))).show()
_images/2b16ffbe3fa893b81900a1da94ea98fca0811305a5663d325ac0230779adc476.png _images/f49ea20408bc93f4f9bc3ef5a0578fc6f05b2244aee1da2b5e96a7457c005116.png
print([x.norm() for x in Mat2(5,1/10).eigenvalues()])
print([x.norm() for x in Mat2(5,1/2).eigenvalues()])
[1, 0.6743769410125095?, 0.6743769410125095?, 0.8756230589874905?, 0.8756230589874905?]
[1, 0.09549150281252628?, 0.09549150281252628?, 0.6545084971874737?, 0.6545084971874737?]

Wektory własne z maksymalną normą (równą 1) odpowiadają dwóm równobocznym n-kątom (udowodnij!). Każdy z tych n-kątów ma jedną z dwóch dostępnych orientacji wierzchołków (zgodnie i przeciwnie do ruchu wskazówek zegara). Wektory własne o normie ścisle mniejszej od 1 odpowiadają pewnym zbiorom gwiaździstym (również po dwie orientacje).

[mn.eigenvectors_right()[i][0].norm() for i in [0..10]]
[1,
 0.02025351319275131?,
 0.02025351319275131?,
 0.1725696330273575?,
 0.1725696330273575?,
 0.4288425808633575?,
 0.4288425808633575?,
 0.7077075065009432?,
 0.7077075065009432?,
 0.920626766415591?,
 0.920626766415591?]

The unique eigenvector with eigenvalue 1 corresponds to a fixed point.

#Experiment on iterations
m=Mat1(10)
v=vector((1,1+I,2+I,I,-1-I,-I,-I+1,-I+2,-I+3,-I+4))
graphics_array(list((polygon([CC(x) for x in nest(lambda x: m*x,3*k,v)*1.0],axes=False,figsize=30) for k in [0..5])))
_images/914d1c5f1bb88da48d09fa828ca049e9b4956c41236c00e8ba0d7678bf2a6996.png

Dla wielokątów równobocznych proces uśredniania tylko obraca figurę (i ją kurczy).

r7=[exp(2*pi*I*k/7) for k in [0..6]]
polyiter=[(x.real_part(),x.imag_part()) for x in r7]
gra=polygon(polyiter,color="black")
for i in [1..40]:
    polyiter=AvPoly(polyiter)
    if i%2==0:
        gra=gra+polygon(polyiter,color="black")
    else:
        gra=gra+polygon(polyiter,color="red")
        

gra
_images/3103d86a467dd439f61b329822737e2eed296927b3192b13ea5b077eb2a37f54.png
#Czyste kształty (odp. wektorom własnym dla wartości własnej moduły mniejszego od 1) nie stają się bardziej ''okrągłe''.
r7=[exp(2*pi*I*(4*k)/7) for k in [0..6]]
polyiter=[(x.real_part(),x.imag_part()) for x in r7]
gra=polygon(polyiter,color="black")
for i in [1..40]:
    polyiter=AvPoly(polyiter)
    if i%2==0:
        gra=gra+polygon(polyiter,color="black")
    else:
        gra=gra+polygon(polyiter,color="red")
        

gra
_images/bbfe88e470c6e520177337fceb4fb6c76d6576c62f467bf18d40b31e1b9687cf.png
#W tej funkcji przesuwamy środek figury do początku układu współrzędnych, aby zredukować efekt płynięcia kształtu.
def ShiftCenter(li,tup):
    x,y=tup
    return [(m[0]+x,m[1]+y) for m in li]
polyiter=[(ra(),ra()) for i in [1..25]]
polyiter=ShiftCenter(polyiter,-sum([vector(x) for x in polyiter])*1/len(polyiter))
li=[polygon(polyiter,color="black")]
for i in [1..200]:
    polyiter=AvPolyScale(polyiter,2^(1/35))
    li.append(polygon(polyiter,color=Color(i/200,0,0),axes=False))
li[1].show(figsize=[3,3])
_images/27c0bc18787fb676e4d36ebf2c6de75b811e472e1e42d5cdca796aee756e5347.png
[li[20*i].show(figsize=[3,3]) for i in range(1,10)];
_images/fffc452069a02e8728f0ade532a1c67bb7f170609d91ea35479211b124d482ef.png _images/bdf6088bebb4802db8b9d985ddbd292fc75a67cfcdb391b7d4d549339b6c38aa.png _images/484eb1fb82efa36d0a263050077493d5944843b79188eee46053fa3fb8564f28.png _images/999cffdfb4b64eb81fc5da617605d9350adf69ac2c5bd922b14bf51380f1ceff.png _images/154db565af3beb9d4fb12458e0c3449118aca1a594cf560f54656bfd8e4d6619.png _images/89c11fdf1b3140d52165d221d38b6dba50f889922254e08939b7725d1123a13f.png _images/c0001baed04da01dd8d0f97d72051e888f02fccd5f22f4d1efee5c0fb0a583c0.png _images/43fabfb0f365fb055a0a16cf9f13bf8c4d9e8f1cdbf48c7aa79a0159b9912330.png _images/277820b7c2f96eba6ecb7de2e78db74ad130b4eaa5f72eeb9d8722756ef35ffc.png
polyiter=[CC(exp(2*pi*I*(7*k)/10)) for k in [0..10]]
polyiter=ShiftCenter(polyiter,-sum([vector(x) for x in polyiter])*1/len(polyiter))
li=[polygon(polyiter,color="black")]
for i in [1..30]:
    polyiter=AvPolyScale(polyiter,2^(1/10))
    li.append(polygon(polyiter,color=Color(i/30,0,0),axes=False))
[li[3*i].show(figsize=[3,3]) for i in range(1,10)];
_images/fc7726256d2a06f7927e57904e8167aadaba89dceca1e3d15d33109d4e994c7e.png _images/979c8d92b33f14ee2ac13a82a303ffe8a1379aa28ac3ce88a91e2f6923b4e7eb.png _images/40bf33e04ecf75ad185ffff1f805ad926fb90950f8a689429157f5f68581ce05.png _images/2be37038b18f6ada1c5897d4a8427d6b39c84b74982bce484b9b1b8ccb4ef933.png _images/65afd43549b6d0da90ff4245681edd6baf385099983814f988f9c60607651e8a.png _images/2424fdea096f0573b4892bef4ff84a2bcc6b616d272d7c1e7b1724966422f162.png _images/6d80e6f56babcc0993a5b4bfd187ebfd740a5b167f981022789ae158fa78a5b6.png _images/5431a9cb00891d63a2ad13945be225f23c2f5f32f8ec3853161b93658507d076.png _images/f04166b6f62314974d9982f37a1c90d2199df143a32c94985f4f4447f08e12bf.png