Programování 2 pro matematiky

Ve školním roce 2024/2025 vedeme společně s Pavlem Töpferem cvičení z matematického Programování 2. Cvičení má dvě části: praktickou ve středu od 10:40 v N11 (tu vedu já) a teoretickou v úterý od 17:20 v N11 (vede Pavel).

Budu rád, když se mi budete ozývat. Když vám cokoliv nepůjde, nestyďte se říci si o radu. Když vám něco půjde, nestyďte se pochlubit se :) Napište mi mail na mares+p2m@kam.mff.cuni.cz, případně si můžeme domluvit konzultaci. Také jsem k zastižení na Matrixu jako @mj:matrix.ucw.cz a na Telegramu jako @golluxino.

K získání zápočtu je potřeba:

Co jsme dělali

datum téma
19. 2. Základní aritmetické algoritmy pracující po číslicích (vzpomínka na základní školu):
  • Součet, rozdíl a součin (program)
  • Porovnáváni (větší/menší/rovno)
  • Dělení (jednodušší: dělíme malým číslem)
  • Výpočet Eulerova čísla: Σn≥0 1/n!.
26. 2. Co se nestihlo v Programování 1:
  • Výklad: Třídy a objekty
  • Příklad definice třídy. Dodělejte do něj:
    • Naučte každé zvíře slyšet navíc na jméno potvůrka.
    • Doplňte atribut pozice a zařiďte, aby zvíře slyšelo na jméno jenom tehdy, když pozice je doma.
    • Vytvořte odvozenou třídu Pes, jehož metoda ozvi_se na každé druhé zavolání zaštěká a jinak zavrčí.
5. 3.
  • Opakování z Programování 1: Výjimky.
  • Pokračování tříd a objektů z minula.
  • Nadefinujte třídu Rect reprezentující obdélníky v rovině (viz domácí úkol).
  • Nadefinujte třídu RoundRect odvozenou od Rect pro obdélníky se zakulacenými rohy (s jednotkovým poloměrem; předpokládejme že délky všech stran jsou alespoň 2). Předefinujte metody, aby dávaly smysl.
  • Naučte metodu __eq__, aby vracela False, pokud porovnává s něčím, co není Rect, případně RoundRect. Může se hodit isinstance.
  • Nadefinujte třídu Zlomek pro zlomky:
    • Třída má atributy a a b pro čitatele a jmenovatele.
    • Přidejte metody __str__ a __repr__ pro převod na řetězec.
    • Přidejte metody pro aritmetické operátory: __add__, __sub__, __mul__, __truediv__ (operátor /), __neg__ (unární -), __pos__ (unární +).
    • Přidejte metody pro porovnávání: __eq__ (operátor ==), __lt__ (operátor <), __gt__ (operátor >). Pozor na to, že 3/4 se mají rovnat i -6/-8.
    • Při pokusu o vytvoření zlomku s nulovým jmenovatelem nebo dělení nulou vyhlašte výjimku: raise ValueError("Nějaká zpráva").
    • Při vytvoření zlomku a po každé operaci zlomek zkraťte a normalizujte, aby byl jmenovatel kladný.
    • Aritmetika by mohla umět zlomek+int.
    • Co případy int+zlomek? Tady se hodí reverzní metody __radd__ apod., viz dokumentace.
12. 3.
18. 3. Plán:
  • Slidy: NumPy
  • Instalace NumPy pod Windows:
    • Vlezte si do adresáře, kde máte nainstalovaný Python (typicky to bývá něco jako C:\Users\Jméno\AppData\Local\Programs\Python\Python37-32; kdybyste ho nemohli najít, hledejte, kde na disku máte python.exe).
    • Spusťte python -m pip install numpy.
  • Dokumentace k NumPy:
  • Úkoly (snažte se používat jenom operace s poli, žádné cykly):
    • Vyrobte matici tvaru R×S vyplněnou číslem X.
    • Vyrobte matici tvaru R×S, která má na okrajích jedničky a jinde nuly.
    • Vyrobte matici tvaru R×S, která bude mít v i-tém řádku samá čísla i.
    • Spočítejte determinant 10 matic 10×10 vyplněných náhodnými čísly mezi -1 a 1 (viz np.linalg.det)
    • Uvažujme „průměrovací Fibonacciho čísla“ definovaná rekurentním vztahem xi = (xi-1 + xi-2) / 2. Víme-li, že x8=426 a x9=427, kolik je x0 a x1? Vyřešte soustavu lineárních rovnic pomocí np.linalg.solve. Pro výrobu matic s jedničkami na posunuté diagonále se hodí np.eye.
    • Pokusy s dělitelností:
      • Vyrobte booleovskou matici, která má na pozici (i,j) True právě tehdy, je-li i dělitelné j.
      • Vyrobte vektor, který pro každé číslo od 1 do N uvádí počet jeho dělitelů.
      • Vyrobte vektor všech prvočísel mezi 1 a N.
26. 3. Cvičení se nekoná.

Odkazy

Stránku spravuje Martin Mareš