Tilbake
8.4

8.4 Randverdiproblemer, falsk rand og kodefeil-lokalisering

Sett opp $A\mathbf U=\mathbf b$ for et randverdiproblem, håndter Neumann-rand med falsk node, og finn den innebygde feilen i en gitt Python-kode.

60 min
14 oppgaver
Randverdiproblemerfalsk randkodefeil-lokalisering
Din fremgang i kapitlet
0 / 14 oppgaver
Forkunnskaper: kap. 8.2 — gitteret, notasjonen og differanseskjemaet. Fra kap. 8.1 trengs differansekvotientene og ordensbegrepet. Kap. 8.3 er nyttig, siden systemet her har samme tridiagonale form, men ikke nødvendig.

Sist du var her. De tre tingene du bruker i hver eneste oppgave under:

u(xi)Ui+12Ui+Ui1h2u''(x_i) \approx \frac{U_{i+1} - 2U_i + U_{i-1}}{h^2}

Den andre sentraldifferansen. Står på det utdelte formelarket — tren oppslaget.

u(xi)Ui+1Ui12hu'(x_i) \approx \frac{U_{i+1} - U_{i-1}}{2h}

Den sentrale førstederiverte, orden O(h2)O(h^2). Det er denne som brukes i randpunktet og som gjør at den falske noden i det hele tatt dukker opp.

orden 2 betyr: halveˊh  feilen deles pa˚ 4.\text{orden 2 betyr: halvér } h \ \Rightarrow\ \text{feilen deles på 4.}

Halveringstesten fra kap. 8.1. I løkke 4 brukes den som feilsøkingsverktøy: et skjema med en feil i randraden konvergerer ikke, og det ser du med to kjøringer.

Fra tidligere matematikkemner trengs å kunne løse et lite lineært system, og å lese enkel Python-kode med numpy. Du skal aldri skrive et program i denne boka — bare lese og feilsøke.

To slags problemer, to helt ulike løsningsmåter

Fram til nå har alt i Del 8 marsjert framover i tid: du kjenner starten, og du regner deg oppover rad for rad. Det kalles et initialverdiproblem.

Et randverdiproblem er noe annet. Der er betingelsene gitt i begge ender av intervallet, og det finnes ingen retning å marsjere i. En stang som holdes på 20 grader i den ene enden og er isolert i den andre — hva er temperaturen i midten når alt har roet seg? Du kan ikke starte i venstre ende og gå mot høyre, for du vet ikke hva stigningen skal være der.

Derfor må alle punktene finnes samtidig. Én likning per indre punkt, alle koblet til naboene sine, samlet i ett lineært system AU=bA\mathbf U = \mathbf b. Det er samme tridiagonale form som i kap. 8.3, men nå kommer den ikke av et tidssteg — den kommer av selve problemet.

Så kommer den lille komplikasjonen som gir kapitlet navn. Er randbetingelsen av typen «temperaturen er 55 grader», setter du bare inn tallet. Men er den «enden er isolert», altså u(1)=0u'(1) = 0, må du bruke en differansekvotient i randpunktet — og sentraldifferansen der peker på et punkt som ligger utenfor intervallet. Det punktet finnes ikke. Trikset er å late som det gjør, og deretter eliminere det. Den fiktive verdien kalles en falsk node.

Og til slutt en sjanger som er helt egen for dette emnet: du får et kort program som løser et slikt problem, det gir feil svar, og du skal finne den ene linja som er skyld i det. Det er ikke et programmeringspensum — det er en test på om du forstår hvor randbetingelsen bor i koden.

Kapitlet gjør fire ting: setter opp systemet med Dirichlet-rand, innfører den falske noden, viser hvorfor den er verdt bryet, og går gjennom kodefeil-lokalisering med en oppskrift som virker.

Flashcard- og repetisjonsstoff — hopp trygt over ved førstegangslesing. Definisjonsboksene i dette kapitlet er samtidig kortene i flashcard-bunken. Ved første gjennomlesing holder det å lese formelen og gå videre til eksempelet; tidsanslaget på 60 minutter gjelder kjernestoffet.

Løkke 1 — Fra differensiallikning til likningssystem (~15 min)

Vi begynner med det enkleste tilfellet: verdien er gitt i begge ender. Da er hele jobben å skrive én likning per indre punkt og samle dem.

Randverdiproblem
En differensiallikning på et intervall [a,b][a,b] der betingelsene er gitt i begge endepunktene:

u(x)+q(x)u(x)=g(x),axb,u''(x) + q(x)\,u(x) = g(x), \qquad a \le x \le b,

med én betingelse i x=ax = a og én i x=bx = b.

