Noregs teknisk-naturvitenskapelege universitet
Institutt for konstruksjonsteknikk

Kontaktperson: Leif Rune Hellevik
Tlf: 73594535/98283895
Dato: 10. juni 2016
Figur 1: Skjematisk framstilling av diskretisering og grenseverdiar.

I denne oppgåva skal me sjå på følgjande ikkje-lineære ordinære differensiallikning (ODL): $$ \begin{align} y^{\prime\prime} + 2 \, \left(y \cdot y^\prime\right) &= 0 \label{eq:ODE} \end{align} $$ med tilhøyrande grenseverdiar: $$ \begin{align} y(x_{\min}) = 1 \qquad \text{og} \qquad y(x_{\max}) = 0.5 \label{eq:BCs} \end{align} $$ der \( x_{\min}=1 \) og \( x_{\max}=2 \). Me diskretiserar med konstant \( \Delta x = (x_{\max} - x_{\min})/N \), der \( N=50 \) (sjå figur 1). Då \( y \) er kjend på rendene har me \( N-1 \) ukjende.
a) Vis at \eqref{eq:ODE} og \eqref{eq:BCs} har den analytiske løysinga: $$ \begin{align} y &= \frac{1}{x} \label{eq:ODEsol} \end{align} $$
Ved å derivere likning \eqref{eq:ODEsol} får me \( y' = \frac{-1}{x^2} \) og \( y''=\frac{2}{x^3} \) eg ved innsetjing i likning \eqref{eq:ODE} og \eqref{eq:BCs} får me: $$ \begin{align} \frac{2}{x^3} + 2 \left(\frac{1}{x} \frac{-1}{x^2}\right) = 0 \quad y(x_{\min}) = y &= \frac{1}{1}=1 \quad y(x_{\max}) = \frac{1}{2} = 0.5 \label{eq:ODEsol_show} \end{align} $$
b) Set opp likning \eqref{eq:ODE} som eit system av første ordens ODLar.
Me brukar at \( y_0 = y \) som vidare gir: $$ \begin{align*} y_0^\prime &= y_1 \label{} \\ y_1^\prime &= -2\left(y_0 \cdot y_1 \right) \label{} \end{align*} $$
c)
I vedlegget finn du eit program-skjelett. Bruk dette
program-skjelettet til å løyse likningssystemet i b) med
skyteteknikk. Fyll inn kommandoar der det er markert i
program-skjelettet. Bruk \( s_0=0 \) og \( s_1=-0.5 \) som dei to fyrste verdiane for s.
Kva for ei verdi av s ventar du at programmet avsluttar med?
Merk at programmet nyttar funksjonen rk4 frå modulen ODEschemes til å løyse initialverdiproblemet for kvar startverdi me tippar. Denne funksjonen kan du rekne som kjend og det er ikkje naudsynt å greia ut om denne.
Det som manglar for at me kan løyse dette som eit initialverdiproblem er \( y'(x_{\min}) \) som her blir verdien for s. Frå den analytiske løysinga har me at \( y'=\frac{-1}{x^2} \rightarrow y'(x_{\min}) = \frac{-1}{1^2} = -1 \). Som er verdien av s som me ventar at programmet vil avslutta med.
# Eksamen2016/oppg1c.py
import numpy as np
import matplotlib.pylab as plt
from ODEschemes import euler, heun, rk4
def func(y, x):
y0 = y[0]
y1 = y[1]
return np.array([y1, -2*y0*y1])
x_0, x_end = 1, 2
y_0, y_end = 1, 0.5
N = 50
X = np.linspace(x_0, x_end, N +1)
Y_analytic = 1/X
s0 = 0
Y_0 =[y_0, s0]
Y_num = euler(func, Y_0, X)
Y0 = Y_num[:, 0]
phi0 = y_end - Y0[-1]
s1 = -0.5
itMax = 10
tol = 10**(-10)
for n in range(itMax):
Y_0 =[y_0, s1]
Y_num = euler(func, Y_0, X)
Y0 = Y_num[:, 0]
phi1 = y_end - Y0[-1]
s2 = s1 - phi1*(s1 - s0)/(phi1 - phi0)
s0, s1, phi0 = s1, s2, phi1
if abs(s1 - s0) < tol:
break
print n, s1, phi1
plt.figur()
plt.plot(X, Y0)
plt.plot(X, Y_analytic, "k--")
plt.show()
d) Diskretiser likning \eqref{eq:ODE} med sentraldifferansar for \( y^{\prime\prime} \) og \( y^\prime \) og lineariser det ikkje-lineære leddet i den diskretiserte likninga ved hjelp av Newton-linearisering.
Vis at likningssystemet kan skrivast på følgjande tri-diagonale form: $$ \begin{align} \left( 1 - \Delta x \, \alpha_i \right) y_{i-1}^{m+1} + \left( \Delta x \, \beta_i -2 \right) y_i^{m+1} + \left( 1 + \Delta x \, \alpha_i\right) y_{i+1}^{m+1} = \Delta x \, \alpha_i \cdot \beta_i \label{eq:tridiagonal} \end{align} $$ og skriv ut uttrykkene for \( \alpha_i \) og \( \beta_i \).
Skriv ut likning \eqref{eq:tridiagonal} for rendene (\( i=1 \) og \( i=N-1 \)).
Bruk at $$ \begin{align} F\left(y_{i-1}, y_{i}, y_{i+1}\right)_{m+1} = F_m &+ \frac{\partial F_m}{\partial y_{i-1}^m}\;\delta y_{i-1} + \frac{\partial F_m}{\partial y_{i}^m}\;\delta y_{i} + \frac{\partial F_m}{\partial y_{i+1}^m}\;\delta y_{i+1} \label{eq:newton} \end{align} $$ der \( F_m = F\left(y_{i-1}^m, y_{i}^m, y_{i+1}^m\right) \) er det ikkje-lineære leddet, og $$ \begin{align*} \delta y_{i-1} = y_{i-1}^{m+1} - y_{i-1}^{m}, \qquad \delta y_{i} = y_{i}^{m+1} - y_{i}^{m}, \qquad \delta y_{i+1} = y_{i+1}^{m+1} - y_{i+1}^{m} \end{align*} $$ der me har innført sub-iterasjonsindeksen \( m \).
Me brukar sentraldifferansar slik at \( y^{\prime\prime} \approx \frac{y_{i-1} - 2 \, y_i + y_{i+1}}{{\Delta x}^2} \) og \( y^{\prime} \approx \frac{y_{i+1}-y_{i-1}}{2 \, \Delta x} \), som insatt i likning \eqref{eq:ODE} gir: $$ \begin{align} \frac{y_{i-1} - 2 \, y_i + y_{i+1}}{{\Delta x}^2} + 2 \, y_i \frac{y_{i+1}-y_{i-1}}{2 \, \Delta x} = 0 \label{_auto1}\\ \rightarrow y_{i-1} - 2 \, y_i + y_{i+1} + \Delta x \, y_i \left( y_{i+1}-y_{i-1} \right) = 0 \label{eq:discretized} \end{align} $$
Det ikkje-lineære leddet blir då \( F_{m+1} = y_i^{m+1} \left( y_{i+1}^{m+1}-y_{i-1}^{m+1} \right) \), og me bruk av likning \eqref{eq:newton} får me: $$ \begin{align} F_{m+1} \approx y_i^{m} \left( y_{i+1}^{m}-y_{i-1}^{m} \right) - \left( y_{i-1}^{m+1}-y_{i-1}^m \right) y_{i}^m + \left( y_{i}^{m+1}-y_{i}^m\right) \left( y_{i+1}^{m}-y_{i-1}^{m}\right) + \left( y_{i+1}^{m+1}-y_{i+1}^m\right) y_{i}^m \nonumber \\ = - y_i^m \, y_{i-1}^{m+1} + \left( y_{i+1}^m - y_{i-1}^m \right) \, y_i^{m+1} + y_i^m \, y_{i+1}^{m+1} - y_i^m \left( y_{i+1}^m - y_{i-1}^m\right) \label{_auto2}\\ = -\alpha_i \, y_{i-1}^{m+1} + \beta_i \, y_i^{m+1} + \alpha_i \, y_{i+1}^{m+1} - \alpha_i \cdot \beta_i \nonumber \end{align} $$ Der me har brukt at \( \alpha_i = y_i^m \) og \( \beta_i = y_{i+1}^m - y_{i-1}^m \), som dessutan gir at \( \alpha_i \cdot \beta_i = F_m \). Vidare innsetjing i \eqref{eq:discretized}: $$ \begin{align} \left( 1 - \Delta x \, \alpha_i \right) y_{i-1}^{m+1} + \left(\Delta x \, \beta_i -2 \right) y_i^{m+1} + \left( 1 + \Delta x \, \alpha_i\right) y_{i+1}^{m+1} = \Delta x \, \alpha_i \cdot \beta_i \label{_auto3} \end{align} $$
For \( i=1 \) får me: $$ \begin{align} \left(\Delta x \, \beta_1 -2 \right) y_1^{m+1} + \left( 1 + \Delta x \, \alpha_1\right) y_{2}^{m+1} = \Delta x \, \alpha_1 \cdot \beta_1 - \left( 1 - \Delta x \, \alpha_1 \right) y(x_{\min}) \label{_auto4} \end{align} $$
og for \( i=N-1 \): $$ \begin{align} \left( 1 - \Delta x \, \alpha_{N-1} \right) y_{N-2}^{m+1} + \left(\Delta x \, \beta_{N-1} -2 \right) y_{N-1}^{m+1} = \Delta x \, \alpha_{N-1} \cdot \beta_{N-1} - \left( 1 + \Delta x \, \alpha_{N-1}\right) y(x_{\max}) \label{_auto5} \end{align} $$
e) Bruk program-skjelettet i vedlegget til å løyse likning \eqref{eq:ODE} som eit randverdiproblem ved å bruka ein direkte løyser på likning \eqref{eq:tridiagonal}. Fyll inn kommandoar på dei markerte stadane i programmet.
# Eksamen2016/oppg1e.py
import numpy as np
import matplotlib.pylab as plt
import scipy
import scipy.linalg
import scipy.sparse
import scipy.sparse.linalg
x_0, x_end = 1, 2
y_0, y_end = 1, 0.5
N = 50
X = np.linspace(x_0, x_end, N + 1)
dx = X[1] - X[0]
Y_analytic = 1/X
Y0 = np.linspace(y_0, y_end, N + 1)
plt.figur()
plt.plot(X, Y0, 'o-')
legendList = ['it = 0']
itMax = 10
tol = 10**(-5)
for n in range(itMax):
alpha = Y0[1:-1]
beta = Y0[2:] - Y0[0:-2]
subDiag = 1 - dx*alpha[1:]
superDiag = 1 + dx*alpha[0:-1]
mainDiag = dx*beta -2
d = dx*alpha*beta
d[0] += -(1 - dx*alpha[0])*y_0
d[-1] += -(1 + dx*alpha[-1])*y_end
A = scipy.sparse.diags([subDiag, mainDiag, superDiag], [-1, 0, 1], format='csc')
Y1 = scipy.sparse.linalg.spsolve(A, d)
Y1 = np.append(Y1, y_end)
Y1 = np.append(y_0, Y1)
Y0 = Y1
plt.plot(X, Y0, 'o-')
legendList.append('it = {0}'.format(n + 1))
if abs(np.max(Y_analytic - Y0)) < tol:
break
plt.plot(X, Y_analytic, "k--")
legendList.append('analytic')
plt.legend(legendList)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
Adveksjonslikninga er gitt ved: $$ \begin{equation} \frac{\partial u}{\partial t} + a_0 \, \frac{\partial u}{\partial x} = 0 \label{eq:advection} \end{equation} $$
Lax-Friedrich- skjemaet brukar forover-differansar for den tidsderiverte og sentral-differansar for den deriverte i rom. Til forskjell frå det ustabile FTCS-skjemaet (Forward in time, central in space), stabiliseras Lax-Friedrich-skjemaet ved å bytte \( u_j^n \) ut med \( u_j^n \approx \frac{u_{j + 1}^n + \, u_{j - 1}^n}{2} \) i diskretiseringa av den tidsderiverte.
a) Vis at Lax-Friedrich skjemaet kan skrivast på forma: $$ \begin{equation} u_j^{n+1}=\frac{1}{2} \left(u_{j + 1}^n + u_{j - 1}^n\right) - \frac{C}{2} \left(u_{j + 1}^n - u_{j - 1}^n\right) \label{eq:lax} \end{equation} $$ og finn uttrykket for CFL-talet \( C \).
med \( C = \frac{a_0 \Delta t}{\Delta x} \)
b) Kva for teoretisk orden har Lax-Friedrich-skjemaet i likning \eqref{eq:lax}?
Skjemaet er \( O(\Delta t) \) og \( O(\Delta x^2) \). Forover-differansar gir første orden i tid og sentral-differansar gir andre orden i rom.
c) Bruk kriteriet om positive koeffisientar (PK-kriteriet) til å vurdere stabiliteten til skjemaet i likning \eqref{eq:lax}.
Skjemaet kan skrivast om til: $$ \begin{equation} u_j^{n+1}=\frac{1 - C}{2} u_{j + 1}^n + \frac{1 + C}{2} u_{j - 1}^n \label{eq:lax_pk} \end{equation} $$
Ser at koeffisientane summeres opp til 1; \( \frac{1 - C}{2} + \frac{1 + C}{2} = 1 \), og at andre ledd på høgre side alltid er positivt medan det første leddet er positiv dersom \( C \leq 1 \), som gir eit tilstrekkeleg stabilitets-krav for Lax-Friedrich. Dersom \( C < 0 \) har me at det andre leddet er positivt dersom \( C \geq -1 \).
d) Utfør Von Neumann analyse på Lax-Friedrich skjemaet, og finn eit uttrykk for \( \lvert G \rvert \).
Samanlikne resultatet med det du fekk ved å bruka PK-kriteriet.
Er kriteriet du kom fram til naudsynt og/eller tilstrekkeleg?
Skjemaet kan skrivast om til: $$ \begin{equation} u_j^{n+1}=\frac{1}{2} \left(u_{j + 1}^n + u_{j - 1}^n\right) - \frac{C}{2} \left(u_{j + 1}^n - u_{j - 1}^n\right) \label{eq:lax_Von} \end{equation} $$ $$ \begin{equation} G^{n+1} \cdot e^{i \beta y_j}=\frac{1}{2} \left(G^{n} \cdot e^{i \beta y_{j+1}} + G^{n} \cdot e^{i \beta y_{j-1}}\right) - \frac{C}{2} \left(G^{n}\cdot e^{i \beta y_{j+1}} - G^{n}\cdot e^{i \beta y_{j-1}}\right) \label{eq:lax_Von1} \end{equation} $$
Ved å introdusera \( y_{j \pm 1} = y_j \pm h \) and \( \delta = \beta \cdot h \) then dividing by \( G^{n} \cdot e^{i y_j} \) får me: $$ \begin{equation} G =\frac{1}{2} \left(e^{i \delta} + e^{- i \delta}\right) - \frac{C}{2} \left(e^{i \delta} - e^{-i \delta}\right) \label{eq:lax_Von2} \end{equation} $$
med hjelp av følgjande relasjonar: $$ \begin{equation*} e^{i \delta} = cos \delta + i sin \delta \\ e^{-i \delta} = cos \delta - i sin \delta \\ e^{i \delta} + e^{- i \delta} = 2cos \delta \\ e^{i \delta} - e^{- i \delta} = 2 i sin \delta \nonumber \end{equation*} $$
får me: $$ \begin{equation} G = cos \delta - i C sin \label{eq:lax_Von3} \end{equation} $$
og $$ \begin{equation} \lvert G \rvert = \sqrt{cos^2 \delta + C^2 sin^2 \delta} \label{eq:lax_Von4} \end{equation} $$
kor me har brukt at modulusen til eit komplekst tal \( z = a + i b \), er \( \lvert z\rvert = \sqrt{a^2 + b^2} \)
Me har at \( \lvert G \rvert \leq 1 \) (\( \frac{\lvert G \rvert}{\lvert G_a \rvert } \leq 1 \) med \( \lvert G_a \rvert = 1 \)). Som vidare gir at \( -1 \leq C \leq 1 \).
Von Neumann gir eit naudsynt og dermed også tilstrekkeleg kriteria. PK gir eit tilstrekkeleg kriteria, som dermed kan vera meir strengt enn Von-Neumann. Her ser med derimot at dei gir like kriteria.
e) I figur 2 ser du plot av \( \epsilon_D = \lvert G \rvert \) for Lax-Friedrich, samt Lax-Wendroff og oppstraumsskjemaet (ftbs, forward in time backward in space).
Ved hjelp av resultatet frå førre oppgåve, finn kva for eit plot som samsvarer med Lax-Friedrich skjemaet.
Kan du seie noko om kva for plot som svarar til dei andre to numeriske metodane? Grunngjev svara dine kort.
Figur 2: Illustrasjon av \( \epsilon_D = \lvert G \rvert \) for Lax-Friedrich, samt Lax-Wendroff og oppstraumsskjemaet (ftbs, forward in time backward in space).

