Tehtävä 6.1

Yhtälöllä $sin(2x)=2cos(x)-1$ on välillä $]4,5[$ yksi ratkaisu. Määritä puolitusmenetelmällä sen likiarvo 5 desimaalin tarkkuudella.

In [4]:
import math

a = 4
b = 5
n = 4


def f(x):
    return 2 * math.sin(x) - 2 * math.cos(x) + 1


while True:
    c = (a + b) / 2
    if f(a) * f(c) < 0:
        b = c
    else:
        a = c
    print(c)
    if abs(b - a) < 10 ** (-(n + 1)) or f(c) == 0:
        print("Nollakohdan likiarvo:", round(c, n))
        break
4.5
4.25
4.375
4.3125
4.28125
4.296875
4.2890625
4.28515625
4.287109375
4.2880859375
4.28857421875
4.288330078125
4.2884521484375
4.28839111328125
4.288360595703125
4.2883453369140625
4.288352966308594
Nollakohdan likiarvo: 4.2884

Tehtävä 6.2

Käyrä $y = e^x$ ja suora $y = 6 - x$ leikkaavat yhdessä pisteessä. Määritä puolitusmenetelmällä leikkauspisteen koordinaatit.

In [17]:
import math

# Arvataan, että leikkauspiste voisi olla välillä -10 - 10

a = -10
b = 10

n = 4

def f(x):
    return math.exp(x)

def g(x):
    return 6 - x

def h(x):
    return f(x) - g(x)


while True:
    print(a, b)
    c = (a + b) / 2
    if h(a) * h(c) < 0:
        b = c
    else:
        a = c
    print(c)
    if abs(b - a) < 1 * 10 ** (-(n + 1)) or h(c) == 0:
        print("Nollakohdan likiarvo:", round(c, n))
        break
print(c, f(c))
-10 10
0.0
0.0 10
5.0
0.0 5.0
2.5
0.0 2.5
1.25
1.25 2.5
1.875
1.25 1.875
1.5625
1.25 1.5625
1.40625
1.40625 1.5625
1.484375
1.484375 1.5625
1.5234375
1.484375 1.5234375
1.50390625
1.484375 1.50390625
1.494140625
1.494140625 1.50390625
1.4990234375
1.4990234375 1.50390625
1.50146484375
1.50146484375 1.50390625
1.502685546875
1.502685546875 1.50390625
1.5032958984375
1.5032958984375 1.50390625
1.50360107421875
1.5032958984375 1.50360107421875
1.503448486328125
1.5032958984375 1.503448486328125
1.5033721923828125
1.5032958984375 1.5033721923828125
1.5033340454101562
1.5033340454101562 1.5033721923828125
1.5033531188964844
1.5033340454101562 1.5033531188964844
1.5033435821533203
Nollakohdan likiarvo: 1.5033
1.5033435821533203 4.496699045489179

Tehtävä 6.3

Laske lukujonon

$a_n=\frac{2n-8}{n+1}$

100 ensimmäistä jäsentä. Mitä lukua jäsenet näyttävät lähestyvän?

In [6]:
def a(n):
    return (2 * n - 8) / (n + 1)


for n in range(1, 2000):
    if n % 100 == 0: # vähennetään tulostuksen määrää
        print(n, a(n))
100 1.900990099009901
200 1.9502487562189055
300 1.9667774086378738
400 1.9750623441396509
500 1.9800399201596806
600 1.983361064891847
700 1.985734664764622
800 1.9875156054931336
900 1.9889012208657049
1000 1.99000999000999
1100 1.9909173478655768
1200 1.9916736053288926
1300 1.9923136049192929
1400 1.9928622412562456
1500 1.9933377748167889
1600 1.9937539038101186
1700 1.9941211052322163
1800 1.994447529150472
1900 1.994739610731194

Tehtävä 6.5

Lukujonon jäsenet lasketaan säännöllä

$a_n=a_{n-2}a_{n-1}$ kun $n=3,4, 5...$

a) Tutki, lähestyvätkö jonon jäsenet jotain tiettyä lukua, kun $a_1=\frac{3}{2}$ ja $a_1=\frac{2}{3}$.

b) $a_1=2$ ja $a_1=\frac{2}{3}$.

In [7]:
def a_eka(n):
    if n == 1:
        return 3 / 2
    if n == 2:
        return 2 / 3
    return a_eka(n - 2) * a_eka(n - 1)


def a_toka(n):
    if n == 1:
        return 2
    if n == 2:
        return 2 / 3
    return a_toka(n - 2) * a_toka(n - 1)


print("eka")
for n in range(1, 30):
    print(n, a_eka(n))


print("toka")
for n in range(1, 30):
    print(n, a_toka(n))