Kontrast til et initialverdiproblem, der begge betingelsene er gitt i samme punkt (u(a)u(a) og u(a)u'(a)). Der kan du marsjere framover ett skritt om gangen, slik Del 7 gjør med Euler og Runge–Kutta. I et randverdiproblem finnes ingen slik retning: alle verdiene bestemmer hverandre gjensidig.

Merk bokstavene. Mange lærebøker skriver høyresiden som r(x)r(x). Her heter den g(x)g(x), siden rr i Del 8 er stabilitetstallet fra kap. 8.2. Innholdet er det samme.

Diskretisering av randverdiproblemet
Legg gitteret xi=a+ihx_i = a + ih med h=(ba)/Nh = (b-a)/N, og erstatt uu'' med den andre sentraldifferansen i hvert indre punkt:

Ui+12Ui+Ui1h2+q(xi)Ui=g(xi),i=1,,N1.\frac{U_{i+1} - 2U_i + U_{i-1}}{h^2} + q(x_i)\,U_i = g(x_i), \qquad i = 1,\dots,N-1.

Ganger du opp med h2h^2, ser strukturen slik ut:

Ui1+(2+h2qi)Ui+Ui+1=h2gi.U_{i-1} + \left(-2 + h^2q_i\right)U_i + U_{i+1} = h^2 g_i.

Dette er én likning per indre punkt, med tre ukjente hver — og med bare naboene involvert. Samlet blir det et tridiagonalt system.

Formen er verdt å legge merke til: koeffisienten 11 på begge naboene, og hele likningens egenart samlet i diagonalleddet 2+h2qi-2 + h^2q_i. Er qq konstant, er diagonalen den samme i alle radene.

Systemet AU=bA\mathbf U = \mathbf b
Med N1N-1 indre punkter og kjente randverdier blir systemet

A=(2+h2q1112+h2q2112+h2qN1),U=(U1UN1),A = \begin{pmatrix} -2+h^2q_1 & 1 & & \\ 1 & -2+h^2q_2 & 1 & \\ & \ddots & \ddots & \ddots \\ & & 1 & -2+h^2q_{N-1}\end{pmatrix}, \qquad \mathbf U = \begin{pmatrix}U_1\\ \vdots\\ U_{N-1}\end{pmatrix},

bi=h2gi,med b1=U0  og  bN1=UN.b_i = h^2 g_i, \quad\text{med } b_1 \mathrel{-}= U_0 \ \text{ og } \ b_{N-1} \mathrel{-}= U_N.

De to siste trekkene er de som glemmes. I første likning står U0U_0, som er kjent — den flyttes over til høyresiden med motsatt fortegn. Det samme med UNU_N i siste likning.

Er randverdiene null, faller begge bort, og alle radene ser like ut. Det er derfor eksamensoppgaver ofte har u(a)=0u(a) = 0.

Dirichlet-rand i systemet

En Dirichlet-betingelse gir verdien direkte: u(a)=αu(a) = \alpha, altså U0=αU_0 = \alpha.

Behandlingen er den enkleste som finnes: U0U_0 er ikke en ukjent, den er et tall. Den fjernes fra ukjentvektoren, og bidraget U0U_0 fra første likning flyttes over til høyresiden.

Systemet får dermed N1N-1 ukjente ved to Dirichlet-render, og alle radene er «vanlige» radene fra diskretiseringen.

Navnet er verdt å kunne: Dirichlet-rand er «verdien er gitt», Neumann-rand er «den deriverte er gitt». Begge navn brukes i oppgavetekstene, og begge er innført i kap. 5.1.

✏️Sett opp og løs systemet med Dirichlet-rand i begge ender
Diskretiser

u9u=9x,0x1,u(0)=0,u(1)=0,u'' - 9u = 9x, \qquad 0 \le x \le 1, \qquad u(0) = 0, \quad u(1) = 0,

med h=13h = \tfrac13. Sett opp AU=bA\mathbf U = \mathbf b, løs, og sammenlign med den eksakte løsningen.

Steg 1 — gitteret. N=3N = 3 delintervall gir x0=0x_0 = 0, x1=13x_1 = \tfrac13, x2=23x_2 = \tfrac23, x3=1x_3 = 1, og h=13h = \tfrac13 med h2=19h^2 = \tfrac19, altså 1/h2=91/h^2 = 9.

De ukjente er U1U_1 og U2U_2. Randverdiene er U0=U3=0U_0 = U_3 = 0.

Steg 2 — diskretiser. Fra formelarket: uUi+12Ui+Ui1h2u'' \approx \dfrac{U_{i+1}-2U_i+U_{i-1}}{h^2}. Sett inn i likningen:

Ui+12Ui+Ui1h29Ui=9xi.\frac{U_{i+1}-2U_i+U_{i-1}}{h^2} - 9U_i = 9x_i.

Med 1/h2=91/h^2 = 9 blir venstre side 9(Ui+12Ui+Ui1)9Ui9\left(U_{i+1}-2U_i+U_{i-1}\right) - 9U_i. Del alt på 9:

Ui+13Ui+Ui1=xi.U_{i+1} - 3U_i + U_{i-1} = x_i.

Pent. Med akkurat dette hh-et og denne qq-en blir alle koeffisientene hele tall.

Steg 3 — skriv likningene.

i=1i = 1: U23U1+U0=13U_2 - 3U_1 + U_0 = \tfrac13. Med U0=0U_0 = 0:

3U1+U2=13.-3U_1 + U_2 = \tfrac13.

i=2i = 2: U33U2+U1=23U_3 - 3U_2 + U_1 = \tfrac23. Med U3=0U_3 = 0:

U13U2=23.U_1 - 3U_2 = \tfrac23.

Steg 4 — systemet.

(3113)(U1U2)=(1323).\begin{pmatrix}-3 & 1\\ 1 & -3\end{pmatrix}\begin{pmatrix}U_1\\ U_2\end{pmatrix} = \begin{pmatrix}\tfrac13\\ \tfrac23\end{pmatrix}.

Steg 5 — løs. Fra første likning: U2=3U1+13U_2 = 3U_1 + \tfrac13. Sett inn i den andre:

U19U11=238U1=53U1=524=0,208333.U_1 - 9U_1 - 1 = \tfrac23 \quad\Longrightarrow\quad -8U_1 = \tfrac53 \quad\Longrightarrow\quad U_1 = -\frac{5}{24} = -0{,}208333.

U2=3(524)+13=1524+824=724=0,291667.U_2 = 3\left(-\frac{5}{24}\right) + \frac13 = -\frac{15}{24} + \frac{8}{24} = -\frac{7}{24} = -0{,}291667.

Kontroll: U13U2=524+2124=1624=23U_1 - 3U_2 = -\tfrac{5}{24} + \tfrac{21}{24} = \tfrac{16}{24} = \tfrac23. ✓

Steg 6 — sammenlign med fasiten. Den eksakte løsningen finnes: homogen del Acosh3x+Bsinh3xA\cosh 3x + B\sinh 3x, partikulær up=xu_p = -x (sett inn: 09(x)=9x0 - 9(-x) = 9x ✓). Randbetingelsene gir A=0A = 0 og Bsinh3=1B\sinh 3 = 1, altså

u(x)=sinh3xsinh3x,sinh3=10,0179.u(x) = \frac{\sinh 3x}{\sinh 3} - x, \qquad \sinh 3 = 10{,}0179.

u(13)=1,1752010,017913=0,216023,u(23)=3,6268610,017923=0,304628.u(\tfrac13) = \frac{1{,}17520}{10{,}0179} - \frac13 = -0{,}216023, \qquad u(\tfrac23) = \frac{3{,}62686}{10{,}0179} - \frac23 = -0{,}304628.

Avvikene er 0,00770{,}0077 og 0,01300{,}0130. Med bare to indre punkter er det bra.

Steg 7 — kontroller ordenen. Skjemaet skal være O(h2)O(h^2), så feilen skal deles på 4 når hh halveres. Kjørt for N=3,6,12,24N = 3, 6, 12, 24 blir største feil

1,30102,3,46103,8,81104,2,22104,1{,}30\cdot 10^{-2}, \quad 3{,}46\cdot 10^{-3}, \quad 8{,}81\cdot 10^{-4}, \quad 2{,}22\cdot 10^{-4},

med forholdene 3,743{,}74, 3,933{,}93 og 3,973{,}97 — på vei mot 4. ✓ Andre orden bekreftet.

Denne konvergenskontrollen er verdt å nevne i besvarelsen, og i løkke 4 blir den selve feilsøkingsverktøyet.

📝Oppgave 1

(Innstegsoppgave — ren innsetting.) Diskretiser u=6xu'' = 6x[0,1][0,1] med u(0)=0u(0) = 0, u(1)=1u(1) = 1 og h=12h = \tfrac12.

a) Hvor mange ukjente er det?
b) Skriv opp likningen for det indre punktet.
c) Løs den.

