Použití jazyka Python pro realizaci výpočtů a aplikací Počítače byly původně určeny pouze pro matematické výpočty. V následujícím textu jsou publikovány praktické příklady ilustrující spojení počítačových předmětů (programování a programové vybavení) s předměty elektrotechnické specializace (základy elektrotechniky) a matematiky. Pro každý program je uveden výsledek běhu programu s vloženými vstupními daty. Následující ukázka použití jazyka Python ilustruje vzájemně propojování vyučování odborných předmětů na naší škole. Výpočet kvadratické rovnice Příklad: program pro realizaci výpočtu kvadratické rovnice: "program pro vypocet kvadraticke rovnice " import math # připojení matematické knihovny a = float (raw_input("zadej a ")) # vstup hodnoty a b = float (raw_input("zadej b ")) # vstup hodnoty b c = float (raw_input("zadej c ")) # vstup hodnoty c d= b*b - 4*a*c # výpočet diskriminantu d1=math.sqrt(d) # vyvolání funkce druhé odmocniny x1 = ((-1)*b +d1)/(2*a) # výpočet kořene x1 x2 = ((-1)*b -d1)/(2*a) # výpočet kořene x2 "x1= ",x1 # výstup kořene x1 "x2= ",x2 # výstup kořene x2 Zde je výsledek z běhu programu: Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 IDLE 1.0.3 ======================== RESTART ================================ program pro vypocet kvadraticke rovnice zadej a 1 zadej b 5 zadej c 4 x1= -1.0 x2= 0.333333333333 Výše uvedený program neřeší situaci, kdy diskriminant vyjde záporně. Python nemůže odmocnit záporné číslo a program skončí chybou: Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 1
IDLE 1.0.3 ======================== RESTART ================================ program pro vypocet kvadraticke rovnice zadej a 3 zadej b 3 zadej c 3 Traceback (most recent call last): File "E:\Python23\kv.py", line 7, in -topleveld1=math.sqrt(d) ValueError: math domain error Kromě knihovny math lze použít knihovnu pro práci s komplexními čísly cmath. Tím se podstatně zjednoduší některé výpočty, například výpočet kvadratické rovnice, kdy není potřeba rozhodovat, zda determinant je záporný či nikoliv. Veškeré funkce knihovny math zde mají své protějšky (například sqrt sqrt apod.) Jednoduchou modifikací předchozího programu pro výpočet kvadratické rovnice zajistíme jeho spolehlivou činnost i při záporném diskriminantu: Zde je výsledek: "program pro vypocet kvadraticke rovnice " import cmath a = float(raw_input("zadej a ")) b = float (raw_input("zadej b")) c = float (raw_input("zadej c")) d= b*b - 4*a*c d1=cmath.sqrt(d) x1 = (-1*b +d1)/(2*a) x2 = (-1 +b -d1)/(2*a) "x1= ",x1 "x2= ",x2 Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 IDLE 1.0.3 ======================== RESTART ================================ program pro vypocet kvadraticke rovnice zadej a 3 zadej b 3 zadej c 3 x1= (-0.5+0.866025403784j) x2= (0.4-1.03923048454j) 2
Výpočet soustavy lineárních rovnic Důležitou úlohou v numerické matematice je řešení soustavy lineárních rovnic. Často je tato úloha řešena pomocí Cramerova pravidla. Příklad: řešení matice 3x3: import string "program pro vypocet soustavy 3 linearnich rovnic o trech neznamych" "program pro vypocet soustavy rovnic - cramerovo pravidlo" "zadej matici po jednotlivych radcich vcetne pravych stran " "jednotliva data jsou oddelena carkami " a1=raw_input("zadej prvni radek ") a2=raw_input("zadej druhy radek ") a3=raw_input("zadej treti radek ") ay1=string.split(a1,",") # rozdělení 1. řádku podle čárky ay2=string.split(a2,",") # rozdělení 2. řádku podle čárky ay3=string.split(a3,",") # rozdělení 3. řádku podle čárky a11=float (ay1[0]) # převod řetězce ne číslo typu real a12=float (ay1[1]) a13=float (ay1[2]) b1=float (ay1[3]) a21=float (ay2[0]) a22=float (ay2[1]) a23=float (ay2[2]) b2=float (ay2[3]) a31=float (ay3[0]) a32=float (ay3[1]) a33=float (ay3[2]) b3=float (ay3[3]) def determinant (a11,a21,a31,a12,a22,a32,a13,a23,a33): a=a11*a22*a33+a12*a23*a31+a13*a21*a32-a13*a22*a31- a12*a21*a33 a=a-a11*a23*a32 return (a) # funkce pro výpočet determinantu deta=determinant(a11,a21,a31,a12,a22,a32,a13,a23,a33) deta1=determinant(b1,b2,b3,a12,a22,a32,a13,a23,a33) #vyvolání funkce deta2=determinant(a11,a21,a31,b1,b2,b3,a13,a23,a33) deta3=determinant(a11,a21,a31,a12,a22,a32,b1,b2,b3) x=deta1/deta y=deta2/deta z=deta3/deta "vysledek x= ",x,"y= ",y,"z=",z "konec programu " Výpis běhu programu: program pro vypocet soustavy 3 linearnich rovnic o trech neznamych program pro vypocet soustavy rovnic - cramerovo pravidlo zadej matici po jednotlivych radcich vcetne pravych stran jednotliva data jsou oddelena carkami zadej prvni radek 1,2,3,5 zadej druhy radek 5,-1,-7,8 zadej treti radek 7,-2,-1,23 vysledek x= 3.18181818182 y= -1.0 z= 1.27272727273 konec programu 3
Šifrovací metody Pod pojmem šifrování si představme kódování zprávy tak, aby její význam byl k dispozici pouze příjemci této zprávy. V praxi je již zmíněný pojem obtížně realizovatelný, neboť lze předpokládat, že i jiný subjekt se pokusí zprávu dekódovat. O tom, zda se mu to podaří, či ne rozhoduje několik faktorů: 1) kvalita šifry z hlediska možných útoků 2) dostupnost špičkové výpočetní techniky (rychlý superpočítač) 3) schopný tým analytiků a programátorů Z literatury jsou známy případy použití různých metod. Historicky nejstarším prvkem je tzv. Caesarova šifra. Z doby druhé světové války uvedeme dva příklady různého přístupu k šifrování. V Německu se používal k šifrování stroj Enigma. Zmíněný stroj pracoval na elektromechanickém principu: pomocí relé a krokových mechanismů se natáčely mechanické kódové kotoučky, které prováděly vlastní kódování zprávy zapsané z klávesnice tohoto stroje. Na svoji dobu to bylo velmi pokročilé zařízení. Pro dekódování této šifry silou byl zkonstruován elektronkový počítač pod označením ABC. Ještě před jeho spuštěním do operačního provozu se Spojeneckým vojskům se podařilo získat jeden stroj Enigma. Analýzou tohoto zařízení byla šifra prolomena. Druhý způsob šifrování použila americké armáda zhruba ve stejném období. Použila k němu řeč kmene indiánů Navajo. V té době tuto řeč ovládalo cca 100 příslušníků tohoto kmene. Je zajímavé, že tato v principu jednoduchá šifrovací metoda nebyla rozluštěna během celé druhé světové války. Šifrování pomocí posunutí: Jedná se v principu o jednoduchou šifru, kde posunutí určuje, za jaký znak se má původní znak nahradit. Příklad: při posunutí o 1 se původní text ahoj změní na bipk. Tato šifra je jednoduchá, její realizace se dá provést rychle. Má však jeden zásadní problém. Její rozluštění je při použití například českého jazyka jednoduché, neboť v tomto jazyku je v libovolném textu statisticky největší výskyt samohlásek e, a. Tím se dá text poměrně rychle rozluštit. Tato šifra však dává upokojivé výsledky při použití ostatních znaků například čísel. Příklad použití: x="" "sifrovani textu pomoci posunuti" a= int(raw_input("zadej hodnotu posunuti ")) b=raw_input("zadej text") for i in range (len(b)): y= ord(b[i]) #převod znaku na ASCII f=int(y)+a #výpočet posunutí v ASCII v=chr(f) #převod kódu ASCII na znak x=x+v #skládání do výstupní proměnné "vstupni text :",b # výsledný tisk "vysledny text:",x 4
Výpis běhu programu: Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 IDLE 1.0.3 ======================== RESTART ================================ sifrovani textu pomoci posunuti zadej hodnotu posunuti 2 zadej textahoj vstupni text : ahoj vysledny text: cjql Program využívá skutečnosti, která je definována tabulkou ASCII. Zde jsou všem znakům přiřazena pořadová čísla (adresy). Například po znaku a následuje znak b, po znaku b znak c atd.. Vstupní text musíme nejprve převést na pořadová čísla. To nám zabezpečí funkce ord. Tato funkce však vrací hodnotu typu řetězec. Použitím funkce int získáme z řetězce číslo. K tomuto číslu přičteme hodnotu posunutí a převedeme ho zpět pomocí funkce chr na znak. Znaky výstupního řetězce postupně načítáme do výsledného řetězce pomocí funkce chr. Příklad: program pro dešifrování: x="" "desifrovani textu pomoci posunuti" a= int(raw_input("zadej hodnotu posunuti ")) b=raw_input("zadej text") for i in range (len(b)): y= ord(b[i]) # převod znaku na kód ASCII f=int(y)-a # výpočet v=chr(f) # zpětný převod na znak x=x+v "vstupni text :",b "vysledny text:",x Výpis běhu programu: Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 5
IDLE 1.0.3 ======================== RESTART ================================ desifrovani textu pomoci posunuti zadej hodnotu posunuti 2 zadej textcjql vstupni text : cjql vysledny text: ahoj Program pracuje oproti předchozímu inverzně. Přečte znak, převede ho na číslo, pak z něj odečte hodnotu posunutí, převede zpět na znak. Toto udělá pro každý znak vstupního řetězce. Dobré možnosti při kódování zabezpečuje funkce XOR. Je to funkce nonekvivalence (součet modulo 2). X Y Výstup 0 0 0 0 1 1 1 0 1 1 1 0 Příklad: program, který šifruje na základě použití funkce XOR: a="abcdefghijkl" klic= "bcdesg" x1="" x2="" " vstupni text ",a " klic ",klic "data prevedena do ASCII" for i in range(len(a)): d=ord (a[i]) c=str (d) x1=x1+c x1 for i in range(len(klic)): t=ord (klic[i]) r=str (t) x2=x2+r x2 e=int(x1)^int(x2) # provedení funkce XOR f=e^int(x2) g=str(e) # převedení na znak h=str(f) "vysledek =",g "pro kontrolu xor s vysledkem ma dat puvodni text" h "konec programu" 6
Výpis běhu programu: Python2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit(intel)]on win32 IDLE 1.0.3 ======================== RESTART ================================ vstupni text abcdefghijkl klic bcdesg data prevedena do ASCII 979899100101102103104105106107108 9899100101115103 vysledek = 979899100101102094918429092648507 pro kontrolu xor s vysledkem ma dat puvodni text 979899100101102103104105106107108 konec programu Popis: program postupně převede jednotlivé vstupní znaky na číselný kód ASCII, totéž provede i s klíčem. Následně provede funkci XOR mezi klíčem a vstupními daty. Z funkce vyplývá poměrně zajímavý výsledek. Tím je, že nové provedení funkce xor mezi výslednými daty a původním klíčem dává zpět původní data. Převod mezi dvěma hodnotami Příklad: následující program převádí mezi stupni celsia a stupni kelvina: "prevod stupňů celsia na stupně kelvina" a=float(raw_input("zadej hodnotu ve stupních celsia ")) "hodnota ve stupních kelvina je ",a+273.15 Výsledek běhu programu: Python2.6(r26:66721, Oct 2 2008,11:35:03)[MSC v.1500 32 bit(intel)]on win32 ============================== RESTART ================================ prevod stupnu celsia na stupne kelvina zadej hodnotu ve stupních celsia 0 hodnota ve stupních kelvina je 273.15 7
Použití programovacího jazyka Python pro základní elektrotechnické výpočty a) sériové řazení odporů "vypocet seriove kombinace odporu " a= int(raw_input("zadej pocet soucastek ")) suma=0 for i in range (a): b=float(raw_input("zadej hodnotu soucastky v ohmech ")) suma = suma+b " vysledna hodnota odporu je ",suma," ohmů" Výsledek běhu programu: Python2.6(r26:66721, Oct 2 2008,11:35:03)[MSC v.1500 32 bit(intel)]on win32 vypocet seriove kombinace odporu zadej pocet soucastek 3 zadej hodnotu soucastky v ohmech 5 zadej hodnotu soucastky v ohmech 100 zadej hodnotu soucastky v ohmech 120 vysledna hodnota odporu je 225.0 ohmù b) paralelní řazení odporů "vypocet paralelni kombinace odporu " a= int(raw_input("zadej pocet soucastek ")) suma=0 for i in range (a): b=float(raw_input("zadej hodnotu soucastky v ohmech ")) c=1/b suma = suma+c " vysledna hodnota odporu je ",1/suma," ohmů" 8
Výsledek běhu programu: Python2.6(r26:66721, Oct2 2008, 11:35:03)[MSC v.1500 32 bit(intel)]on win32 ============================== RESTART ================================ vypocet paralelni kombinace odporu zadej pocet soucastek 3 zadej hodnotu soucastky v ohmech 6 zadej hodnotu soucastky v ohmech 6 zadej hodnotu soucastky v ohmech 6 vysledna hodnota odporu je 2.0 ohmù c) výpočet impedance (cívka) import math "vypocet impedance civky " l= float(raw_input("zadej hodnotu civky v H ")) f= float(raw_input("zadej hodnotu frekvence v Hz ")) z=2*math.pi*f*l " impedance je ",z," ohmů" Výsledek běhu programu: Python2.6(r26:66721, Oct2 2008, 11:35:03)[MSC v.1500 32 bit(intel)]on win32 ============================== RESTART ================================ vypocet impedance civky zadej hodnotu civky v H 5e-3 zadej hodnotu frekvence v Hz 2e6 impedance je 62831.8530718 ohmù 9
d) výpočet impedance (kondenzátor) import math "vypocet impedance a admitance kondenzatoru " c= float(raw_input("zadej hodnotu kondenzatoru v F ")) f= float(raw_input("zadej hodnotu frekvence v Hz ")) y=2*math.pi*f*c z=1/y " impedance je ",z," ohmù" "admitance je ",y," S" Výsledek běhu programu: Python2.6(r26:66721,Oct 2 2008,11:35:03)[MSC v.1500 32 bit (Intel)]on win32 ============================== RESTART ================================ vypocet impedance a admitance kondenzatoru zadej hodnotu kondenzatoru v F 5e-6 zadej hodnotu frekvence v Hz 1000 impedance je 31.8309886184 ohmù admitance je 0.0314159265359 S e) výpočet přechodového jevu RC import math " vypocet prechodoveho jevu prubeh napeti a proudu" "při nabijeni a vybíjení kondenzátoru" u=float(raw_input("zadej hodnotu stejnosměrného napětí ve V ")) r=float(raw_input("zadej hodnotu odporu v ohmech ")) c=float(raw_input("zadej hodnotu kondenzatoru ve F ")) cas=float(raw_input("zadej dobu sledování v sec. ")) cas1=float(raw_input("zadej krok sledování ")) t=0.00000000 tau=r*c i=u/r " ","cas"," ","U"," ","I" "0.0 ","0.00000000000"," ",u/r while t<=cas: t=t+cas1 uvyst=u*(1-(math.exp(-1.0*(t/tau)))) ivyst=i*(math.exp(-1.0*(t/tau))) t," ",uvyst," ",ivyst 10
Výsledek běhu programu: Python2.6(r26:66721, Oct 2 2008,11:35:03)[MSC v.1500 32 bit(intel)]on win32 ============================== RESTART ================================ vypocet prechodoveho jevu prubeh napeti a proudu při nabijeni a vybíjení kondenzátoru zadej hodnotu stejnosměrného napětí ve V 10 zadej hodnotu odporu v ohmech 1 zadej hodnotu kondenzatoru ve F.5 zadej dobu sledování v sec. 9 zadej krok sledování.1 cas U I 0.0 0.00000000000 10.0 0.1 1.81269246922 8.18730753078 0.2 3.29679953964 6.70320046036 0.3 4.51188363906 5.48811636094 0.4 5.50671035883 4.49328964117 0.5 6.32120558829 3.67879441171 0.6 6.98805788088 3.01194211912 0.7 7.53403036058 2.46596963942 0.8 7.98103482005 2.01896517995 0.9 8.34701111778 1.65298888222 1.0 8.64664716763 1.35335283237 1.1 8.89196841638 1.10803158362 1.2 9.09282046711 0.907179532894 1.3 9.25726421786 0.742735782143 1.4 9.39189937375 0.608100626252 1.5 9.50212931632 0.497870683679 1.6 9.59237796022 0.407622039784 1.7 9.66626730040 0.333732699603 1.8 9.72676277553 0.273237224473 1.9 9.77629228144 0.223707718562 2.0 9.81684361111 0.183156388887 2.1 9.85004423180 0.149955768205 2.2 9.87722660097 0.122773399031 2.3 9.89948164255 0.100518357446 2.4 9.91770252951 0.0822974704902 2.5 9.93262053001 0.0673794699909 2.6 9.94483435579 0.0551656442076 2.7 9.95483419057 0.0451658094261 2.8 9.96302136284 0.0369786371648 2.9 9.96972445255 0.0302755474538 3.0 9.97521247823 0.0247875217667 3.1 9.97970569364 0.020294306363 3.2 9.98338442727 0.0166155727317 3.3 9.98639631962 0.0136036803755 3.4 9.98886224852 0.0111377514784 3.5 9.99088118034 0.00911881965555 11
3.6 9.99253414192 0.00746585808377 3.7 9.99388747239 0.0061125276113 3.8 9.99499548567 0.00500451433441 3.9 9.99590265021 0.0040973497898 4.0 9.99664537372 0.00335462627903 4.1 9.99725346430 0.00274653569972 4.2 9.99775132676 0.00224867324179 4.3 9.99815894206 0.00184105793668 4.4 9.99849266925 0.00150733075095 4.5 9.99876590196 0.00123409804087 4.6 9.99898960598 0.00101039401837 4.7 9.99917275934 0.000827240655566 4.8 9.99932271264 0.000677287364909 4.9 9.99944548401 0.000554515994322 5.0 9.99954600070 0.000453999297625 5.1 9.99962829681 0.000371703186841 5.2 9.99969567517 0.000304324830084 5.3 9.99975083990 0.000249160097315 5.4 9.99979600497 0.000203995034112 5.5 9.99983298299 0.000167017007902 5.6 9.99986325804 0.000136741960657 5.7 9.99988804515 0.000111954848426 5.8 9.99990833912 9.16608773625e-05 5.9 9.99992495442 7.50455791508e-05 6.0 9.99993855788 6.14421235333e-05 6.1 9.99994969544 5.03045560711e-05 6.2 9.99995881411 4.11858870754e-05 6.3 9.99996627985 3.37201523414e-05 6.4 9.99997239227 2.76077257204e-05 6.5 9.99997739671 2.26032940698e-05 6.6 9.99998149399 1.85060119758e-05 6.7 9.99998484856 1.51514411214e-05 6.8 9.99998759505 1.24049507996e-05 6.9 9.99998984369 1.015631471e-05 7.0 9.99999168471 8.31528719104e-06 7.1 9.99999319202 6.80798134398e-06 7.2 9.99999442610 5.57390369269e-06 7.3 9.99999543647 4.5635263679e-06 7.4 9.99999626370 3.73629937989e-06 7.5 9.99999694098 3.05902320502e-06 7.6 9.99999749548 2.50451637233e-06 7.7 9.99999794948 2.05052457561e-06 7.8 9.99999832117 1.67882753e-06 7.9 9.99999862549 1.37450772792e-06 8.0 9.99999887465 1.12535174719e-06 8.1 9.99999907864 9.21360083457e-07 8.2 9.99999924565 7.54345834984e-07 8.3 9.99999938239 6.17606133558e-07 8.4 9.99999949435 5.05653134834e-07 8.5 9.99999958601 4.13993771879e-07 8.6 9.99999966105 3.3894943262e-07 8.7 9.99999972249 2.77508324224e-07 8.8 9.99999977280 2.27204599277e-07 8.9 9.99999981398 1.86019392669e-07 9.0 9.99999984770 1.52299797447e-07 9.1 9.99999987531 1.24692527858e-07 12
f) výpočet nezatíženého děliče napětí " vypocet vystupniho napeti na nezatizenem delici napeti" r1=float(raw_input("zadej hodnotu r1 v ohmech ")) r2=float(raw_input("zadej hodnotu r2 v ohmech ")) u=float(raw_input("zadej hodnotu vstupniho napeti ve V ")) uvyst=u*r2/(r1+r2) "Vystupni hodnota napeti je ",uvyst,"v" Výsledek běhu programu: Python2.6(r26:66721, Oct2 2008,11:35:03)[MSC v.1500 32 bit (Intel)]on win32 ============================== RESTART ================================ vypocet vystupniho napeti na nezatizenem delici napeti zadej hodnotu r1 v ohmech 6 zadej hodnotu r2 v ohmech 6 zadej hodnotu vstupniho napeti ve V 10 Vystupni hodnota napeti je 5.0 V g) výpočet zatíženého děliče napětí "zatizeny delic napeti" u=float(raw_input("zadej napajeci napeti ve V ")) r1=float(raw_input("zadej odpor R1 v ohmech ")) r2=float(raw_input("zadej odpor R2 v ohmech ")) rz=float(raw_input("zadej odpor RZ v ohmech ")) r=r1+(r1*rz)/(r2+rz) i=u/r uv = u* (r2*rz)/(r1*r2+rz*r2+r1*rz) "vystupni proud ",i,"a" "vystupni napeti ",uv,"v" konec vypoctu 13
Výsledek běhu programu: Python2.6(r26:66721, Oct2 2008,11:35:03)[MSC v.1500 32 bit (Intel)]on win32 ============================== RESTART ================================ zatizeny delic napeti zadej napajeci napeti ve V 10 zadej odpor R1 v ohmech 10000 zadej odpor R2 v ohmech 10000 zadej odpor RZ v ohmech 80000 vystupni proud 0.000529411764706 A vystupni napeti 4.70588235294 V konec vypoctu h) výpočet rezonance import math "vypocet rezonancniho kmitoctu " c= float(raw_input("zadej hodnotu kondenzatoru v F ")) l= float(raw_input("zadej hodnotu civky v H ")) f=1/(2*math.pi*math.sqrt(l*c)) " rezonancni kmitocet je ",f,"hz" Výsledek běhu programu: Python2.6 r26:66721,oct 2 2008,11:35:03)[MSC v.1500 32 bit (Intel)]on win32 ============================== RESTART ================================ vypocet rezonancniho kmitoctu zadej hodnotu kondenzatoru v F 1e-6 zadej hodnotu civky v H 1e-8 rezonancni kmitocet je 1591549.43092 Hz 14
Použitá literatura: Skalická, Škop Python, učební texty SPŠE, V Úžlabině 320, rok 2007 Skalická,Škop Python - rozšířené vydání, učební texty SPŠE, V Úžlabině 320, rok 2008 Škop Výuka programování na střední škole, Závěrečná práce studia DPS, Pedf UK, rok 2008 15