3 svar
1078 visningar
Nide är nöjd med hjälpen
Nide 114
Postad: 15 nov 2018 17:23 Redigerad: 15 nov 2018 17:24

Konvertera Explicit Euler lösning till Implicit Euler (med fixpunktsmetoden)

Jag har "en" uppgift som ser ut såhär:

Jag har redan löst uppgift A och B (men hade med dem för kontext) och nu har jag fastnat på uppgift G. Jag vet inte riktigt var jag ska börja.

MATLAB koden för uppgift B (fall 2, acceleration) ser ut såhär (funktionen "Func" är funktionen från uppgift A):

Det ända som jag gjort i Uppgift G är att jag skrivit en funktion för fixpunktsmetoden:

Borde jag modifiera koden i Uppgift B eller är det en bättre idé att skriva koden för bakåt Euler från scratch? Har ni några tips på hur jag kan modifiera koden i Uppgift B för att uppfylla kraven i Uppgift G? Jag vet ungefär hur bakåt Euler fungerar men har lite svårt med integrera detta kodmässigt (modifiera koden i B). MATLAB är nytt för mig.

Förlåt för den långa texten.

Tack!

Albiki 5096 – Fd. Medlem
Postad: 16 nov 2018 22:22

Hej!

Du har alltså differentialekvationen för ledarbilen

    xM'(t)=g(xM(t))x_{M}'(t) = g(x_{M}(t))

och differentialekvationerna för de M-1M-1 stycken efterföljande bilarna

    xi'(t)=f(xi+1(t)-xi(t))x_{i}'(t) = f(x_{i+1}(t)-x_{i}(t)).

Jag skriver bara om ledarbilen och överlåter till dig att tillämpa det jag skriver på de efterföljande bilarna.

Eulers bakåtmetod tillämpad på ledarbilen ger talföljden (xMk)(x_{M}^{k}) där

    xMk+1-xMkh=g(xMk+1)xMk+1=xMk+h·g(xMk+1)\displaystyle\frac{x_{M}^{k+1}-x_{M}^{k}}{h} = g(x_{M}^{k+1}) \iff x_{M}^{k+1} = x_{M}^{k} + h \cdot g(x_{M}^{k+1})

och xMkxM(tk)x_M^{k} \approx x_M(t_{k}).

Givet xMkx_{M}^{k} ska man alltså lösa den icke-linjära ekvationen

    y=xMk+h·g(y)y = x_{M}^{k}+h \cdot g(y)

för att finna xMk+1x_{M}^{k+1}.

Definiera därför funktionen G(u)=xMk+h·g(u)G(u) = x_{M}^{k}+h \cdot g(u) så att du ska lösa ekvationen

    y=G(y)y = G(y);

som du ser är yy en fixpunkt till funktionen GG. Skapa en fixpunktsiteration

    yi+1=G(yi)y_{i+1} = G(y_{i})

och använd förslagsvis startvärdet y0=xMk.y_{0} = x_{M}^{k}. Kontrollera att funktionen GG verkligen är en kontraktionsavbildning så att du är försäkrad om att fixpunktsiterationen konvergerar; du kanske även måste formulera om fixpunktsiterationen för att snabba på konvergenshastigheten om talföljden (yi)(y_{i}) verkar konvergera alltför långsamt (snabb konvergens är viktig eftersom du måste köra om fixpunktsiterationen för att finna ledarbilens nästa position xMk+2x_{M}^{k+2}).

Albiki 5096 – Fd. Medlem
Postad: 17 nov 2018 15:18

En kommentar om din fixpunktskod:

Det är onödigt att spara successiva iterationer i en vektor (x); jag föreslår istället att du har ett enda tal som du uppdaterar vid varje iteration ända tills önskad noggrannhet nåtts och att du även håller koll på antalet iterationer, så att koden stoppar om den har varit igång för länge utan att önskad noggrannhet erhållits.

Förslagsvis kan koden ge output "Konvergens har ej nåtts efter N iterationer", där N är specificerat av användaren i förväg (exempelvis N = 100) om detta inträffar; i annat fall blir output en approximation till den sökta fixpunkten. (Man kan även tänka sig att output inkluderar texten "Konvergens har nåtts efter k iterationer" där k är index för den iteration efter vilken önskad noggrannhet uppnåtts. 

Input till proceduren FixPunktIter är funktionen g, startvärde x0, önskad noggrannhet och Maximalt antal tillåtna iterationer (N). 

Omet 3 – Fd. Medlem
Postad: 25 nov 2020 17:57
Albiki skrev:

Hej!

Du har alltså differentialekvationen för ledarbilen

    xM'(t)=g(xM(t))x_{M}'(t) = g(x_{M}(t))

och differentialekvationerna för de M-1M-1 stycken efterföljande bilarna

    xi'(t)=f(xi+1(t)-xi(t))x_{i}'(t) = f(x_{i+1}(t)-x_{i}(t)).

Jag skriver bara om ledarbilen och överlåter till dig att tillämpa det jag skriver på de efterföljande bilarna.

Eulers bakåtmetod tillämpad på ledarbilen ger talföljden (xMk)(x_{M}^{k}) där

    xMk+1-xMkh=g(xMk+1)xMk+1=xMk+h·g(xMk+1)\displaystyle\frac{x_{M}^{k+1}-x_{M}^{k}}{h} = g(x_{M}^{k+1}) \iff x_{M}^{k+1} = x_{M}^{k} + h \cdot g(x_{M}^{k+1})

och xMkxM(tk)x_M^{k} \approx x_M(t_{k}).

Givet xMkx_{M}^{k} ska man alltså lösa den icke-linjära ekvationen

    y=xMk+h·g(y)y = x_{M}^{k}+h \cdot g(y)

för att finna xMk+1x_{M}^{k+1}.

Definiera därför funktionen G(u)=xMk+h·g(u)G(u) = x_{M}^{k}+h \cdot g(u) så att du ska lösa ekvationen

    y=G(y)y = G(y);

som du ser är yy en fixpunkt till funktionen GG. Skapa en fixpunktsiteration

    yi+1=G(yi)y_{i+1} = G(y_{i})

och använd förslagsvis startvärdet y0=xMk.y_{0} = x_{M}^{k}. Kontrollera att funktionen GG verkligen är en kontraktionsavbildning så att du är försäkrad om att fixpunktsiterationen konvergerar; du kanske även måste formulera om fixpunktsiterationen för att snabba på konvergenshastigheten om talföljden (yi)(y_{i}) verkar konvergera alltför långsamt (snabb konvergens är viktig eftersom du måste köra om fixpunktsiterationen för att finna ledarbilens nästa position xMk+2x_{M}^{k+2}).

Tja, vi har lite problem med att förstå hur vi ska översätta detta till kod. Skulle du kunna ge något exempel? 

Detta har vi förstått:

 Vi vill ha en approximativ position för varje bil i ett visst ögonblick så y=G(y) där tex för bil M G(u)= x(t,M)+h*g. Alltså söker vi ett u (dvs en position) så att u=G(u). Det löser vi genom att loopa igenom en FPI med y_i+1=G(y_i) med ett begynnelsevillkor y_0= x(1,M)=750. Då blir exempelvis y_2=G(y_1)= 750 +h*5.

Svara Avbryt
Close