📝Oppgave 2
P
Diskretiser

u4u=8,0x1,u(0)=0,u(1)=1,u'' - 4u = 8, \qquad 0 \le x \le 1, \qquad u(0) = 0, \quad u(1) = 1,

med h=13h = \tfrac13.

a) Sett opp AU=bA\mathbf U = \mathbf b.
b) Løs systemet.

Løkke 2 — Neumann-rand og den falske noden (~16 min)

Nå kommer kapitlets kjerne. Hva gjør du når randbetingelsen ikke gir en verdi, men en stigning?

Neumann-rand
En randbetingelse på den deriverte:

u(b)=β.u'(b) = \beta.

Det vanligste tilfellet på eksamen er β=0\beta = 0, som fysisk betyr en isolert ende: ingen varme slipper ut.

To ting endrer seg i forhold til Dirichlet:

1. Randverdien UNU_N er nå en ukjent. Systemet får én ekstra ukjent og én ekstra rad.
2. Den ekstra raden må komme fra randbetingelsen — og det er der den falske noden dukker opp.

Neumann-betingelsen er innført i kap. 5.1, der den ga cosinus-egenfunksjoner i stedet for sinus.

Den falske noden
Et fiktivt gitterpunkt utenfor intervallet, xN+1=b+hx_{N+1} = b + h, med en verdi UN+1U_{N+1} som ikke svarer til noe fysisk.

Hvorfor det trengs: vi vil bruke sentraldifferansen i randpunktet, fordi den er O(h2)O(h^2):

u(b)UN+1UN12h.u'(b) \approx \frac{U_{N+1} - U_{N-1}}{2h}.

Den peker på xN+1x_{N+1}, som ligger utenfor. Vi later som punktet finnes, bruker det i to likninger, og eliminerer det.

Det er ikke juks. Den falske verdien opptrer bare som et mellomledd og forsvinner igjen. Ingen påstand om hva uu er utenfor intervallet blir stående.

Kalles også fiktiv node eller spøkelsespunkt (ghost point).

Elimineringen, steg for steg. Anta u(b)=0u'(b) = 0 i høyre ende.

Steg 1 — randbetingelsen med sentraldifferanse:

UN+1UN12h=0UN+1=UN1.\frac{U_{N+1} - U_{N-1}}{2h} = 0 \quad\Longrightarrow\quad U_{N+1} = U_{N-1}.

