Autorzy: Piotr Biegański, Julia Jakubowska, Adam Kardasz
1. Wprowadzenie
1.1 Liczby podzielne przez 7
Twoim zadaniem jest wylosowanie liczb całkowitych z zakresu od do , a następnie podzielenie ich na dwa oddzielne zbiory – na liczby podzielne przez i niepodzielne przez . Powstałe tak zbiory posortuj rosnąco i wypisz w konsoli wraz z długością każdego zbioru. Przykładowy wynik działania programu:
Wylosowane liczby dla N = 10:
[423 633 403 427 785 22 301 595 956 55]
Liczby podzielne przez 7:
[301, 427, 595], wielkosc zbioru: 3
Liczby niepodzielne przez 7:
[22, 55, 403, 423, 633, 785, 956], wielkosc zbioru: 7
Wskazówka: skorzystaj z tej funkcji w numpy do losowania liczb całkowitych:
1.2 Dzielniki sumy liczb
Wprowadź dwie dowolne liczby całkowite w konsoli. Następnie wyznacz wszystkie dzielniki ich sumy i wypisz je na ekran, przy czym każdy dzielnik może zostać wypisany tylko raz.
1.3 Kombinacje cyfr
Wprowadź do programu 3 dowolne cyfry (jako 3 oddzielne zmienne). Następnie, napisz program, który ułoży i wypisze wszystkie możliwe liczby, które mogą powstać przy jednokrotnym użyciu podanych cyfr. Przykład:
a = 1, b = 2, c = 4
Mozliwe kombinacje cyfr:
1, 2, 4, 12, 14, 21, 24, 124, 142, 214, 241, 412, 421
1.4 Trójkąt Pascala
Twoim zadaniem jest stworzenie programu, który generuje i wyświetla Trójkąt Pascala dla zadanej liczby wierszy. Trójkąt Pascala jest trójkątną tablicą liczb binarnych, w której na szczycie znajduje się 1, a każda liczba w trójkącie jest sumą dwóch liczb bezpośrednio nad nią.
Specyfikacja
-
Program powinien zapytać użytkownika o liczbę wierszy , dla których Trójkąt Pascala ma zostać wygenerowany.
-
Dla podanej liczby wierszy , program powinien wygenerować i wyświetlić Trójkąt Pascala.
-
Liczby w każdym wierszu powinny być rozdzielone spacjami. Trójkąt powinien być wyśrodkowany, tak aby wyglądał jak trójkąt, a nie jak schody.
-
Program powinien obsługiwać błędy wejścia, takie jak wprowadzenie niepoprawnej liczby.
Przykład
Dla , Trójkąt Pascala powinien wyglądać następująco:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Wskazówki
-
Wykorzystaj właściwości kombinatoryczne Trójkąta Pascala.
-
Możesz użyć dwuwymiarowej tablicy do przechowywania wartości trójkąta i wypełnić ją iteracyjnie.
-
Aby trójkąt był wyśrodkowany, liczba spacji przed pierwszą liczbą w każdym wierszu powinna maleć z każdym kolejnym wierszem.
1.5 H4CK3R5P33CH
Specyfikacja
Celem zadania Hackerspeech jest stworzenie programu, który konwertuje podane słowa lub zdania na tzw. hackerspeech, gdzie niektóre litery są zamieniane na cyfry, a pozostałe są zamieniane na wielkie litery.
Przykładowe dane i wyniki
Przykład 1:
Wejście: "white_pony"
Wyjście: "WH173_P0NY"
Przykład 2:
Wejście: "Hackerspeech"
Wyjście: "H4CK3R5P33CH"
Wskazówki
Poniżej znajduje się tabela alfabetu hackerspeech dla ułatwienia implementacji:
Litera Hackerspeech
a 4
e 3
i 1
o 0
s 5
t 7
z 2
pozostałe CAPSLOCK
1.6 Cezar
Specyfikacja
Celem zadania jest stworzenie programu implementującego szyfr Cezara, który używa kodowania ASCII do szyfrowania i deszyfrowania tekstu. Użytkownik podaje dwa parametry: klucz szyfrujący (liczba całkowita) i słowo (ciąg znaków) do zaszyfrowania.
Szyfrowanie
Szyfr Cezara polega na przesunięciu każdej litery w tekście o ustaloną liczbę pozycji w alfabecie. W tej wersji, każdy znak tekstu jest przekształcany na jego kod ASCII, a następnie dodawany jest do niego klucz. Należy uwzględnić cykliczność alfabetu.
Deszyfrowanie
Deszyfrowanie polega na odwróceniu procesu szyfrowania. Użytkownik podaje zaszyfrowany tekst oraz klucz, a program powinien odszyfrować wiadomość, przesuwając każdy znak o wartość klucza w przeciwnym kierunku.
Przykładowe dane i wyniki
#Szyfrowanie
Wejście: Klucz: 3, Słowo: "Hello"
Wyjście: "Khoor"
#Deszyfrowanie
Wejście: Klucz: 3, Zaszyfrowany tekst: "Khoor"
Wyjście: "Hello"
Wskazówki
Poniżej znajdują się wskazówki, które mogą pomóc w implementacji:
-
Użyj funkcji ord() do konwersji znaku na kod ASCII i chr() do konwersji z powrotem na znak.
-
Pamiętaj o obsłudze zarówno wielkich, jak i małych liter.
-
Uwzględnij przypadek, gdy przesunięcie wychodzi poza zakres kodów dla liter, np. po przekroczeniu ‘z’ czy ‘Z’.
1.7 Sortowanie bąbelkowe
Napisz program realizujący algorytm sortowania bąbelkowego (opis problemu znajdziecie tutaj). Następnie przetestuj działanie algorytmu na liście N wylosowanych liczb.
2. Wczytywanie plików .txt
2.1 Średnie BPM – Beats Per Minute
Wczytaj plik bpms.txt
, który zawiera tytuły piosenek wraz z ich
wskażnikami BPMs. Oblicz średnie BPM wszystkich piosenek, znajdź
największe i najmniejsze i wypisz je na ekran wraz z odpowiadającymi im
tytułami. Plik znajduje się tutaj.
Wskazówka: liczba BPM zapisana jest jako ostatni “wyraz” po przecinku w każdej linijce dokumentu. Średnią możesz obliczyć używając standardowego wzoru ze statystyki, lub gotowej funkcji w Pythonie. Do przechowywania danych w tym podpunkcie możesz użyć dowolnej struktury danych.
Rozszerzenie zadania: wykonaj powyższe
polecenie, ale tytuły piosenek wraz z ich BPMs przechowuj we wspólnej
tablicy (obiekt numpy.ndarray
z biblioteki numpy
) i to na niej
oblicz srednią, maksymalną i minimalną wartość wykorzystując gotowe do
tego metody.
2.2 Guess Taylor Swift’s song
Twoim zadaniem jest wczytanie do programu pliku tekstowego
tf-song.txt
. Na podstawie tekstu piosenki wyznacz, jakie wyrazy w niej wystąpiły i ile razy. Znajdź najczęściej występujące wyrazy i na ich
podstawie odgadnij, która piosenka Taylor Swift została umieszczona w
pliku. Plik znajduje się tutaj.
Wskazówka: Przed rozpoczęciem zliczania zamień wszystkie litery w
linijce na lowercase (funkcja lower
w Pythonie). Do przechowywania
informacji o słowach i częstości ich występowania użyj odpowiedniej
struktury danych, np. słownika.
3. Podstawy Numpy
3.1 Co k-ta liczba
Napisz funkcję, która przyjmuje 3 argumenty typu int
: , i , a następnie zwraca obiekt numpy.ndarray
o wymiarze , który zawiera liczb poczynając od , przy czym sąsiednie są odległe o . W swojej implementacji nie używaj pętli ani funkcji bibliotecznych.
Przykład
Dla argumentów N = 5, a_0 = 2, k = 6 wynikiem powinno być [2, 8, 14, 20, 26].
3.2 Mnożenie macierzy
Mając do dyspozycji 2 obiekty numpy.ndarray
o wymiarach oraz napisz funkcję, która wykonuje mnożenie algebraiczne tych macierzy. Nie używaj funkcji bibliotecznej. Informacje o mnożeniu macierzy można znaleźć tutaj.
3.3 Rozwinięcie Laplace’a
Napisz program, który korzystając z rozwinięcia Laplace’a oblicza wyznacznik macierzy wymiaru . Załóż, że macierz taka jest przechowywana jako numpy.ndarray
o wymiarach , gdzie pierwszy indeks reprezentuje wiersze, a drugi kolumny macierzy. Nie korzystaj z funkcji bibliotecznych liczących wyznacznik. Informacje na temat rozwinięcia Laplace’a można znaleźć tutaj.
3.4 Iloczyn tensorowy
Dla wektorów , takich, że oraz iloczyn tensorowy jest macierzą , określoną jako , gdzie jest -tą współrzędną wektora , a -tą współrzędną wektora . Napisz funkcję, która na wejściu przyjmuje 2 obiekty numpy.ndarray
o wymiarach odpowienio i , oraz zwraca ich iloczyn tensorowy jako macierz . W implementacji nie korzystaj z funkcji bibliotecznych, ani z pętli.
3.5 Iloczyn skalarny (z tensorowego)
Jeśli , to ślad macierzy jest iloczynem skalarnym z . Dodaj do swojej implementacji iloczynu tensorowego kod, który sprawia, że jeśli wektory wejściowe mają ten sam wymiar, to dodatkowo zwraca ich iloczyn skalarny (obliczony jako ślad macierzy iloczynu tensorowego). Nie korzystaj przy tym z funkcji bibliotecznych. Ślad macierzy to suma elementów leżących na głównej diagonali.
3.6 Przekształcenie sygnału
Załóż, że na wejściu funkcji podajesz:
- tablicę
numpy.ndarray
o wymiarach ; - listę , która zawiera obiektów
numpy.ndarray
o wymiarach lub ; - listę , która zawiera krotek zawierających obiekty typu
int
, przy czym każda krotka to , oraz .
Program powinien dla każdego elementu , który ma wymiary
- Jeśli odpowiadający mu indeksem element ma parzystą liczbę w krotce, zamienić fragment leżący pomiędzy a na (na wszystkich kanałach).
- Jeśli odpowiadający mu indeksem element ma nieparzystą liczbę w krotce, zamienić fragment leżący pomiędzy a na średnią z tego fragmentu oraz (na wszystkich kanałach).
Program powinien dla każdego elementu , który ma wymiary
- Jeśli odpowiadający mu indeksem element ma parzystą liczbę w krotce, zamienić każdy parzysty kanał fragmentu leżącego pomiędzy a na .
- Jeśli odpowiadający mu indeksem element ma nieparzystą liczbę w krotce, zamienić każdy nieparzysty kanał fragmentu leżącego pomiędzy a na .
Elementy należy rozpatrywać w kolejności, w jakiej pojawiają się na liście (ten sam kawałek może zostać zmodyfikowany kilkukrotnie).
4. Python w zastosowaniach matematycznych
4.1 Całki prostokątami
Stwórz program w Pythonie, który oblicza przybliżoną wartość całki oznaczonej funkcji na przedziale od 0 do przy użyciu metody prostokątów.
Specyfikacja
-
Podziel przedział całkowania na równomierne prostokąty.
-
Oblicz sumę powierzchni tych prostokątów.
-
Wyświetl na wykresie funkcję oraz narysowane prostokąty.
4.2 Całki trapezami
Napisz program w Pythonie, który oblicza wartość całki oznaczonej funkcji na przedziale od 0 do przy użyciu metody trapezów.
Specyfikacja
-
Podziel przedział całkowania na równomierne trapezy.
-
Oblicz sumę powierzchni tych trapezów.
-
Wyświetl na wykresie funkcję oraz narysowane trapezy.
4.3 Trójkąt Pascala + De moivera
Twoim zadaniem jest stworzenie programu, który dla danej liczby całkowitej zwraca ogólne wzory dla i w oparciu o tożsamości trygonometryczne.
Specyfikacja
-
Program powinien zapytać użytkownika o wartość , będącą liczbą całkowitą.
-
W oparciu o podaną wartość , program powinien wyznaczyć i zaprezentować ogólne wzory dla i .
-
Dla , na przykład, program powinien zwrócić:
-
Program powinien również obsługiwać inne wartości i generować odpowiednie wzory.
Przykład działania
Podaj n: 4
Wzór na sin(4x) = 4cos^3(x)sin^1(x) + -4cos^1(x)sin^3(x)
Wzór na cos(4x) = 1cos^4(x)sin^0(x) + -6cos^2(x)sin^2(x) + 1cos^0(x)sin^4(x)
Process finished with exit code 0
Wskazówki
-
Program może wykorzystać znane tożsamości trygonometryczne i metody rekurencyjne lub iteracyjne do generowania wzorów dla dowolnych wartości .
-
Rozważ zastosowanie wzoru de Moivre’a lub innych znanych tożsamości trygonometrycznych do wyznaczania wzorów.
4.4 Całki punktami
Stwórz program w Pythonie, który oblicza przybliżoną wartość całki oznaczonej funkcji na przedziale od 0 do przy użyciu metody Monte Carlo.
Specyfikacja
-
Użyj losowego próbkowania punktów w przedziale całkowania.
-
Oblicz średnią wartość funkcji w tych punktach.
-
Pomnóż średnią przez długość przedziału całkowania, aby uzyskać przybliżoną wartość całki.
-
Wyświetl na wykresie funkcję i wylosowane punkty.
5. Symulacje fizyczne
5.1 Rzut poziomy
Twoim zadaniem jest stworzenie programu w Pythonie, który symuluje rzut poziomy. Program powinien rysować tor ruchu oraz prędkość od czasu na wykresie na podstawie parametrów podanych przez użytkownika: prędkości wyrzutu, wysokości wyrzucenia oraz przyspieszenia grawitacyjnego. Dodatkowo, jako bonus, stwórz animację ruchu.
Specyfikacja
-
Użytkownik podaje prędkość początkową, wysokość wyrzucenia i wartość przyspieszenia grawitacyjnego.
-
Program oblicza tor ruchu i rysuje go na wykresie wraz z wektorami prędkości.
-
Program tworzy animację ruchu, pokazującą jak obiekt porusza się po torze.
Wprowadzenie do Animacji w Matplotlib
Aby stworzyć animację w Matplotlib, możesz użyć modułu animation
.
Prosty przykład animacji to sinusoida o zmiennej częstotliwości. Kod do
stworzenia takiej animacji może wyglądać następująco:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 200)
line, = ax.plot(x, np.sin(x))
def animate(frame):
line.set_ydata(np.sin(x + frame / 10))
return line,
ani = FuncAnimation(fig, animate, frames=100, interval=20)
plt.show()
W tym kodzie, funkcja animate
jest wywoływana w każdej klatce
animacji, przesuwając sinusoidę w prawo, tworząc efekt ruchu.
5.2 SIR
Symulować rozprzestrzenianie się choroby w populacji za pomocą prostego modelu SIR (podatni – zarażeni – wyleczeni).
Wymagania
-
Utworzyć model SIR z określonymi parametrami transmisji, zdrowienia i populacji.
-
Przeprowadzić symulację na określony czas.
-
Wygenerować wykresy ilustrujące zmiany liczby podatnych, zarażonych i wyleczonych osób w czasie.
Opis
Model SIR to prosty model matematyczny, który opisuje sposób, w jaki choroba może rozprzestrzeniać się w populacji. Składa się on z trzech głównych składników:
-
S (Susceptible): Liczba osób podatnych na zarażenie.
-
I (Infected): Liczba zarażonych osób.
-
R (Recovered): Liczba osób, które wyzdrowiały lub zmarły.
Równania Modelu
Model opiera się na następujących równaniach różniczkowych:
gdzie:
-
S reprezentuje liczbę osób podatnych na zarażenie.
-
I to liczba aktualnie zarażonych osób.
-
R to liczba osób, które wyzdrowiały lub zmarły.
-
oznacza współczynnik transmisji choroby.
-
to współczynnik zdrowienia.
-
N to całkowita liczba populacji, gdzie .
Przykładowe wyniki
# Parametry modelu
N = 1000 # Populacja
I0 = 1 # Początkowa liczba zarażonych
S0 = N - I0 # Początkowa liczba podatnych
R0 = 0 # Początkowa liczba wyzdrowiałych
beta = 0.3 # Współczynnik transmisji
gamma = 0.1 # Współczynnik zdrowienia
# Czas symulacji
T = 160 # Liczba dni
dt = 1 # Krok czasowy
Nt = int(T/dt) # Liczba kroków czasowych