Øving 2

Oppgaver fra læreboken

  • 19.3: 3 (scan - oppgaven er den som begynner med "Quadratic interpolation")
  • 19.5: 4, 7, 8 (scan)

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()
2014-08-25, spreeman