Den falske verdien er altså speilbildet av naboen på innsiden.

Steg 2 — bruk differensiallikningen også i randpunktet. Likningen gjelder helt ut til randen, så vi skriver den for i=Ni = N:

UN+12UN+UN1h2+qNUN=gN.\frac{U_{N+1} - 2U_N + U_{N-1}}{h^2} + q_N U_N = g_N.

Steg 3 — sett inn fra steg 1. Erstatt UN+1U_{N+1} med UN1U_{N-1}:

2UN12UNh2+qNUN=gN.\frac{2U_{N-1} - 2U_N}{h^2} + q_N U_N = g_N.

Her er hele poenget: koeffisienten foran UN1U_{N-1} ble 22, ikke 11. De to naboverdiene falt sammen til én, og bidragene la seg oppå hverandre.

Å glemme den faktoren 2 er den enkeltfeilen som er dokumentert i løsningsforslagene — og den er også kodefeilen du skal lete etter i løkke 4. Skriv 22 og understrek den.

Intuisjon: betingelsen u(b)=0u'(b) = 0 sier at kurven er flat i randen. Da er verdien på utsiden lik verdien på innsiden — profilen speiler seg om randpunktet. Tegn det, og faktoren 2 blir opplagt.

Er u(b)=β0u'(b) = \beta \ne 0, gir samme regning UN+1=UN1+2hβU_{N+1} = U_{N-1} + 2h\beta, og randraden blir

2UN12UNh2+qNUN=gN2βh.\frac{2U_{N-1} - 2U_N}{h^2} + q_NU_N = g_N - \frac{2\beta}{h}.

Det ekstra leddet flyttes over til høyresiden.

📝Oppgave 3

(Innstegsoppgave — ren opptelling.) Et randverdiproblem på [0,1][0,1] diskretiseres med N=5N = 5 delintervall.

a) Hvor mange ukjente er det når begge randbetingelsene er av Dirichlet-type?
b) Hvor mange er det når venstre rand er Dirichlet og høyre rand er Neumann?
c) Hvilke gitterpunkter trenger en falsk node i tilfellet i b), og hvor ligger den?

✏️Falsk node fra ende til annen, med kontroll mot fasiten
Diskretiser

u16u=16x,0x1,u(0)=0,u(1)=0,u'' - 16u = 16x, \qquad 0 \le x \le 1, \qquad u(0) = 0, \quad u'(1) = 0,

med h=14h = \tfrac14. Sett opp AU=bA\mathbf U = \mathbf b med falsk node ved høyre rand, løs, og sammenlign med den eksakte løsningen.

Steg 1 — gitteret og de ukjente. N=4N = 4 gir xi=0; 0,25; 0,5; 0,75; 1x_i = 0;\ 0{,}25;\ 0{,}5;\ 0{,}75;\ 1 og 1/h2=161/h^2 = 16.

U0=0U_0 = 0 er kjent (Dirichlet). U4U_4 er ukjent, fordi høyre rand bare gir stigningen. De ukjente er altså U1,U2,U3,U4U_1, U_2, U_3, U_4 — fire stykker.

Steg 2 — diskretiser likningen. Fra formelarket:

Ui+12Ui+Ui1h216Ui=16xi.\frac{U_{i+1}-2U_i+U_{i-1}}{h^2} - 16U_i = 16x_i.

Med 1/h2=161/h^2 = 16 blir venstre side 16(Ui+12Ui+Ui1)16Ui16\left(U_{i+1}-2U_i+U_{i-1}\right) - 16U_i. Del alt på 16:

Ui+13Ui+Ui1=xi.U_{i+1} - 3U_i + U_{i-1} = x_i.

Steg 3 — de indre likningene (i=1,2,3i = 1,2,3).

i=1i = 1, med U0=0U_0 = 0: 3U1+U2=0,25\quad -3U_1 + U_2 = 0{,}25

i=2i = 2: U13U2+U3=0,5\quad U_1 - 3U_2 + U_3 = 0{,}5

i=3i = 3: U23U3+U4=0,75\quad U_2 - 3U_3 + U_4 = 0{,}75

Steg 4 — randraden med falsk node (i=4i = 4). Skriv samme likning i randpunktet:

U53U4+U3=x4=1.U_5 - 3U_4 + U_3 = x_4 = 1.

Randbetingelsen u(1)=0u'(1) = 0 med sentraldifferanse:

U5U32h=0U5=U3.\frac{U_5 - U_3}{2h} = 0 \quad\Longrightarrow\quad U_5 = U_3.

Sett inn:

2U33U4=1.\boxed{2U_3 - 3U_4 = 1.}

Faktoren 2 foran U3U_3 er hele poenget. Skriver du 11 der, løser du et helt annet problem — som du skal se i løkke 3 og 4.

Steg 5 — systemet.

(3100131001310023)(U1U2U3U4)=(0,250,50,751).\begin{pmatrix}-3 & 1 & 0 & 0\\ 1 & -3 & 1 & 0\\ 0 & 1 & -3 & 1\\ 0 & 0 & 2 & -3\end{pmatrix}\begin{pmatrix}U_1\\ U_2\\ U_3\\ U_4\end{pmatrix} = \begin{pmatrix}0{,}25\\ 0{,}5\\ 0{,}75\\ 1\end{pmatrix}.

