Ułamki wymierne

Zaimplementować klasę ułamków wykorzystując następujący przykład:

class ulamek:
        def __init__(self,a,b):
            self.a = a
            self.b = b
        def __mul__(self,x):
            return ulamek(self.a*x.a,self.b*x.b)
        def __repr__(self):
            return "%d/%d"%(self.a,self.b)
        def _repr_latex_(self):
            return r"$\frac{%d}{%d}$"%(self.a,self.b)
        def __str__(self):
            return "ulamek: %d/%d"%(self.a,self.b)

    x = ulamek(1,2)
    y = ulamek(2,3)
    x*y

Zaimplemetntować:

  • pozostałe operacje artytmetyczne
  • skracanie ułamków
  • reprezentacje w latex
  • reprezentacje ukłamków niewłaściwych: $1\frac{1}{2}$

In [ ]:

Fibonacci i śmiertelne króliki

Leonardo Fibonacci opracował swój słynny ciąg modelując liczebność populacji królików. Zaczynamy od jednej pary królików, która po miesiącu dojrzewa i po następnym miesiącu wydaje parę młodych i natychmiast ponownie zachodzi w ciążę, po następnym miesiącu pierwsza para wydaje kolejne młode a druga dojrzewa i zachodzi w ciążę itd. Wielkość populacji (liczba par) w kolejnych miesiącach wynosi 1, 1, 2, 3, 5, 8... Model ten zakłada, że każdej parze zawsze rodzą się dokładnie jeden samiec i jedna samica, ale głównym problemem w modelu jest to, że króliki są nieśmiertelne!

Urealnijmy trochę ten problem. Napisz funkcję obliczającą liczebność populacji śmiertelnych królików. Funkcja przyjmuje trzy argumenty - miesiąc, dla którego obliczamy liczebność, miot - liczba par, które się rodzą jednorazowo z jednej pary oraz zycie - czas życia królików (w miesiącach). Minimalna długość życia królików to 3 miesiące. Oznacza to, że każda para zdąży się rozmnożyć przynajmniej 2 razy. W ostatnim miesiącu życia nastąpi najpierw poród, a dopiero potem śmierć pary królików.

Jak teraz wyglądać będzie populacja królików po czasie jaki zadajemy w parametrze miesiac?

Specyfikacja

Wejście

  • miesiac: INT > 0
  • miot: INT > 0
  • zycie: INT > 0

Wyjście

  • populacja: INT

In [ ]:

Metoda Eulera dla równania różniczkowego

Zaimplementować metodę Eulera dla równań ruchu cząstki poruszającej się w ziemskim polu grawitacyjnym podlegającej sile tarcia proporcjonalnej do kwadratu prędkości.


In [ ]:

Równanie logistyczne

Zaimplementować algorytm obliczający diagram bifurkacyjny dla równania logistycznego. Ostatni rysunek na stornie: https://pl.wikipedia.org/wiki/Odwzorowanie_logistyczne


In [ ]:

Macierz rzadka

Korzystając ze słownika jako struktury danych zaimplementować klasę przechowywującą macierze rzadkie. Niech reprezentacja macierzy będzie słownikiem para indeksów: wartość. Zaimplementować dodawanie i mnożenie.


In [10]:
dane = {(1,2):3,(2,3):22}

In [15]:
import numpy as np 
Mdense = np.zeros((4,4))

In [17]:
for k,v in dane.items():
    Mdense[k] = v
Mdense


Out[17]:
array([[  0.,   0.,   0.,   0.],
       [  0.,   0.,   3.,   0.],
       [  0.,   0.,   0.,  22.],
       [  0.,   0.,   0.,   0.]])

In [ ]:

Napisać program implementujący grafikę żółwia (https://docs.python.org/3/library/turtle.html). Niech "backendem" rysującym będzie matplotlib. Proszę wykorzystać interface "notebook". Można w nim interactwynie zmieniać dane związane z objektem na rysunku np. wpsółrzędne linii (przykład poniżej).

Minimalna funkcjonalność powinna zawierać:

  • ruch do przodu
  • obrót
  • pen up i pen down

Proszę przemyśleć wewnętrzą reprezentacje danych, tak by była ona w miarę niezależna od sposobu wyświetlania.


In [140]:
%matplotlib notebook
import matplotlib.pyplot as plt
import time 
import numpy as np

In [145]:
f,ax = plt.subplots()
#plt.show()
plt.xlim(-10,10)
plt.ylim(-10,10)
path = ax.plot(0,0,'-')[0]
position = ax.plot([-0.5,0.5,0,-0.5],[-0.33,-0.33,0.66,-0.33],'b-')[0]
ax.set_aspect('equal')



In [148]:
x,y = position.get_data()
x,y


Out[148]:
(array([-0.5,  0.5,  0. , -0.5]), array([-0.33, -0.33,  0.66, -0.33]))

In [149]:
position.set_data(x+5,y+5)

In [150]:
t = np.linspace(0,10,20)
x = 5+2*np.cos(t)
y = 5+2*np.sin(t)

for i in range(t.size):
    path.set_data(x[:i],y[:i])
    f.canvas.draw()
    time.sleep(0.1)

In [ ]:


In [ ]: