Yhtälöllä $sin(2x)=2cos(x)-1$ on välillä $]4,5[$ yksi ratkaisu. Määritä puolitusmenetelmällä sen likiarvo 5 desimaalin tarkkuudella.
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
Käyrä $y = e^x$ ja suora $y = 6 - x$ leikkaavat yhdessä pisteessä. Määritä puolitusmenetelmällä leikkauspisteen koordinaatit.
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))
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?
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))
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}$.
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))
Määritä funktion $f(x)=x^5-4x-3$ ainoa nollakohta kolmen desimaalin tarkkuudella. Ratkaise yhtälö Newtonin menetelmällä.
# 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))
# 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)
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.
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))
# 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))
Määritä kiintopistemenetelmällä yhtälön $2^{-x}-x =0$ ainoa ratkaisu kiintopistemenetelmällä.
# 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)
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.
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)
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ä.
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)
# 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.
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
Tutki laskimen avulla kuinka monta geometrisen jonon $3, 9, 27, 81 ...$ jäseniä on laskettava yhteen, että summa ylittää arvon $9999$.
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?
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.")
Määritä pisteiden $A(1,5,3)$ ja $B(4,3,9)$ välinen vektori $\overline{AB}$. Mikä on vektorin $\overline{AB}$ pituus?
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)
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.
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)
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 |
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)
Etsi Eratostheneen seulalla kaikki 100 pienemmät alkuluvut
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)