Legg merke til at matrisen ikke lenger er symmetrisk — den siste raden har 2 der de andre har 1. Det er normalt for falsk-rand-behandlingen og er ikke en feil.

Steg 6 — løs. Ved eliminasjon:

U1=45188=0,239362,U2=2247=0,468085,U_1 = -\frac{45}{188} = -0{,}239362, \qquad U_2 = -\frac{22}{47} = -0{,}468085,
U3=125188=0,664894,U4=7394=0,776596.U_3 = -\frac{125}{188} = -0{,}664894, \qquad U_4 = -\frac{73}{94} = -0{,}776596.

Kontroll i randraden: 2(125188)3(146188)=250+438188=188188=12\left(-\tfrac{125}{188}\right) - 3\left(-\tfrac{146}{188}\right) = \tfrac{-250 + 438}{188} = \tfrac{188}{188} = 1. ✓

Kontroll i rad 2: 45188+6647125188-\tfrac{45}{188} + \tfrac{66}{47} - \tfrac{125}{188}. Med felles nevner 188: 45+264125188=94188=0,5\tfrac{-45 + 264 - 125}{188} = \tfrac{94}{188} = 0{,}5. ✓

Steg 7 — sammenlign med fasiten. Eksakt: partikulær up=xu_p = -x (sett inn: 016(x)=16x0 - 16(-x) = 16x ✓), homogen Acosh4x+Bsinh4xA\cosh 4x + B\sinh 4x. Fra u(0)=0u(0) = 0: A=0A = 0. Fra u(1)=0u'(1) = 0: 4Bcosh41=04B\cosh 4 - 1 = 0, altså B=14cosh4B = \dfrac{1}{4\cosh 4}:

u(x)=sinh4x4cosh4x,cosh4=27,30823.u(x) = \frac{\sinh 4x}{4\cosh 4} - x, \qquad \cosh 4 = 27{,}30823.

xxnumeriskeksaktavvik
0,250,239362-0{,}2393620,239241-0{,}2392410,000120-0{,}000120
0,500,468085-0{,}4680850,466797-0{,}4667970,001288-0{,}001288
0,750,664894-0{,}6648940,658289-0{,}6582890,006605-0{,}006605
1,000,776596-0{,}7765960,750168-0{,}7501680,026428-0{,}026428

Merk at feilen er størst i randpunktet. Det er typisk: randraden er den eneste som er behandlet spesielt, og den bærer mest feil. Men den er fortsatt O(h2)O(h^2) — se løkke 3.
Det som gir uttelling i denne oppgavetypen: (1) at du skriver differensiallikningen også i randpunktet, (2) at du bruker sentraldifferansen — ikke en ensidig — på randbetingelsen, (3) at faktoren 2 kommer riktig ut, og (4) minst én innsettingskontroll. Ren fasit uten disse fire gir ikke full uttelling.
📝Oppgave 4

Sett opp randraden med falsk node i hvert tilfelle. Likningen er u+qu=gu'' + q u = g, gitteret har NN delintervall, og randbetingelsen gjelder i xN=bx_N = b.

a) u(b)=0u'(b) = 0
b) u(b)=3u'(b) = 3
c) Venstre rand i stedet: u(a)=0u'(a) = 0, med falsk node U1U_{-1}.

📝Oppgave 5
P
Diskretiser

u4u=4,0x1,u(0)=0,u(1)=0,u'' - 4u = 4, \qquad 0 \le x \le 1, \qquad u'(0) = 0, \quad u(1) = 0,

med h=12h = \tfrac12. Sett opp systemet og løs det.

Løkke 3 — Hvorfor ikke bare bruke en ensidig differanse? (~13 min)

— naturlig pausepunkt —

Et rimelig spørsmål: hvorfor gjøre det så tungvint? Randbetingelsen u(b)=0u'(b) = 0 kunne jo like gjerne skrives

UNUN1h=0UN=UN1,\frac{U_N - U_{N-1}}{h} = 0 \quad\Longrightarrow\quad U_N = U_{N-1},

uten noen falsk node i det hele tatt. Svaret er at det ødelegger hele skjemaet, og det er verdt å se hvorfor.

Ordenen til randbehandlingen

En differanselikning er bare så nøyaktig som sitt svakeste ledd.

- Den andre sentraldifferansen i de indre punktene er O(h2)O(h^2).
- Falsk node bruker den sentrale førstederiverte i randpunktet, som også er O(h2)O(h^2). Skjemaet forblir andreordens.
- Ensidig differanse i randpunktet er O(h)O(h). Den ene raden trekker hele løsningen ned til første orden.

Regelen er generell og verdt å kunne: randbehandlingen må ha minst samme orden som skjemaet inne i området, ellers er den høyere ordenen bortkastet.

Det er hele grunnen til at den falske noden finnes. Den er ikke et pedagogisk påfunn — den er billigste vei til å bevare orden 2.

✏️To randbehandlinger, målt mot hverandre

Løs problemet fra eksempel 2 — u16u=16xu'' - 16u = 16x, u(0)=0u(0) = 0, u(1)=0u'(1) = 0 — for N=4,8,16,32,64N = 4, 8, 16, 32, 64, én gang med falsk node og én gang med den ensidige betingelsen UN=UN1U_N = U_{N-1}. Sammenlign største feil.

Resultatet av de to kjøringene:

