5 Lisää funktioista ja kuvaajien piirto

Rekursio

Rekursio tarkoittaa sitä, että funktio kutsuu itseään. Näin saadaan toistorakenne ilman silmukkaa.

Yleinen rekursiolla määritelty lukujono on Fibonaccin lukujono. $F_1 = 1, F_2 = 1, F_n = F_{n-1} + F_{n-2}$

Pythonissa tämän voi ohjelmoida rekursiivisesti:

In [2]:
def fibonacci(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)


fibonacci(10)
Out[2]:
55

Kuvaajien piirto pythonissa

Pythonissa määritellyistä funktioista voi piirtää kuvaajia matplotlib-kirjastolla:

In [4]:
import matplotlib.pyplot as kuvaaja

# kuvaaja = matplotlib.pyplot

x_lista = []
y_lista = []


def f(x):
    return x ** 2


x = -3  # start
while x <= 3:  # end
    x_lista.append(x)
    y = f(x)
    y_lista.append(y)

    x = x + 0.01

# matplotlib.pyplot.plot(x_lista, y_lista)
# matplotlib.pyplot.grid()
# matplotlib.pyplot.show()
kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.grid()
kuvaaja.show()

Tehtäviä

Tehtävä 5.1

Ohjelmoi kaksi funktiota, joista toinen laskee kertoman rekursiivisesti ja toinen silmukalla. Kertoma on määritelty $n! = n\cdot(n-1)!$ tai $n! = 1 \cdot 2\cdot \ldots \cdot n$

In [5]:
def kertoma_rekursiivinen(n):
    print("funktiota kutsuttiin parametrillä", n)
    if n == 1:
        return 1
    return n * kertoma_rekursiivinen(n - 1)


print(kertoma_rekursiivinen(5))


# 5! = 1*2*3*4*5


def kertoma_silmukka(n):
    tulo = 1
    for luku in range(1, n + 1):
        tulo = tulo * luku
    return tulo


print(kertoma_silmukka(5))
funktiota kutsuttiin parametrillä 5
funktiota kutsuttiin parametrillä 4
funktiota kutsuttiin parametrillä 3
funktiota kutsuttiin parametrillä 2
funktiota kutsuttiin parametrillä 1
120
120

Tehtävä 5.2

Piirrä funktion $f(x)=2x-7$ kuvaaja. Merkitse kuvaajan funktion nollakohta.

In [6]:
import matplotlib.pyplot as kuvaaja

x_lista = []
y_lista = []


def f(x):
    return 2 * x - 7


x = 0  # start
while x <= 5:  # end
    x_lista.append(x)
    y = f(x)
    y_lista.append(y)

    x = x + 0.1


kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.plot([3.5], [0], marker="o", markersize=5, color="red")
kuvaaja.grid()
kuvaaja.show()

Tehtävä 5.3

Piirrä funktion $f(x)=2x-6$ kuvaaja. Onko piste (2,4) suoran piste?

In [7]:
import matplotlib.pyplot as kuvaaja

x_lista = []
y_lista = []


def f(x):
    return 2 * x - 6


x = 0  # start
while x <= 5:  # end
    x_lista.append(x)
    y = f(x)
    y_lista.append(y)

    x = x + 0.1

print("X:n arvolla 0 funktion arvo on", f(0))
print("X:n arvolla 1 funktion arvo on", f(1))
print("X:n arvolla 2 funktion arvo on", f(2))
print("X:n arvolla 3 funktion arvo on", f(3))


kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("x")
kuvaaja.ylabel("y")
kuvaaja.plot([4], [2], marker="o", markersize=5, color="red")
kuvaaja.plot([5], [3], marker="o", markersize=5, color="red")

kuvaaja.grid()
kuvaaja.show()

if f(4) == 2:
    print("piste on kuvaajalla")
else:
    print("ei oo kuvaajalla")
X:n arvolla 0 funktion arvo on -6
X:n arvolla 1 funktion arvo on -4
X:n arvolla 2 funktion arvo on -2
X:n arvolla 3 funktion arvo on 0
piste on kuvaajalla

Tehtävä 5.4

Funktio f(x) kuvaa sähkönkulutusta Suomessa (kWh). Missä muuttuja x on kulunut aika vuosissa vuodesta 1970. Piirrä funktion kuvaaja.

In [8]:
import matplotlib.pyplot as kuvaaja

x_lista = []
y_lista = []


def f(x):
    return -1.3 * x ** 3 + 58.8 * x ** 2 + 1349.4 * x + 21583


x = 0  # start
while x <= 44:  # end
    x_lista.append(x)
    y = f(x)
    y_lista.append(y)

    x = x + 0.1


kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("Aika, vuosi 1970=0")
kuvaaja.ylabel("Sähkönkulutus (GWh)")
kuvaaja.plot([0], [f(0)], marker="o", markersize=5, color="red")
kuvaaja.plot([30], [f(30)], marker="o", markersize=5, color="red")

kuvaaja.grid()
kuvaaja.show()

print("sähkönkulutus on 1970", f(0))
print("sähkönkulutus on 2000", f(30))
sähkönkulutus on 1970 21583.0
sähkönkulutus on 2000 79885.0

Tehtävä 5.5

Pesäpallon lentoa kuvaa pystysuunnassa funktio h(t), missä h on pallon korkeus (m) ajan t (s) funktiona. Laske milloin pallo osuu takaisin maahan ja piirrä korkeusfunktion h(t) kuvaaja.

In [11]:
import matplotlib.pyplot as kuvaaja

x_lista = []
y_lista = []

def h(t):
    return 1.7 + 14.7 * t - 4.9 * t ** 2
def d(t):
    return 31.5 * t

t = 0 # start
while h(t) >= 0: #end
    x_lista.append(d(t))
    y_lista.append(h(t))
    
    t = t + 0.01
print("pallo osuu maahan kun t=",t)

kuvaaja.plot(x_lista, y_lista)
kuvaaja.xlabel("Pituus (m)")
kuvaaja.ylabel("Korkeus (m)")
#kuvaaja.plot([0], [f(0)], marker='o', markersize=5, color="red")
#kuvaaja.plot([30], [f(30)], marker='o', markersize=5, color="red")

kuvaaja.grid()
kuvaaja.show()

print("h on hetkellä 0", h(0))
print("h on hetkellä 2", h(2))
print("d on hetkellä 0", d(0))
print("d on hetkellä 1", d(1))
print("d on hetkellä 2", d(2))
pallo osuu maahan kun t= 3.1199999999999775
h on hetkellä 0 1.7
h on hetkellä 2 11.499999999999996
d on hetkellä 0 0.0
d on hetkellä 1 31.5
d on hetkellä 2 63.0
In [ ]: