Diszkrét matematika 4. 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? számtartományok: racionális számok racionális számok irreducibilis alakja legnagyobb közös osztó algoritmusa - iteratív, rekurzív változatok racionális számok sorozatba rendezése - két módszer lánctörtek: a racionális számok lánctört jegyei a Farey sorozat
Miről lesz szó? 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
Függvények, paraméterátadás Pythonban def fof1(): db = 0 segedf1(db) print (db) def segedf1(x): x += 10 >>> fof1() 0 A fof1 függvényben nem látjuk, hogy a segedf1 függvényben megváltoztattuk a paraméter értékét.
Függvények, paraméterátadás Pythonban def fof2(): db = 0 db = segedf2(db) print (db) def segedf2(x): x += 10 return x >>> fof2() 10 A fof2 függvényben látjuk, hogy a segedf2 függvényben megváltoztattuk a paraméter értékét.
A decimal modul Próbáljuk ki az alábbi műveleteket: >>> 0.1 + 0.1-0.2 0.0 >>> 0.1 + 0.1 + 0.1 0.30000000000000004 >>> 0.1 + 0.1 + 0.1-0.3 5.551115123125783e-17 A Python bevezeti a Decimal típust, amely pontosabb számolást tesz lehetővé, a nem egész számok körében:
A decimal modul A Decimal típus a decimal modulban van definiálva, és a felhasználó által óhajtott pontossággal ábrázolja a lebegőpontos (valós) számokat: >>> from decimal import Decimal >>> 1/3 0.3333333333333333 >>> Decimal(1/3) Decimal( 0.333333333333333314829616256247390992939472198486328125 ) >>> Decimal( 0.3 ) Decimal( 0.3 ) >>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3) Decimal( 2.775557561565156540423631668E-17 ) >>> Decimal( 0.1 ) + Decimal( 0.1 ) + Decimal( 0.1 ) - Decimal( 0.3 ) Decimal( 0.0 )
A decimal modul A getcontext.prec() segítségével a tizedes jegyek számát adhatjuk meg. >>> from decimal import getcontext >>> x = Decimal(1) >>> y = Decimal(3) >>> getcontext().prec = 10 >>> x / y Decimal( 0.3333333333 ) >>> getcontext().prec = 25 >>> x / y Decimal( 0.3333333333333333333333333 ) Vegyük észre, hogy az int, a float, a string típusokból egyaránt létre lehet hozni Decimal típusú értéket.
Irracionális számok halmazjelölés: Q, azok a számok, melyek nem írhatóak fel két egész szám hányadosaként, azaz a végtelen, nem szakaszos tizedes törtek, híresebb irracionális számok: 2 = 1.4142..., π = 3.1415..., e = 2.7182..., φ = 1 + 5 = 1.6118..., az aranyarány. 2 a számítástechnika az irracionális számok közeĺıtett értékét tudja meghatározni az irracionális számok végtelen lánctörtek lánctörtek segítségével könnyedén meglehet határozni a közeĺıtett érték tízedesjegyeit
n értéke 1. feladat Határozzuk meg n értékét lánctörtek segítségével. A kiinduló képlet a következő, ahol a értéke egy akármilyen szám lehet: ha a = 1, akkor: n = 1 + 2 + n = a + n a 2 2 + n 1 n 1 a + n n 1 2 + n 1 2 +...
2 értéke 2. feladat Határozzuk meg 2 értékét lánctörtek segítségével. 2 = 1 + 1 from decimal import Decimal, getcontext def lanct_sqrt(): p = 500 getcontext().prec = 30 # 30 szamjegy temp = Decimal(0) for x in range (0, p): temp = 1 / (2 + temp) return 1 + temp 1 2 + 1 2 + 2 +... >>> lanct_sqrt() Decimal( 1.41421356237309504880168872421 )
A π szám a kör kerületének és átmérőjének hányadosa az eukleidészi geometriában más definíciók is léteznek, melyek kihagyják a kört irracionális és transzcendens szám (nincs olyan egész együtthatós polinom amelynek gyöke lenne) A π értékének meghatározására több lánctört-képlet is ismert: π = 1 + 3 + 4 1 2 2 2 5 + 32 7 +... π = 3 + 6 + 6 + 1 3 2 5 2 6 + 72 6 +...
A π szám 3. feladat Határozzuk meg π értékét lánctörtek segítségével. def lanct_pi(): p = 1000 getcontext().prec = 100 # 100 szamjegy temp = Decimal(0) for x in range (p + 1, 0, -1): a = x * x b = 2 * x + 1 temp = a / (b + temp) return 4 / (1 + temp) >>> lanct_pi() Decimal( 3.1415926535897932384626433832795028841971693993751058209 74944592307816406286208998628034825342117067 )
Az e szám irracionális és transzcendens szám többféleképpen lehet értelmezni: ( e = lim 1 + 1 ) n. n n e = 2 + 1 + 2 + 1 1 2 3 + 3 4 +...
A ϕ szám, aranymetszés, aranyarány (Golden Ratio) két mennyiség, a, b, a > b az aranymetszés szerint aránylik egymáshoz, ha fennáll: ϕ def = a b = a + b a a ϕ meghatározása érdekében feĺırhatjuk: a + b a = 1 + 1 a, azaz fennáll: b ϕ = 1 + 1 ϕ ϕ2 = ϕ + 1 megoldva a fenti egyenletet kapjuk, hogy ϕ = 1 + 5 2 a ϕ irracionális szám = 1.61803... és ˆϕ = 1 5 2 = 0.61803...
A ϕ szám, aranymetszés, aranyarány (Golden Ratio) építészet: Parthenon homlokzatának arányértékei: logok: Toyota, Mercedesz, stb. Pentagramma (szabályos ötszög): természet: napraforgó spirlajai piros zold = zold kek = kek lila = ϕ
A ϕ szám, aranymetszés, aranyarány (Golden Ratio) Kiindulva a ϕ = 1 + 1 ϕ összefüggésből, a ϕ értékét feĺırhatjuk a következőképpen is: ϕ = 1 + 1 + 1 + 1 1 1 1 + 1... Két egymás utáni Fibonacci szám arányaként is feĺırhatjuk a ϕ értékét: def fib_phi(n, m): f1 = 0 f2 = 1 for i in range(2, m): f = f1 + f2 if i >= n: print("{0:4d} {1:5d} {2:5d} {3:10,.6f}".format(i, f, f2, f/f2)) f1 = f2 f2 = f >>> fib_phi(10, 20)
Valós számok a racionális és irracionális számok halmaza halmazjelölés: R = Q Q egy szám egyszerre nem lehet racionális és irracionális is a valós számokhoz hozzárendelhető, egy mindkét irányban végtelen egyenes egy-egy pontja kommutatívitás, asszociatívítás, disztributívítás az egész számokkal ellentétben a valós számok halmaza nem megszámlálható a számítástechnikában nem valós mennyiségekkel dolgozunk, ezek egy közeĺıtő értéke lesz eltárolva: lebegőpontos ábrázolás
Valós számok A valós számok halmaza nem megszámlálható: feltételezzük, az ellenkezőjét, ha a valós számok halmaza megszámlálható lenne, akkor, a 0 és 1 közötti valós számok halmaza is megszámlálható lenne, létezik egy számsorozat, amelyet a 0 és 1 közötti valós számok alkotnak : r 1, r 2,..., r n,..., alkalmazzuk a következő ábrázolási módot: r 1 = 0.d 11d 12d 13d 14... r 2 = 0.d 21d 22d 23d 24... r 3 = 0.d 31d 32d 33d 34... r 4 = 0.d 41d 42d 43d 44.... ahol d ij {0, 1, 2,..., 9} ekkor az r = 0.d 1d 2d 3d 4... egy új valós szám lesz, { amely nem szerepel a 4 ha dii 4, fenti szabály szerint megadott listában, ahol d i = 5 ha d ii = 4.
Valós számok Példa: r 1 = 0.3567842... r 2 = 0.2146577... r 3 = 0.8945678... r 4 = 0.3452109.... A listában nem szereplő valós szám: 0.4454..., mert d 11 4, d 22 4, d 33 = 4, d 44 4,....
A sin(z) értéke 4. feladat Határozzuk meg sin(z) értékét lánctörtek segítségével. z sin(z) = z 2 1 + 2 3 z 2 2 3 z 2 + 4 5 z 2 4 5 z 2 + 6 7 z 2 +... def lanct_sin(z): p = 300 getcontext().prec = 50 temp = Decimal(0) for x in range (2*p, 0, -2): a = (x+2) * (x+3) - z*z b = x * (x+1) * z * z temp = b / (a + temp) temp = z*z / (2*3 - z*z + temp) return z / (1 + temp)
A sin(z) értéke >>> lanct_sin(60) Decimal( -0.30481062110221670562576204186131345751440565822218 ) >>> import math >>> math.sin(60) -0.3048106211022167 >>> math.sqrt(3)/2 0.8660254037844386 Mi a probléma? Miért nem a helyes eredményt kapjuk? >>> math.sin(60 * math.pi/180) 0.8660254037844386 >>> math.sin(math.radians(60)) 0.8660254037844386 A paraméterként megadott értéket át kell alakítani radiánba!
A sin(z) értéke Átalakítjuk a szöget radián-ba: from math import radians, pi def lanct_sinr(z): p = 300 getcontext().prec = 50 z = Decimal(z * pi/180) #z = Decimal(radians(z)) temp = Decimal(0) for x in range (2*p, 0, -2): a = (x+2) * (x+3) - z*z b = x * (x+1) * z * z temp = b / (a + temp) temp = z*z / (2*3-z*z + temp) return z / (1 + temp) >>> lanct_sinr(60) Decimal( 0.86602540378443858934550903079182617193526553351420 )
Az ln(z) értéke 5. feladat Határozzuk meg ln(z) értékét lánctörtek segítségével. ln(1 + z) = 1 + 2 + 3 + z 1 2 z 4 + 1 2 z 2 2 z 2 2 z 5 + 32 z 6 +... def lanct_log(z, p, szj): z -= 1 getcontext().prec = szj temp = Decimal(0) for x in range (p, 0, -1): t = (x + 1) // 2 a = x + 1 b = t * t * z temp = b / (a + temp) return z / (1 + temp)
Az ln(z) értéke >>> lanct_log(2) Decimal( 0.69314718055994530940 ) >>> import math >>> math.log(2) 0.6931471805599453 >>> lanct_log(decimal(math.e)) Decimal( 0.99999999999999994681 ) >>> math.log(math.e) 1.0
Az ln(z) értéke A ln(z) értékének meghatározásához használhatóak a következő összefüggések is ln (z) = (z 1) (z 1)2 2 ln (z) = lim n n (z 1/n 1) + (z 1)3 3 (z 1)4 4 = ( 1) n+1 (z 1) n n n=1 def ln(z): getcontext().prec = 60 n = 10 ** 40 exp = Decimal(1) / n return n * ( (z ** exp) - 1) >>> ln(2) Decimal( 0.693147180559945309400000000000000000000000000000000000000 )
A n értéke Newton féle módszerrel 6. feladat Határozzuk meg n értékét a Newton féle módszerrel. x 0 = 1 x i+1 = 1 (x 2 i + n ) x i from decimal import Decimal, getcontext def my_sqrt(n): getcontext().prec = 100 n = Decimal(n) x0 = 1 while True: xi = (x0 + n/x0) / 2 if xi == x0: return xi x0 = xi
A k n értéke Newton féle módszerrel Általános esetben a k n értéke: x i+1 = 1 [ (k 1) x i + n ], ahol x k x k 1 0 = 1. i ha k = 2, akkor a négyzetgyök meghatározásának képletét kapjuk: x i+1 = 1 (x 2 i + n ) x i a beépített operátorral is dolgozhatunk: >>> 10 ** 0.5 3.1622776601683795 >>> from decimal import Decimal, getcontext >>> getcontext().prec = 100 >>> 10 ** Decimal( 0.5 ) Decimal( 3.16227766016837933199889354443271853371955513932521682685... )