NNhhfalsk nodeforholdensidigforhold
40,25002,6431022{,}643\cdot 10^{-2}1,5401011{,}540\cdot 10^{-1}
80,12507,4731037{,}473\cdot 10^{-3}3,547,0051027{,}005\cdot 10^{-2}2,20
160,06251,9331031{,}933\cdot 10^{-3}3,873,3141023{,}314\cdot 10^{-2}2,11
320,03124,8741044{,}874\cdot 10^{-4}3,971,6091021{,}609\cdot 10^{-2}2,06
640,01561,2211041{,}221\cdot 10^{-4}3,997,9231037{,}923\cdot 10^{-3}2,03

Les kolonnene med forhold. Falsk node gir forholdet 4 — feilen deles på fire når hh halveres, altså orden 2. Den ensidige gir forholdet 2 — bare orden 1.
Se hva det koster i praksis. Ved N=64N = 64 er feilen med falsk node 1,21041{,}2\cdot 10^{-4}; med ensidig rand er den 7,91037{,}9\cdot 10^{-3}65 ganger større. Og forspranget vokser: hver halvering av hh dobler forholdet mellom de to.
Sagt på en annen måte: for å nå samme nøyaktighet som falsk node gir ved N=8N = 8, trenger den ensidige varianten omtrent N=570N = 570. Det er en veldig dyr forenkling.
Det ene ekstra trinnet — å skrive likningen i randpunktet og speile den falske noden inn — er altså ikke pynt. Det er forskjellen mellom en andreordens og en førsteordens metode.
Merk også at feilen med ensidig rand ikke er konsentrert nær randen. Den forplanter seg innover, fordi alle likningene er koblet. Én dårlig rad ødelegger for hele løsningen — og det er nettopp derfor kodefeil i randraden er så vanskelige å oppdage ved å se på tallene.
📝Oppgave 6
En annen måte å bevare orden 2 på i randpunktet er å bruke den ensidige andreordens formelen fra kap. 8.1:

u(xN)3UN4UN1+UN22h.u'(x_N) \approx \frac{3U_N - 4U_{N-1} + U_{N-2}}{2h}.

a) Skriv opp randraden som u(b)=0u'(b) = 0 da gir.
b) Hvilken fordel og hvilken ulempe har denne varianten sammenlignet med falsk node?
c) Hvorfor blir matrisen ikke lenger tridiagonal?

Løkke 4 — Å finne den ene linja som er feil (~16 min)

Nå til den sjangeren som er helt egen for dette emnet. Du får et kort program, det gir feil svar, og du skal peke på linja.

Dette er ikke et programmeringspensum. Du skal aldri skrive et program på eksamen. Du skal lese femten linjer og se hvor randbetingelsen bor.

Oppskrift: finn feilen i et differanseprogram

Fire steg, i denne rekkefølgen. De tar til sammen fem minutter.

1. Sjekk om randbetingelsene faktisk er oppfylt i det svaret programmet gir. Er u(0)=0u(0) = 0 i oppgaven, men U00U_0 \ne 0 i utskriften, ligger feilen i randbehandlingen — ikke i løkka.
2. Sammenlign radene i matrisen med likningene du selv utleder for hånd. Skriv opp én indre rad og randraden på papir, og les dem mot koden. Nesten alle plantede feil ligger i randraden.
3. Forfin gitteret. Halver hh og se om feilen synker. Gjør den ikke det, er feilen strukturell — en rad som svarer til et annet problem. Er den strukturelle feilen i randraden, kan feilen til og med vokse når du forfiner.
4. Sjekk løkkegrensene. range(1, n) gir i=1,,n1i = 1, \dots, n-1. Skal siste indre punkt være med, må grensen være n+1 eller punktet behandles for seg.

Steg 1 er det som løser oppgaven ni ganger av ti, og det er det som er formulert i oppgavetekstene: «se at randbetingelsen ikke er oppfylt, og pek på linja».

✏️Kodefeil-lokalisering: programmet som ikke respekterer randbetingelsen
En student skal løse randverdiproblemet fra eksempel 2,

u16u=16x,u(0)=0,u(1)=0,u'' - 16u = 16x, \qquad u(0) = 0, \quad u'(1) = 0,

og skriver dette programmet. Det gir feil svar. Finn feilen, forklar symptomet, og rett den.

import numpy as np

n = 4                          # antall delintervall
h = 1/n
x = np.linspace(0, 1, n+1)
A = np.zeros((n, n))           # ukjente er U_1, ..., U_4
b = np.zeros(n)

for i in range(1, n):          # de indre punktene
    A[i-1, i-1] = -2/h**2 - 16
    if i >= 2:
        A[i-1, i-2] = 1/h**2
    A[i-1, i] = 1/h**2
    b[i-1] = 16*x[i]

A[n-1, n-2] = 1/h**2           # raden for randpunktet x_n
A[n-1, n-1] = -2/h**2 - 16
b[n-1] = 16*x[n]

U = np.linalg.solve(A, b)
print(np.round(U, 6))

Utskrift:

[-0.227273 -0.431818 -0.568182 -0.522727]
Steg 1 — sjekk randbetingelsen i svaret. Betingelsen er u(1)=0u'(1) = 0: løsningen skal flate ut mot høyre ende. Se på de to siste tallene:

U3=0,568182,U4=0,522727.U_3 = -0{,}568182, \qquad U_4 = -0{,}522727.

