Øving 2
Oppgaver fra læreboken
Gamle eksamensoppgaver
Se siden for gamle eksamensoppgaver.
- Høst 2010: 1, 8
- Sommer 2011: 4
Programmeringsoppgave
Lag en Python-funksjon lagrange
som bruker Lagrange-interpolasjon (avsnitt 19.3) for å interpolere mellom noen kjente funksjonsverdier. Basert på Kreyszigs ligning (4a) og (4b) på side 808, kan vi begynne noe slik:
# -*- coding: utf-8 -*- # Linjen over er for å tillate bruk av æ, ø og å. import numpy as np # Nå kan vi skrive "np." istedet for "numpy." når # vi bruker NumPy-funksjoner. # Høyre side av ligning 4a i Kreyszig. # X: En array med punktene vi ønsker interpolert verdi i. Et element her # er en "x" i Kreyszig. # x: En array med punktene vi kjenner verdien i. x[i] er Kreyszigs "x_i". # f: En array med de kjente funksjonsverdiene. f[i] er Kreyszigs "f_i". # # Returnerer F: En array av samme lengde som X. F[i] er interpolasjonen i X[i]. def lagrange(X, x, f): F = np.zeros(len(X)) # Oppretter F som en array av samme lengde som X. # Din kode følger her. Fyll inn elementene i F, og returner til slutt # arrayen med return F.
Lagre koden din i en fil ved navn lagrange.py
.
For å teste ut Lagrange-interpolasjonen vil vi studere følgende verdier:
\(x\) | -1,5 | -0,75 | 0 | 0,75 | 1,5 |
\(f(x)\) | -14,1014 | -0,931597 | 0,000000 | 0,931597 | 14,1014 |
I dette tilfellet er \(f = \tan\), så vi kan sammenligne Lagrange-interpolasjonen med den faktiske funksjonen ved å plotte begge to. Eksempelkoden under kan brukes direkte om ønsket:
# -*- coding: utf-8 -*- # Linjen over er for å tillate bruk av æ, ø og å. import numpy as np # For NumPy import matplotlib.pyplot as plt # For plotting med matplotlib from lagrange import lagrange # Importerer lagrange-funksjonen fra lagrange.py. x = np.array([-1.5, -0.75, 0, 0.75, 1.5]) # Interpoleringspunkter f = np.array([-14.1014, -0.931597, 0.0, 0.931597, 14.1014]) # Kjente verdier. X = np.linspace(-1.5, 1.5, 100) # 100 jevnt fordelte punkter fra -1,5 til 1,5 F = lagrange(X, x, f) # OBS: I en tidligere utgave av koden stod det # her "interpolate" istedet for "lagrange". Beklager! # Følgende plottekode kan bare kopieres direkte. fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x, f, 'o', color='black', label='kjente punkter') ax.plot(X, np.tan(X), color='black', linestyle='dashed', label='tan') ax.plot(X, F, color='black', label='interpolert') ax.set_xlim(-1.55, 1.55) ax.legend(loc='upper left') plt.show()