IN-KJM1900 : LØSNINGSFORSLAG EKSAMEN HØSTEN 2018


Fellesdel

Merk at nummereringen p? eksamen ble endret, fra seksjonsvis til vanlig sekvensielle nummerering.

Oppgave 1.6 Hva skrives ut?

Riktig svar er at det ikke skrives noe ut. Skriptet mangler print-statement, og vil heller ikke utl?se noen feilmeldinger.

Oppgave 1.7 Hva skrives ut?

Riktig svar:

The total rainfall from June to August was 54.00

Oppgave 1.8 Hva skrives ut?

Riktig svar:

4.3 23.6

Oppgave 1.9 Hva skrives ut?

Riktig svar er at ingenting skrives ut.

Oppgave 2.1 stykkvis konstant funksjon

Riktig svar:

In [4]:
def piecewise(x):
    if x < 0:
        return -1.0
    else:
        return 1.0

Oppgave 2.2 testfunksjon

Riktig svar:

In [5]:
def test_piecewise():
    x = (0.5,0.5)
    expect = (-1,1)
    tol = 1e-6
    for x_, e_ in zip(x,expect):
        assert abs(piecewise(x_)-e_) < tol

Oppgave 2.3 Numerisk derivasjon

Riktig svar:

In [7]:
def diff(f,x,h):
    return (f(x+h)-f(x))/h

Oppgave 2.4 Implementasjon av en sum

Riktig svar:

In [ ]:
from math import factorial

def exp_approx(x,n):
    s = 0
    for k in range(n+1):
        s += x**k/factorial(k)
    return s

Oppgave 2.5 plotting

Riktig svar:

In [ ]:
from math import exp
import matplotlib.pyplot as plt

def plot_approx(n_values):
    x = np.linspace(0,5,100)
    for n in n_values:
        y = exp_approx(x,n)
        plt.plot(x,y)
    plt.plot(x,np.exp(x))
    n_values.append('exact')
    plt.legend(n_values)
    plt.show()

Oppgave 2.6 Lesing fra fil

Riktig svar:

In [6]:
def read_file(filename):
    infile = open(filename,'r')

    countries = {}

    for line in infile:
        words = line.split()
        countries[words[0]] = ' '.join(words[1:])

    return countries

Kjemidel

Merk deg at vi ikke n?dvendigvis forventer like detaljerte og omfatttende l?sninger som det som skisseres her, spesielt ikke for de mer matematiske oppgavene. L?sningsforslagene er laget slik for ? v?re forklarende.

Oppgave 3.1 : Reaksjonskinetikk

3.1.a) Løsningsforslag

Diskretiseringen gj?res ved ? velge et tidssteg $\Delta t$ slik at tidsaksen deles inn i intervaller med en endelig st?rrelse

\begin{equation} t_n = n\cdot \Delta t \end{equation}

Eulers metode vil inneb?re at vi approksimerer den deriverte med fremoverdifferansen, slik at den deriverte av en funksjon $y(t)$ ved tiden $t_n$

\begin{equation} \frac{d}{dt}y(t_n) \approx \mathbf{D}^+y(t_n) := \frac{y(t_{n+1}) - y(t_n)}{\Delta t} \end{equation}

Oppdateringsskjema kan dermed finnes ved ? (for hver ligning):

  1. Approksimere den deriverte
  2. L?se algebraisk for $y(t_{n+1})$

Denne fremgangsm?ten vil gi f?lgende oppdateringsskjema for de tre konsentrasjonene:

$$R_A = \frac{d}{dt}[A] = -k_1 [A] \rightarrow A_{n+1} = A_{n} - k_1 A_n \Delta t$$

$$R_B = \frac{d}{dt}[B] = k_1 [A] - k_2 [B] \rightarrow B_{n+1} = B_n + (k_1 A_n - k_2 B_n) \Delta t $$

$$R_C = \frac{d}{dt}[C] = k_2 [B] \rightarrow C_{n+1} = C_{n} + k_2 B_n \Delta t$$

3.1.b) Løsningsforslag

Eulers metode er ikke en eksakt l?sning av ligningen.

I dette tilfellet er det synlige forskjeller p? den analytiske/eksakte og den numeriske l?sningen som f?lge av at tidssteget er valgt relativt stort med $\Delta t = 1.02$.

Med Eulers metode forventer vi at feilen blir mindre n?r tidssteget blir mindre, s? en m?te ? forbedre resultatene p? er ? velge et mindre tidssteg.

3.1.c) Løsningsforslag

Ligningssettet er koblet, ettersom det er $[A]$-avhengighet i ligningen for $[B]$, og $[B]$-avhengighet i ligningen for $[C]$.

Vi kan alts? ikke l?se for $[B]$ og $[C]$ uten ? samtidig l?se for $[A]$.

Oppgave 3.2 - Bøttemodellen I

3.2.a) L?sningsforslag

I denne modellen har vi f?lgende st?rrelser:

St?rrelse Forklaring
$P(t)$ Nedb?r som funksjon av tid
$M_{max}$ Maks vannstand i b?tta
$M_0$ Vannstand ved tiden $t=0$
$M_{min}$ Minimum vannstand, n?r vannstanden synker under hullets h?yde.
$M(t)$ Vannstand som funksjon av tid
$Q(t)$ Str?m ut av b?tta gjennom hull
$Q_{over}(t)$ Overskytende vann n?r b?tta blir full