eka
1 1.5
2 0.6666666666666666
3 1.0
4 0.6666666666666666
5 0.6666666666666666
6 0.4444444444444444
7 0.2962962962962963
8 0.1316872427983539
9 0.039018442310623375
10 0.005138231086172625
11 0.00020048577321447823
12 1.030142232265987e-06
13 2.0652886195673503e-10
14 2.127541028834649e-16
15 4.3939862745148123e-26
16 9.34838607916657e-42
17 4.1076680120723254e-67
18 3.8400066461894746e-108
19 1.5773472466697637e-174
20 6.0570239105605615e-282
21 0.0
22 0.0
23 0.0
24 0.0
25 0.0
26 0.0
27 0.0
28 0.0
29 0.0
toka
1 2
2 0.6666666666666666
3 1.3333333333333333
4 0.8888888888888888
5 1.1851851851851851
6 1.0534979423868311
7 1.248590153939948
8 1.315387158060192
9 1.6423794541730057
10 2.160364842681079
11 3.548138831137102
12 7.6652743877401335
13 27.197457706461442
14 208.47597596898441
15 5670.016539229726
16 1182062.2317762005
17 6702312404.569859
18 7922550359007160.0
19 5.309940754700307e+25
20 4.206827303245767e+41
21 2.2338003745490688e+67
22 9.397212405653644e+108
23 2.0991496591466267e+176
24 1.97261552182563e+285
25 inf
26 inf
27 inf
28 inf
29 inf

Tehtävä 6.6

Määritä funktion $f(x)=x^5-4x-3$ ainoa nollakohta kolmen desimaalin tarkkuudella. Ratkaise yhtälö Newtonin menetelmällä.

In [8]:
# Määritellään funktio f(x)
def f(x):
    return x ** 5 - 4 * x - 3


# Määritellään funktion f(x) derivaatta fd(x)
def fd(x):
    return 5 * x ** 4 - 4


# rekursiivinen ratkaisu 16 iterointikierroksella
def newton(n):
    if n == 1:
        return 1 - f(1) / fd(1)
    return newton(n - 1) - f(newton(n - 1)) / fd(newton(n - 1))


print(newton(16))
1.560040682404455
In [9]:
# Tapa 2:
# Toistot
n = 16
# Alkuarvaus
a = 1


def f(x):
    return x ** 5 - 4 * x - 3


# Määritellään funktion f(x) derivaatta fd(x)
def fd(x):
    return 5 * x ** 4 - 4


# Iteroitava funktio g(x)
def g(x):
    return x - f(x) / fd(x)


laskuri = 0
x = a
print("alkuarvaus:", x)
while laskuri < n:
    x = g(x)
    laskuri += 1
    print(laskuri, ".iterointikierros:", x)
print("tulos", n, ".kierroksen jälkeen:", x)
alkuarvaus: 1
1 .iterointikierros: 7.0
2 .iterointikierros: 5.602116490292476
3 .iterointikierros: 4.485946008353707
4 .iterointikierros: 3.597344922983486
5 .iterointikierros: 2.895289744966627
6 .iterointikierros: 2.3515419422897255
7 .iterointikierros: 1.9519225753093643
8 .iterointikierros: 1.6963598142898584
9 .iterointikierros: 1.5824209666021791
10 .iterointikierros: 1.5607561240125074
11 .iterointikierros: 1.560041440173885
12 .iterointikierros: 1.5600406824053061
13 .iterointikierros: 1.560040682404455
14 .iterointikierros: 1.560040682404455
15 .iterointikierros: 1.560040682404455
16 .iterointikierros: 1.560040682404455
tulos 16 .kierroksen jälkeen: 1.560040682404455

Tehtävä 6.7

Italialainen Fibonancci laski vuonna 1225 yhtälön $x^3+2x^2+10x-20=0$ juurelle likiarvon $x= 1.368808108$. Kuinka mones iterointikierros tuottaa samat yhdeksän desimaalia kuin Fibonaccin laskemassa likiarvossa? Käytä alkuarvausta x=1.

In [10]:
def f(x):
    return x ** 3 + 2 * x ** 2 + 10 * x - 20


def fd(x):
    return 3 * x ** 2 + 4 * x + 10


def newton(n):
    if n == 1:
        return 1 - f(1) / fd(1)
    return newton(n - 1) - f(newton(n - 1)) / fd(newton(n - 1))


for n in range(1, 8):
    print(n, newton(n))
1 1.4117647058823528
2 1.3693364705882352
3 1.3688081886175318
4 1.3688081078213745
5 1.3688081078213727
6 1.3688081078213727
7 1.3688081078213727
In [11]:
# Tapa 2:
# Alkuarvaus
a = 1
target_ans = 1.368808108


def f(x):
    return x ** 3 + 2 * x ** 2 + 10 * x - 20


