Diszkrét matematika 5. előadás mgyongyi@ms.sapientia.ro Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia 2018, őszi félév
Miről volt szó az elmúlt előadáson? Python alapfogalmak: függvények, paraméterátadás, a decimal modul számtartományok: irracionális számok, valós számok híresebb irracionális számok ( 2, π, e, φ) értéke a sin értéke az log értéke a k-ik gyök értéke: Newton módszerrel
Miről lesz szó? számtartományok: komplex számok másodfokú egyenlet komplex gyökei műveletek komplex számokkal: szorzat, hatványozás, stb fraktálok: Mandelbrot, Julia számrendszerek
Komplex számok A komplex számok a valós számhalmaz egy olyan bővítése, melyben negatív számok esetén is értelmezett a gyökvonás, halmazjelölés: C. három modell alapján is értelmezhető: halmazelméleti, geometriai, algebrai modell alapján halmazelméleti modell: C = {(a, b) a R, b R}, azaz a számhalmazt rendezett számpárok alkotják, ahol az elemek valós számok, imaginárius rész: az a komplex szám amelynek négyzete -1, jele az i a komplex számok a + bi alakban írhatóak fel, ahol a valós rész, b az imarinárius rész ha b = 0, akkor valós számot kapunk a valós számok körében megismert műveleti tulajdonságok megmaradnak additív semleges elem: z = 0 + 0i multiplikatív semleges elem: z = 1 + 0i additív inverz elem: z = a bi, multiplikatív inverz elem: 1/z = a/(a 2 + b 2 ) b/(a 2 + b 2 )i, z 0
Műveletek komplex számokkal Műveleti szabályok: a = a 1 + a 2i abs(a) = a1 2 + a2 2, a komplex szám nagysága b = b 1 + b 2i a + b = (a 1 + b 1) + (a 2 + b 2)i a b = (a 1 b 1) + (a 2 b 2)i a b = (a 1 b 1 a 2 b 2) + (a 2 b 1 + a 1 b 2)i 1 b 1 = b (b1 2 + b2 2 ) b 2 (b1 2 + b2 2 ) i a b = a 1 b http://www.welchlabs.com/resources/ (1)
Komplex számok Pythonban >>> a = complex(2, 4) >>> a.imag 4.0 >>> a.real 2.0 >>> abs(a) 4.47213595499958 >>> b = complex(1,10) >>> a + b (3 + 14j) >>> a - b (1-6j) >>> a * b (-38 + 24j) >>> a / b (0.4158415841584159-0.15841584158415842j)
Algoritmusok Pythonban 1. feladat Határozzuk meg egy másodfokú egyenlet gyökeit. import math def megyenlet2 (a, b, c): if a == 0: return egyenlet(b, c) delta = b*b - 4*a*c if delta < 0: valosr = -b / (2*a) imagr = math.sqrt( abs (delta)) / (2 * a) gy1 = complex(valosr, imagr) gy2 = complex(valosr, -imagr) return (gy1, gy2) if delta == 0: gy = -b/(2*a) return (gy, gy) if delta > 0: gy1 = (-b + math.sqrt(delta)) / (2*a) gy2 = (-b - math.sqrt(delta)) / (2*a) return ( gy1, gy2 )
Két komplex szám szorzata 2. feladat Határozzuk meg az a = a1 + a2i és b = b1 + b2i komplex számok szorzatát, ahol alkalmazzuk, hogy a b = (a 1 b 1 a 2 b 2) + (a 2 b 1 + a 1 b 2)i def szorzatc(a, b): a1, a2 = a b1, b2 = b vresz = a1 * b1 - a2 * b2 iresz = a2 * b1 + a1 * b2 return (vresz, iresz) >>> szorzatc((2.5, 5.4), (3.34, 101.5)) (-539.75, 271.786) >>> a = complex(2.5, 5.4) >>> b = complex(3.34, 101.5) >>> a * b (-539.75+271.786j)
Komplex számok hatványozása 3. feladat Határozzuk meg a n -t, ahol a = (a1, a2) egy komplex szám; alkalmazzuk a gyorshatványozás algoritmusát. def my_powc (a, n): res = (1, 0) while True: if n % 2 == 1: res = szorzatc(res, a) if n == 1: break a = szorzatc(a, a) n = n // 2 return res >>> my_powc((2.5, 5.4), 3) (-203.07500000000002, -56.21400000000003) >>> a = complex(2.5, 5.4) >>> pow(a, 3) (-203.07500000000002-56.21400000000003j)
Mandelbrot fraktál Fraktálok: kiindulva egy komplex számból, egy iterációs folyamat eredményeként a képernyőre kirajzolt pontok fraktál alakzatokat hozhatnak létre minél nagyobb az iteráció szám, annál jobb a kirajzolt kép minősége a Mandelbrot halmaz iterációs képlete: z 0 = c z n+1 = (z n) 2 + c, ahol a c komplex szám értéket a programozó álĺıtja be a Mandelbrot halmaz azokat a c komplex számokat fogja tartalmazni, amelyekre a z n sorozat nem tart a végtelenbe, a z n sorozat a végtelenbe tart, ha az abszolútértéke nagyobb lesz mint 2.
Algoritmusok Pythonban 4. feladat Határozzuk meg a Mandelbrot halmaz elemeit. Egy halmazbeli elem esetén rajzoljunk #-t a képernyőre, másképp space-t. def fman(): L1 = [a*0.07 for a in range (-15, 16)] L2 = [a*0.04 for a in range (-50, 26)] for y in L1: L = "" for x in L2: c = complex(x, y) z = c for i in range (40): z = z ** 2 + c if abs(z) > 2: L += " " break if abs(z) <= 2: L += "#" print (L)
Julia fraktál 5. feladat Határozzuk meg a Julia halmaz elemeit. A Julia halmaz iterációs képlete ugyanaz, mint a Mandelbrot halmazé, azzal a különbséggel, hogy a c értéke itt konstans, legyen c = 1 0.25i. def fjulia(): L1 = [a*0.07 for a in range (-15, 16)] L2 = [a*0.04 for a in range (-40, 36)] c = complex (-1, -0.25) for y in L1: L = "" for x in L2: z = complex(x, y) for i in range (40): z = z ** 2 + c if abs(z) > 2: L += " " break if abs(z) <= 2: L += "#" print (L)
Megjegyzések az L1, L2 intervallumokat módosíthatjuk, a kirajzolt alakzat nagyobb lesz: L1 = [a*0.05 for a in range (-20, 21)] L2 = [a*0.02 for a in range (-80, 31)] a grafikus megjelenítéshez használjuk a pygmae csomagot (lehet mást is): http://www.pygame.org/download.shtml a grafikus megjelenítés forrása: http://fractalart.gallery/mandelbrot-set-in-python-pygame
Mandelbrot fraktál, grafikus megjelenítés from pygame.locals import * import pygame def mainma(): width, height = 600, 600 screen = pygame.display.set_mode((width,height),doublebuf) xaxis = width / 1.5 yaxis = height / 2 scale = 190 iterations = 40 for iy in range(height): for ix in range(width): c = complex((ix - xaxis)/scale, (iy - yaxis)/scale) z = c
Mandelbrot fraktál, grafikus megjelenítés for i in range(iterations): z = z**2 + c if abs(z) > 2: color = (255, 255, 255) break #end for if abs(z) <= 2: color = (0, 0, 0) screen.set_at((ix, iy), color) screen.set_at((ix, height - iy), color) #end for, for pygame.display.update() while True: event = pygame.event.poll() if (event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE)): break #end def mainma() pygame.quit()
Mandelbrot fraktál
Julia fraktál, grafikus megjelenítés from pygame.locals import * import pygame def mainju(): width, height = 600, 600 screen = pygame.display.set_mode((width,height),doublebuf) xaxis = width / 2 yaxis = height / 2 scale = 170 iterations = 40 c = complex (0, -0.8) for iy in range(height): for ix in range(width): z = complex((ix - xaxis)/scale, (iy - yaxis)/scale) for i in range(iterations): z = z**2 + c if abs(z) > 2.0: color = (i%16, i%16*8, i%16*16) break #end for
Julia fraktál, grafikus megjelenítés if abs(z) <= 2: color = (0, 0, 0) screen.set_at((ix, iy), color) screen.set_at((width, height), color) #end for, for pygame.display.update() while True: event = pygame.event.poll() if (event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE)): break #end def mainju() pygame.quit()
Julia fraktál c = complex (0, -0.8) if abs(z) > 2.0: color = (i%16, i%16*8, i%16*16) break if abs(z) <= 2: color = (0, 0, 0)
Julia fraktál c = complex (-0.824, -0.17711) if abs(z) > 2.0: v = 765*i /40 if v > 510: color = (255, 255, v%255) elif v > 255: color = (255, v%255, 0) else: color = (v%255, 0, 0) if abs(z) <= 2: color = (0, 0, 0)
Julia fraktál További c értékek a Julia fraktálhoz: c = complex (0.285, 0.013) c = complex (-0.295, -0.55) c = complex (-0.63, -0.407) c = complex (-0.624, 0.435) c = complex (-1, -0.25) c = complex (-1, -0)
Számrendszerek egész számok: bármely 1-nél nagyobb számrendszerben ábrázolhatóak, a számítástechnikában gyakran használt számrendszerek: 10, 2, 8, 16, 256, 2-es számrendszer: bináris számrendszer, 8-as számrendszer: oktális számrendszer, 16-os számrendszer: hexadecimális számrendszer, legyen n az a szám, amit átszeretnénk írni b számrendszerbe, ekkor, Z -al jelölve a nem negatív egész számok halmazát: n = a k b k + a k 1 b k 1 + + a 1b 1 + a 0b 0, ahol k Z, a i Z, és a i < b, minden i {0,..., k} értékre és a k 0, 2-es számrendszerben 2 szimbólum van: 0, 1, 16-os számrendszerben 16 szimbólum van: 0, 1, 2,..., 9, A, B, C, D, E, F, 256-os számrendszerben 256 szimbólum van.
Számrendszerek, példák 2-es számrendszerben 2 szimbólum van: 0, 1, Pl. Mennyi (215) 10, 2-es számrendszerbeli alakja? fennáll: 215 = 128 + 64 + 16 + 4 + 2 + 1 = 1 2 7 + 1 2 6 + 0 2 5 + 1 2 4 + 0 2 3 + 1 2 2 + 1 2 1 + 1 2 0. tehát: (215) 10 = (1101 0111) 2. Pl. (1 0111 0010) 2, melyik 10-es számrendszerbeli számnak felel meg? fennáll: 1 2 8 + 0 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 0 2 3 + 0 2 2 + 1 2 1 + 0 2 0 = 256 + 64 + 32 + 16 + 2 = 370. tehát: (1 0111 0010) 2 = (370) 10.
Számrendszerek, példák 8-as számrendszerben 8 szimbólum van: 0, 1, 2, 3, 4, 5, 6, 7. Pl. Mi (215) 10, 8-as számrendszerbeli alakja? fennáll: 215 = 3 8 2 + 2 8 1 + 7 8 0 tehát: (215) 10 = (327) 8. Pl. (6702) 8, melyik 10-es számrendszerbeli számnak felel meg? fennáll: 6702 = 6 8 3 + 7 8 2 + 0 8 1 + 2 8 0 = 3072 + 448 + 2 = 3522. tehát: (6702) 8 = (3522) 10.
Számrendszerek, példák 16-as számrendszerben 16 szimbólum van: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Pl. Mi (7432) 10, 16-os számrendszerbeli alakja? fennáll: 7432 = 1 16 3 + 13 16 2 + 0 16 1 + 8 16 0 tehát: (7432) 10 = (1D08) 16. Pl. (E2D07) 16, melyik 10-es számrendszerbeli számnak felel meg? fennáll: E2D07 = 14 16 4 + 2 16 3 + 13 16 2 + 0 16 1 + 7 16 0 = 917504 + 8192 + 3328 + 7. tehát: (E2D07) 16 = (929031) 10.
Algoritmus: 10-es számrendszerből b számrendszerbe n-et elosztjuk b-vel, legyen az osztási egész rész q 0, a maradék a 0, ekkor fennáll: n = b q 0 + a 0, ahol 0 a 0 < b. q 0-ot elosztjuk b-vel, legyen az osztási egész rész q 1, a maradék a 1, ekkor fennáll : q 0 = b q 1 + a 1, ahol 0 a 1 < b. addig folytatjuk az osztást, amíg 0 osztási egész részt kapunk, a osztási folyamat során előállt maradékok alkotják a b számrendszerbeli számjegyeket: a k, a k 1,... a a, a 0 Pl. Alakítsuk át 7432-t 16-os számrendszerbe: 7432 = 464 16 + 8 464 = 29 16 + 0 29 = 1 16 + 13 1 = 0 16 + 1
Algoritmusok Pythonban 6. feladat Írjunk programot, amely átalakít egy számot 10-es számrendszerből b számrendszerbe. Az eredmény egy lista típusú adat lesz, amely tartalmazza a b számrendszerbeli számjegyeket. def conv_10b(nr, b): L = [] while nr > 0: L = [nr % b] + L nr = nr // b return L >>> conv_10b(14, 2) [1, 1, 1, 0] Ha az L = [nr % b] + L sor helyett az L = L + [nr % b] sort írjuk, akkor fordított sorrendet kapunk.
Algoritmusok Pythonban Ha az eredményt stringként akarom kezelni: def conv_10bstr(nr, b): L = while nr > 0: L = + str(nr % b) + L nr = nr // b return L >>> conv_10bstr(53428, 16) 13 0 11 4 >>> conv_10bstr(53428, 2) 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0