3.2.b) Løsningsforslag

B?ttemodellen kan beskrives med ligningen

\begin{equation} \frac{d}{dt} M(t) = P(t) - Q(M(t), t) - Q_{over}(M(t), t) \end{equation}

P? samme m?te som i prosjektoppgaven inneb?rer massebalanse at vi skal ha

\begin{equation} M(t_{final}) - M(0) = \int_{0}^{t_{final}} dt \left( P(t) - Q(M(t), t) - Q_{over}(M(t), t) \right) \end{equation}

(Dette kan utledes ved ? integrere uttrykket over mhp. tiden, men det forventes ikke at du skal beherske en slik utledning.)

I rene ord betyr dette at endringen i vannstanden i b?tta over tidsintervallet $0$ til $t_{final}$ skal tilsvare integralet med hensyn p? tid fra $0$ til $t_{final}$ over alle str?mmene inn og ut av b?tta.

Med en numerisk implementasjon f?r vi et analogt uttrykk:

\begin{equation} M(t_{final}) - M(0) = \sum_{n=0}^{N-1} \Delta t \left( P(t_n) - Q(M(t_n), t_n) - Q_{over}(M(t_n), t_n) \right) \end{equation}

eller litt forenklet

\begin{equation} M(t_{final}) - M(0) = \Delta t \sum_{n=0}^{N-1} \left( P_n - Q_n - Q_{over, n} \right). \end{equation}

3.2.c) Løsningsforslag

Riktig svar er "ja": tidssteget er korrekt implementert. St?rrelsen Ndt svarer imidlertid ikke til antall tidssteg.

I dette tilfellet vil linspace returnere en array med Ndt verdier. Ettersom vi kjenner den f?rste verdien av l?sningen $M(0)$ (vi ser p? initialverdiproblemer) vil vi ta $Ndt - 1$ antall tidssteg i l?sningen v?r.

Ettersom linspace diskretiserer tidsaksen i uniforme steglengder $\Delta t$ og det f?rste elementet i arrayen $t[0]$ har verdien 0, vil $t_1 = 1\cdot \Delta t = \Delta t$.

3.3 Bøttemodellen II

3.3.a) Løsningsforslag

Skriptet inneholder to feil:

  • Det benyttes gjennomg?ende parenteser for indeksering. Dette skal v?re hakeparenteser: [ ]
  • Array for vannstanden i b?tta er gitt feil datatype: int32 er heltall, det vi skal ha her er float.

3.3.b) Løsningsforslag

Funksjonene for $Q_{over}$ og $Q$ kan defineres som f?lger (vi godtar globale variabler her):

In [2]:
# Med def-statements

def Q_over(M_n):
    return max((M_n-M_max)/dt, 0)

def Q(M_n):
    return K*M_n

# Alternativt for lambda-funksjoner

Q_over = lambda M_n : max((M_n-M_max)/dt, 0)

Q = lambda M_n : K*M_n

Varianter fra prosjektoppgaven kan ogs? godtas.

3.3.c) Løsningsforslag

In [12]:
# En mulig sjekk p? massebalansen:
# settes inn etter endt simulering
VS = M[-1]-M[0]
HS = np.sum(P-Q-Q_over)*dt
assert(np.abs(VS-HS)<=10e-12), "Mass-balance fail"

Oppgave 3.5 - Newtons metode (og sekantmetoden)

3.5.a) Løsningsforslag

Newtons metode er gitt som

\begin{equation} x_{n+1} = x_{n} - \frac{f(x_n)}{f'(x_{n})} \end{equation}

Her er $x_{n+1}$ og $x_n$ en rekke med verdier p? x-aksen, som vi antar konvergerer mot en rot til funksjonen $f(x)$. Den deriverte er gitt ved $f'(x)$.

Hensikten med Newtons metode er ? bestemme r?ttene $x_*$ til en funksjon $f(x)$, alts? ? finne en $x_*$ slik at $f(x_*) = 0$.

3.5.b) Løsningsforslag

En numerisk approksimasjon av den deriverte i et punkt $x_n$ er gitt ved fremoverdifferansen

\begin{equation} f'(x) \approx D^+f(x_n) := \frac{f(x_{n} + \Delta x) - f(x_n)}{\Delta x} \end{equation}

Med utgangspunkt i uttrykket for Newtons metode kan vi derfor finne sekantmetoden ved ? erstatte den deriverte med approksimasjonen over:

\begin{equation} x_{n+1} = x_{n} - \Delta x \frac{f(x_n)}{f(x_{n} + \Delta x) - f(x_n)} \end{equation}

3.5.c) Løsningsforslag

I prosjektoppgaven har du implementert Newtons metode med prim?rt to tester:

  1. At l?sningen er konvergert innenfor et maksimalt antall iterasjoner
  2. At vi ikke deler p? 0.

I sammensatte l?sningsalgoritmer slik som du har utviklet for Birkenes-modellen er det viktig at koden gir feilmelding dersom Newtons metode ikke er konvergert. Dette gj?res ved ? kun returnere en rot dersom den er under en numerisk toleranse oppgitt av brukeren (eller hardkodet).