# Määritellään funktion f(x) derivaatta fd(x)
def fd(x):
    return 3 * x ** 2 + 4 * x + 10


# Iteroitava funktio g(x)
def g(x):
    return x - f(x) / fd(x)


laskuri = 0
x = a
print("alkuarvaus:", x)
while abs(x - target_ans) >= 1 * 10 ** (-9):
    x = g(x)
    laskuri += 1
    print(laskuri, ".iterointikierros:", x)
print("tulos", laskuri, ".kierroksen jälkeen:", round(x, 9))
alkuarvaus: 1
1 .iterointikierros: 1.4117647058823528
2 .iterointikierros: 1.3693364705882352
3 .iterointikierros: 1.3688081886175318
4 .iterointikierros: 1.3688081078213745
tulos 4 .kierroksen jälkeen: 1.368808108

Tehtävä 6.8

Määritä kiintopistemenetelmällä yhtälön $2^{-x}-x =0$ ainoa ratkaisu kiintopistemenetelmällä.

In [12]:
# yhtälön kiintopistemuoto on x=2^(-x)
def g(x):
    return 2 ** (-x)


# Alkuarvaus
x = 1

for i in range(1, 20):
    print(i, x)
    x = g(x)
1 1
2 0.5
3 0.7071067811865476
4 0.6125473265360659
5 0.6540408600420695
6 0.6354978458133738
7 0.6437186417228692
8 0.6400610211772396
9 0.6416858070429984
10 0.6409635371779632
11 0.6412845090665851
12 0.6411418514717377
13 0.6412052524498624
14 0.6411770745288387
15 0.6411895977668723
16 0.6411840319786225
17 0.6411865056139605
18 0.6411854062407777
19 0.6411858948418261

Tehtävä 6.9

Määritä erotusosamäärän avulla funktion $2^x$ derivaatan arvo kohdassa $0$. Käytä $h$:n arvoa 0.1, 0.01 ja 0.001.

In [13]:
def f(x):
    return 2 ** x


x_0 = 0

h = 0.1

print((f(x_0 + h) - f(x_0)) / h)


h = 0.01

print((f(x_0 + h) - f(x_0)) / h)


h = 0.001

print((f(x_0 + h) - f(x_0)) / h)
0.7177346253629313
0.6955550056718884
0.6933874625807412

Tehtävä 6.10

Funktion $f(x)=\frac{6-x}{x+1}$ kuvaaja ja x-akseli rajaavat välillä $[1,4]$ alueen. Arvioi suorakaidesäännöllä alueen pinta-ala. Käytä laskentapisteinä osavälien keskipisteitä ja osavälien lukumäärää 50. Huomaa, että tapa 2 edellyttää pythonin sympy-kirjaston asennusta. Komentoriviltä pyydetyt arvot eivät ole välttämättömiä, arvot voi asettaa ohjelman sisällä.

In [14]:
def f(x):
    return (6 - x) / (x + 1)


a = 1
b = 4

n = 50

askel = (b - a) / n

x = a + askel / 2
summa = 0
for i in range(n):
    # print(x)
    summa = summa + f(x) * askel
    x = x + askel
print(summa)
3.4138146633849162
In [ ]:
# Tapa 2
from sympy import *
x = symbols('x')

f = sympify(input("f(x) = "))
a = float(input("   a = "))
b = float(input("   b = "))
n = float(input("   n = "))

d = (b - a) / n

def iteration():
    s = 0
    for i in range(1, int(n) + 1):
        s += f.subs(x, a + d / 2+ (i - 1) * d)
        #print(a + d / 2 + (i - 1) * d)
    return s

print(abs(d * iteration()))

Välinpuolitusmenetelmä kun ohjelma kysyy käyttäjältä funktion ja välin, jossa nollakohta sijaitsee. Huom. edellyttää sympy kirjaston asennusta.

In [ ]:
from sympy import *

x = symbols("x")

print(
    "Ohjelma ratkaisee funktion f(x) nollakohdan välinpuolitusmenetelmällä. Määrittele funktio ja väli, johon 0-kohta sisältyy."
)

f = sympify(input("Anna funktio f(x) = "))

a = float(input("Välin alaraja a = "))
b = float(input("Välin yläraja b = "))

n = int(
    input("Syötä kokonaislukuna, kuinka monen desimaalin tarkkuudella ratkaistaan?\n")
)

while True:
    c = (a + b) / 2
    if f.subs(x, a) * f.subs(x, c) < 0:
        b = c
    else:
        a = c
    print("Nollakohta on välillä: ]", a, " ", b, "[")
    if abs(b - a) < 10 ** (-(n + 1)) or f.subs(x, c) == 0:
        print("Nollakohdan likiarvo on: ", round(c, n), n, ".desimaalin tarkkuudella.")
        break