Kurven stiger mot randen, med en stigning på omtrent (U4U3)/h=0,18(U_4-U_3)/h = 0{,}18. Den er ikke i nærheten av flat. Randbetingelsen er brutt, og etter steg 1 i oppskriften ligger feilen dermed i randbehandlingen.

Steg 2 — utled randraden for hånd og les den mot koden. Fra eksempel 2: skriv differensiallikningen i i=4i = 4 og sett inn U5=U3U_5 = U_3 fra randbetingelsen:

2U32U4h216U4=16.\frac{2U_3 - 2U_4}{h^2} - 16U_4 = 16.

Koeffisienten foran U3U_3 skal altså være 2h2\dfrac{2}{h^2}.

I koden står det

A[n-1, n-2] = 1/h**2

Det er feilen, og det er én linje. Faktoren 2 mangler. De to naboverdiene U3U_3 og U5U_5 falt sammen til én da den falske noden ble eliminert, og bidragene skulle legges sammen.

Steg 3 — hvorfor symptomet følger av feilen. Raden koden faktisk løser, er

U32U4h216U4=16,\frac{U_3 - 2U_4}{h^2} - 16U_4 = 16,

som er den samme som du ville fått av å sette U5=0U_5 = 0 — altså en Dirichlet-betingelse i den falske noden, ikke u(1)=0u'(1) = 0. Programmet løser et helt annet randverdiproblem: ett der løsningen tvinges mot null like utenfor intervallet. Derfor bøyer kurven oppover mot randen i stedet for å flate ut.

Steg 4 — bekreft med gitterforfining. Kjør det samme programmet for flere nn og se på randverdien UnU_n:

nnU(1)U(1) med feilenU(1)U(1) retteteksakt
40,522727-0{,}5227270,776596-0{,}7765960,750168-0{,}750168
80,314344-0{,}3143440,757641-0{,}7576410,750168-0{,}750168
160,172100-0{,}1721000,752100-0{,}7521000,750168-0{,}750168
320,089919-0{,}0899190,750655-0{,}7506550,750168-0{,}750168

Se på venstre kolonne: den går mot null, ikke mot fasiten. Feilen blir verre når gitteret forfines. Det er det sikreste tegnet på en strukturell feil i en randrad — en ren regnefeil ville blitt mindre.
Den rettede kolonnen konvergerer pent mot 0,750168-0{,}750168, med feil som deles på omtrent fire for hver halvering.
Rettelsen er én tegn:
A[n-1, n-2] = 2/h**2
Slik formuleres svaret på eksamen, kort og med begge delene med:

Linja A[n-1, n-2] = 1/h**2 er feil; den skal være 2/h**2. Ved elimineringen av den falske noden U5=U3U_5 = U_3 legger de to naboleddene seg oppå hverandre, så koeffisienten foran U3U_3 blir 2/h22/h^2. Med koeffisienten 1/h21/h^2 løser programmet i stedet problemet med U5=0U_5 = 0, altså en verdibetingelse i den fiktive noden. Symptomet er at den numeriske løsningen stiger mot høyre rand i stedet for å flate ut, og at feilen vokser når gitteret forfines.

Merk hva som gir uttelling: å peke på linja alene er halve svaret. Den andre halvdelen er å forklare hvorfor symptomet følger av feilen — at randbetingelsen blir en annen enn den oppgaven ba om.

📝Oppgave 7

Et program skal ta fem tidssteg med det eksplisitte skjemaet for varmelikningen med r=0,4r = 0{,}4, på et symmetrisk startprofil. Det gir dette svaret:

[0.       0.206821 0.326136 0.342679 0.270243 0.142233 0.      ]

Startprofilen var (0; 0,3; 0,7; 1,0; 0,7; 0,3; 0)\left(0;\ 0{,}3;\ 0{,}7;\ 1{,}0;\ 0{,}7;\ 0{,}3;\ 0\right), og randbetingelsene er kalde ender i begge sider.

a) Hva er galt med svaret, uten å regne noe?
b) Her er løkka. Finn feilen.

for n in range(5):
    for i in range(1, len(U)-1):
        U[i] = U[i] + r*(U[i+1] - 2*U[i] + U[i-1])

c) Hva blir riktig svar?

📝Oppgave 8
P

Et program skal løse varmelikningen ut=uxxu_t = u_{xx}[0,1][0,1] med u(0,t)=0u(0,t) = 0, u(1,t)=1u(1,t) = 1 og u(x,0)=0u(x,0) = 0 for x<1x < 1. Etter 50 tidssteg med r=0,4r = 0{,}4 og h=0,1h = 0{,}1 gir det

[0.  0.001071 0.002039 0.002812 0.003313 0.003492 0.003329 0.002838 0.002066 0.001087 0.  ]

a) Hva forteller svaret deg umiddelbart?
b) Her er tidsløkka. Finn feilen.

for k in range(steg):
    Ny = np.zeros_like(U)
    Ny[1:-1] = U[1:-1] + r*(U[2:] - 2*U[1:-1] + U[:-2])
    U = Ny

c) Hva skulle svaret nærmet seg?

📝Oppgave 9

Et program løser u+4u=0u'' + 4u = 0[0,1][0,1] med u(0)=1u(0) = 1, u(1)=2u(1) = 2, og bygger matrisen med denne løkka:

for i in range(1, n):
    A[i-1, i-1] = -2/h**2 + 4
    if i >= 2:
        A[i-1, i-2] = 1/h**2
    if i <= n-2:
        A[i-1, i] = 1/h**2
b[0] = -1/h**2
b[n-2] = -2/h**2

a) Kontroller at diagonalen er riktig.
b) Kontroller randbidragene i b.
c) Programmet gir en løsning som er nær null overalt. Hvor bør du lete?

Begrepsbank

Flashcard- og repetisjonsstoff — hopp trygt over ved førstegangslesing. Boksene under samler resten av kapitlets begreper som egne kort.

Blandet rand (Robin-betingelse)
En betingelse som blander verdi og derivert:

αu(b)+βu(b)=γ.\alpha\,u(b) + \beta\,u'(b) = \gamma.

Behandlingen er den samme som for ren Neumann: skriv u(b)u'(b) med sentraldifferanse, løs for den falske verdien

UN+1=UN1+2hβ(γαUN),U_{N+1} = U_{N-1} + \frac{2h}{\beta}\left(\gamma - \alpha U_N\right),

og sett inn i likningen for i=Ni = N. Nå havner det ekstra UNU_N-leddet i diagonalen, ikke bare i høyresiden.

Betingelsen dukker opp i varmeledning mot omgivelser med gitt temperatur («Newtons avkjølingslov»), og prinsippet er identisk: én falsk verdi, én eliminasjon.

Residualtesten
Sett den beregnede løsningen tilbake inn i likningssystemet og se hva som blir til overs:

s=AUb.\mathbf s = A\mathbf U - \mathbf b.

Er s\mathbf s nær null, er systemet løst riktig. Da er en eventuell feil i oppsettet av systemet, ikke i løsningen av det.

Er s\mathbf s stor, er det løseren eller innsettingen som svikter — for eksempel en nær-singulær matrise.

Testen skiller altså mellom to helt ulike feiltyper, og den tar noen sekunder. På eksamen gjør du den ved å sette svaret inn i én eller to av likningene, slik alle eksemplene i dette kapitlet gjør.

Gitterforfining som diagnose

Kjør samme program med hh og med h/2h/2, og sammenlign feilen mot en kjent fasit — eller, mangler fasit, sammenlign de to numeriske svarene med hverandre.

- Feilen deles på fire: skjemaet er andreordens og trolig riktig.
- Feilen deles på to: ordenen er falt til én. Se etter en ensidig differanse et sted, typisk i randraden.
- Feilen synker ikke, eller vokser: skjemaet løser et annet problem. Feilen er strukturell, og den ligger nesten alltid i en rad som er utledet spesielt.

Den siste linja er det kraftigste diagnoseverktøyet i hele Del 8, og den er lett å bruke: to kjøringer og en divisjon.

Symptom og årsak

I kodefeil-oppgavene skal du levere begge deler:

- Symptomet er det du ser i utskriften: en randverdi som er feil, en løsning som ikke er symmetrisk, tall som vokser, en kurve som bøyer feil vei.
- Årsaken er linja i koden.

Og du skal koble dem: vise at nettopp den linja gir nettopp det symptomet, ved å skrive ut hvilket problem koden faktisk løser.

I eksempel 4 var koblingen at koeffisienten 1/h21/h^2 svarer til UN+1=0U_{N+1} = 0, altså en verdibetingelse i den falske noden i stedet for u(b)=0u'(b) = 0 — og en løsning som tvinges mot null utenfor intervallet, bøyer oppover mot randen. Den setningen er halve poengsummen.

Entydighet for randverdiproblemet

Det diskrete systemet AU=bA\mathbf U = \mathbf b har entydig løsning når AA er inverterbar. For u+qu=gu'' + qu = g er det garantert når q(x)0q(x) \le 0 på hele intervallet: da er matrisen diagonaldominant, akkurat som i kap. 8.3.

Er q>0q > 0, kan det gå galt — og det speiler det kontinuerlige problemet. u+π2u=0u'' + \pi^2 u = 0 med u(0)=u(1)=0u(0) = u(1) = 0 har uendelig mange løsninger, fordi π2\pi^2 er en egenverdi, slik du så i kap. 5.1.

Praktisk: står det 16u-16u, 9u-9u eller 4u-4u i oppgaven, er alt i orden. Står det +u+u med positivt fortegn, er det verdt en setning om at systemet likevel har entydig løsning for det aktuelle gitteret.

Indekseringen i koden mot indekseringen på papiret

På papiret nummereres gitterpunktene U0,U1,,UNU_0, U_1, \dots, U_N. I koden ligger de ukjente i en vektor som starter på indeks 0.

Er U0U_0 kjent (Dirichlet), er de ukjente U1,,UNU_1,\dots,U_N, og de ligger i kodens U[0] til U[n-1]. Forskyvningen på én er kilden til halvparten av alle leserfeil.

Kontrollvanen: skriv i margen hvilken papirindeks kodens A[0,0] og A[n-1,n-1] svarer til, før du leser resten. Da ser du med én gang om A[n-1, n-2] er randraden eller ikke.

Repetisjonsoppgaver
Din fremgang
0 / 5 oppgaver
Symbol- og formelliste

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.

Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Norges teknisk-naturvitenskapelige universitet. Dette er ikke offisielt studiemateriell. Les mer.