2 svar
43 visningar
Nide är nöjd med hjälpen!
Nide 52
Postad: 15 nov 2018 Redigerad: 15 nov 2018

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 2911
Postad: 16 nov 2018

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 2911
Postad: 17 nov 2018

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). 

Svara Avbryt
Close