Frå førre oppgåve har me at $$ \begin{equation*} \lvert G \rvert = \sqrt{cos^2 \delta + C^2 sin^2 \delta} \nonumber \end{equation*} $$
som gir: $$ \begin{equation*} \delta = 0 \rightarrow \lvert G \rvert = 1 \\ \delta = \frac{\pi}{2} \; rad = 90^o \rightarrow \lvert G \rvert = C \\ \delta = \pi \; rad = 180^o \rightarrow \lvert G \rvert = 1 \nonumber \end{equation*} $$
som samsvarar med den blå linja. Lax-Wendroff er eit andre ordens skjema i både tid og rom og er dermed mykje mindre diffusivt en dei andre to (for relativt små verdier av \( \delta \)), og samsvarer derfor med den raue linja.
Figur 3: .

f) I figur 4 ser du plot av numeriske løysingar av adveksjonslikninga med bølgje-hastigheit (\( a_0 = 1 \)) og ei \( \sin^{4} \)-initial-bølgje (stipla linje lengst til venstre). Dei numeriske løysingane er generert med dei same skjemaa som i førre oppgåve (farga linjer). Den stipla svarte linja til høgre er analytisk løysing.
Kva slags skjema samsvarer med kva for ei løysing (Løysingane har \( \delta < 90^o \) )?
Kva kan du seie om dispersjonsfeilen \( \epsilon_{\phi} \) for den lilla løysinga? Argumenter kort for svara dine.
Figur 4: Numeriske løysingar av adveksjonslikninga generert med Lax-Wendroff-, Lax-Friedrich- og FTBS-skjema. Den stipla svarte linja svarer til den analytiske løysinga.

Frå figur 2 har me at \( \lvert G \rvert_{LW} > \lvert G \rvert_{FTBS} > \lvert G \rvert_{LF} \). Dette gir at tap av amplitude for Lax Friedrich (LF) er større enn hos FTBS, som igjen er større enn hos Lax Wendroff (LW). I tilegg veit me at Lax Wendroff som er eit andre ordens skjema kan gi oskilasjonar i nærleiken av løysingar med store gradientar (lilla linje).
Figur 5: .

g) Skriv Lax-Friedrich-skjemaet i likning \eqref{eq:lax} som ein python-funksjon. Funksjonen skal ta inn løysinga fra førre tidssteg \( u^n \) for alle nodar, og returnere løysinga for neste tidssteg \( u^{n+1} \) for alle nodane unntatt grensenodane. La CFL-talet \( C \) vera ein global variabel.
def Lax_Friedrich(u_old):
u_minus = u_old[:-2]
u_plus = u_old[2:]
u_mid_new = 0.5*(u_plus + u_minus) - 0.5*C*(u_plus - u_minus)
return u_mid_new
I denne oppgåva ser me i a, b og c på den diskretiserte likninga: $$ \begin{equation} \label{eq:oppg3_disk} u^{n+1}_j=u^n_j+D\left [\theta(u^{n+1}_{j+1}-2u_j^{n+1}+u^{n+1}_{j-1})+(1-\theta)(u^n_{j+1}-2u^n_j+u^n_{j-1}) \right ] \end{equation} $$
der \( 0\leq\theta\leq 1 \).
a) Kva for problem/differensial-likning kan løysast med likning \eqref{eq:oppg3_disk}?
I likning \eqref{eq:oppg3_disk} er den eindimensjonale diffusjonslikninga: $$ \begin{equation} \label{eq:5211} \frac{\partial u}{\partial t}=\alpha\frac{\partial^2u}{\partial x^2} \end{equation} $$
diskretisert. Eksemplar på problem er varmeoverføring, oppstart av rør-straumning og straumning i porøse media.
b) Er skjemaet i likning \eqref{eq:oppg3_disk} implisitt eller eksplisitt? Kva er skilnaden mellom implisitte og eksplisitte skjema?
skjemaet i likning \eqref{eq:oppg3_disk} er eksplisitt for \( \theta=0 \), og elles implisitt. Ein seier at skjemaet er eksplisitt dersom \( u \) kan skrivast på ein formel der høgre side berre inneheld kjende størrelsar, altså dersom \( u_j^{n+1} \) kan uttrykkjast som ein funksjon av \( u^n \). Dersom det er fleire ukjente på høgre side (\( u_{j-1}^{n+1} \) og \( u_{j+1}^{n+1} \) til dømes), er skjemaet implisitt, og må løysast som eit system av likningar.
c) Kva for verdi av \( \theta \) gir skjemaet gitt i \eqref{eq:oppg3_disk} høgast teoretisk orden (i tid)? Kva skjema får ein då?
Med \( \theta=1/2 \) blir både \( \frac{\partial u}{\partial t} \) og \( \frac{\partial^2u}{\partial x^2} \) diskretisert med sentraldifferansar, og me får Crank-Nicholson skjemaet som er av 2. orden.
d) La \( E \) vera eit mål på feilen mellom ei numerisk løysing \( \hat{f} \) og den analytiske løysinga \( f \) til ei ordinær differanselikning (initialverdiproblem) som er gitt ved: $$ \begin{align} E = \sqrt{\frac{1}{N}\sum\limits_{i=1}^N\left(\hat{f_i}-f_i\right)^2} \nonumber \end{align} $$
der \( i \) er løysinga i node \( i \). La vidare \( \hat{f^{(1)}} \) vera ei numerisk løysing for ein gitt \( \Delta t \) og \( \hat{f^{(2)}} \) med \( \frac{\Delta t}{2} \), begge løyst med Heuns metode. Vidare har me rekna ut følgjande: $$ \begin{align} \frac{log\left(\frac{E^{(1)}}{E^{(2)}} \right)}{log\left(\frac{\Delta t}{\frac{\Delta t}{2}} \right)} = \frac{log\left(\frac{E^{(1)}}{E^{(2)}} \right)}{log\left(2\right)} =log_2\left(\frac{E^{(1)}}{E^{(2)}} \right) \label{eq:order} \end{align} $$
Argumenter for kva den teoretiske verdien av uttrykket i likning \eqref{eq:order} er for Heuns-metode?
Uttrykkjet i \eqref{eq:order} forventast å nærme seg skjemaet si teoretiske orden; 2 for heuns metode som er av 2. orden.
Skyteteknikk:
import numpy as np
import matplotlib.pylab as plt
from ODEschemes import euler, heun, rk4
def func(y, x):
""" Fill in this function"""
return
x_0, x_end = 1, 2 # boundary-domain values
y_0, y_end = 1, 0.5 # boundaryvalues
N = 50 # number of dx-spaces
X = np.linspace(x_0, x_end, N + 1)
Y_analytic = 1/X
"""Start fill in 1 """
s0 = # first guess of s
Y_0 = # initial conditions
""" End fill in 1 """
Y_num = rk4(func, Y_0, X) #solve
Y0 = Y_num[:, 0] # Extract vector with solutions for y and not dy
"""Start fill in 2 """
phi0 = # calculate phi(s0)
s1 = # second guessed value of s
""" End fill in 2 """
itMax = 10
tol = 10**(-5)
for n in range(itMax):
""" Start fill in 3 """
Y_0 =
Y_num = rk4(func, Y_0, X) # solve
Y0 = Y_num[:, 0] # Extract vector with solutions for y and not dy
phi1 = # calculate phi(s1)
s2 = # caluclate s2 using secant method
s0, s1, phi0 = # update values of s0 and s1 and phi0 after each iteration
""" End fill in 3 """
if abs(s1 - s0) < tol:
break
plt.figur()
plt.plot(X, Y0)
plt.plot(X, Y_analytic, "k--")
Direkte metode:
import numpy as np
import matplotlib.pylab as plt
import scipy
import scipy.linalg
import scipy.sparse
import scipy.sparse.linalg
x_0, x_end = 1, 2
y_0, y_end = 1, 0.5
N = 50
X = np.linspace(x_0, x_end, N + 1)
dx = X[1] - X[0]
Y_analytic = 1/X
Y0 = np.linspace(y_0, y_end, N + 1) # intial guess of y
itMax = 10
tol = 10**(-5)
for n in range(itMax):
""" Start fill in """
alpha =
beta =
subDiag =
superDiag =
mainDiag =
d =
d[0] +=
d[-1] +=
""" End fill in """
# Create matrix:
A = scipy.sparse.diags([subDiag, mainDiag, superDiag], [-1, 0, 1], format='csc')
Y1 = scipy.sparse.linalg.spsolve(A, d) # solve
Y1 = np.append(Y1, y_end)
Y1 = np.append(y_0, Y1)
Y0 = Y1
if abs(np.max(Y_analytic - Y0)) < tol:
break
plt.plot(X, Y_analytic, "k--")
plt.xlabel('x')
plt.ylabel('y')
plt.show()