Tehtävä 6.11

Tutki laskimen avulla kuinka monta geometrisen jonon $3, 9, 27, 81 ...$ jäseniä on laskettava yhteen, että summa ylittää arvon $9999$.

In [ ]:
a = 3
q = 3
summa = 0
laskuri = 0
while summa <= 9999:
    summa = summa + a
    a = a * q
    laskuri = laskuri + 1
    print(a, "summa:", summa)
print(laskuri, "jäsentä on laskettava yhteen, jolloin summa on", summa)

Laske vektorien $\overline{a}=2\overline{i}+4\overline{j}-\overline{k}$ ja $\overline{b}=5\overline{i}-2\overline{j}+2\overline{k}$ pistetulo. ovatko vektorit kohtisuorassa?

In [ ]:
a_vektori = [2, 4, -1]
b_vektori = [5, -2, 2]
pistetulo = 0
for i in range(len(a_vektori)):
    pistetulo = pistetulo + a_vektori[i] * b_vektori[i]

if pistetulo == 0:
    print("Vektorit ovat kohtisuorassa, koska pistetulo on ", pistetulo)
else:
    print("Eivät ole, koska pistetulo on", pistetulo, "joka on erisuuuri kuin nolla.")

Tehtävä 6.12

Määritä pisteiden $A(1,5,3)$ ja $B(4,3,9)$ välinen vektori $\overline{AB}$. Mikä on vektorin $\overline{AB}$ pituus?

In [ ]:
A = [1, 5, 3]
B = [4, 3, 9]
AB = [0, 0, 0]
for i in range(len(A)):
    AB[i] = B[i] - A[i]
print("a) ", AB)

etaisyys = 0
for i in range(len(AB)):
    etaisyys += AB[i] ** 2

etaisyys = math.sqrt(etaisyys)
print("b) ", etaisyys)

Tehtävä 6.13

Yo-tehtävä: Kahden positiivisen luvun $a$ ja $b$ geometrinen on $\sqrt{ab}$.

a) Anna esimerkki välin $2-100$ kahdesta luvusta, joille $\sqrt{ab}$ on kokonaisluku.

b) Satunnaislukugeneraattori arvoo toisistaan riippumatta kaksi lukua väliltä 1-100 niin, että jokaisen luvun todennäköisyys on $\frac{1}{100}$. Mikä on todennäköisyys, että arvottujen lukujen geometrinen keskiarvo on kokonaisluku? Voit esittää simulointiin perustuvan ratkaisun.

In [ ]:
import random
import math

toistot = 100000
summa = 0
for i in range(toistot):
    noppa1 = random.randint(1, 100)
    noppa2 = random.randint(1, 100)
    if math.sqrt(noppa1 * noppa2) == int(math.sqrt(noppa1 * noppa2)):
        # print(noppa1, noppa2, math.sqrt(noppa1 * noppa2))
        summa = summa + 1
print(summa / toistot)
summa = 0
toistot = 100 * 100
for noppa1 in range(1, 101):
    for noppa2 in range(1, 101):

        if math.sqrt(noppa1 * noppa2) == int(math.sqrt(noppa1 * noppa2)):
            # print(noppa1, noppa2, math.sqrt(noppa1 * noppa2))
            summa = summa + 1
print(summa / toistot)

Tehtävä 6.14

Auton nopeus mitattiin sekunnin välein. Laske auton kulkema matka puolisuunnikassäänöllä. (t,v)-arvot on listattu taulukkomuuttujiin alla olevassa koodissa.

t (s) s(m)
0 0
1 7.8
2 15.8
3 23.9
4 32.2
5 41.4
6 52.2
7 65.6
8 76.6
In [ ]:
t_lista = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
v_lista = [0, 7.8, 15.8, 23.9, 32.2, 41.4, 52.2, 65.6, 76.6]

import matplotlib.pyplot as k

k.plot(t_lista, v_lista)
k.grid()
k.show()
h = t_lista[1] - t_lista[0]

print(h)
summa = 0
summa = summa + 0.5 * v_lista[0] + 0.5 * v_lista[-1]
for i in range(1, len(v_lista) - 1):
    summa = summa + v_lista[i]
p_a = h * summa
print(p_a)

Tehtävä 6.15

Etsi Eratostheneen seulalla kaikki 100 pienemmät alkuluvut

In [ ]:
n = 100

l = ["alkuluku"] * n

jakaja = 2

while jakaja < n:
    if l[jakaja] == "alkuluku":
        kohta = 2 * jakaja
        while kohta < n:
            l[kohta] = "ei alkuluku"
            kohta = kohta + jakaja
    jakaja = jakaja + 1


for i in range(2, n):
    if l[i] == "alkuluku":
        print(i)
In [ ]: