• Första ordningens differentialekvationer
• Orientering om system av differentialekvationer / högre ordningens ekvationer
• Mer om kurvanpassning
• Orientering om beräkningar med Python (numpy)
Föreläsning 3
Första ordningens differentialekvationer
• Ofta har man differentialekvationer på formen
y’(t) = f(t, y(t))
y(t
1) = y
1• Lösning består av en funktion som beskriver hur ett system utvecklas
• Svårt att finna analytiska lösningar för godtyckliga ekvationer
• Vi tar därför i stället fram en numerisk uppskattning och får en serie punkter som funktionen går igenom
0 1 2 3 4 5
–1 –2 –3 –4
0 1 2
–1
Riktningsfält
• Derivatadelen kan ses som ett riktningsfält (”vägvisare”)
• Riktningsfältet + startvärdet ger lösningen
y’(t) = –2·y(t)
y(0) = 4
0 1 2 3 4 5
–1 –2 –3 –4
0 1 2
–1
Riktningsfält
• Derivatadelen kan ses som ett riktningsfält (”vägvisare”)
• Riktningsfältet + startvärdet ger lösningen
y’(t) = –2·y(t)
y(0) = 4
Eulers metod
Utgå från positionen givet av startvärdet och ”stega” fram lösningen på riktningsfältet i små steg (storlek dt). Jfr Leibniz’ notation:
y’(t) = → dy = dt ⋅ y’(t)
1. Starta från begynnelsevärdet (t1,y1): tc = t1, yc = y1 2. Bestäm nästa position strax till höger:
yc = yc + dt * f(tc,yc) tc = tc + dt
(Detta är Matlab-tilldelningar, inte ekvationer…) 3. Upprepa steg 2 så länge tc < T (slutvärdet)
dy dt
Exempel (se film 3.3)
• Vi löser differentialekvationen y'(t) = –sin(t)
y(0) = 2 för t = 0..4
Inbyggda funktioner i Matlab
[t y] = ode45(function,[start end],startValue);
[t y] = ode23(function,[start end],startValue);
Subtil skillnad mellan funktionerna – mindre skillnader i
antal steg och hur stegstorleken varieras (ej fixt steg).
Exempel (se tillhörande video)
• Vi löser samma differentialekvation som tidigare med ode23 och ode45, och noterar hur få steg de tar, och ändå lyckas komma mycket nära den analytiska lösningen
Om ode23 och ode45
”ode23 is a three-stage, third-order, Runge-Kutta method.
ode45 is a six-stage, fifth-order, Runge-Kutta method. ode45 does more work per step than ode23, but can take much
larger steps.
For differential equations with smooth solutions, ode45 is often more accurate than ode23.”
Cleve Moler, Ordinary Differential Equation Solvers ODE23 and ODE45,
https://blogs.mathworks.com/cleve/2014/05/26/ordinary-differential-equation-solvers-ode23-and-ode45/
Se även FMNN10 (Numeriska metoder för differentialekvationer), obl. F3/Pi3, valfri I4.
System av differentialekvationer
• ode23/ode45 kan även lösa system av differentialekvationer
• parametern y i f(t,y) ersätts då med en
kolonnvektor och vi returnerar en kolonnvektor av y´- värden för alla de ingående funktionerna
• ode23/ode45 löser alla funktionerna på samma gång och returnerar en y-matris med lösningar för alla
funktionerna
Detaljerna lämnas som övning åt intresserade eller som inläsning vid behov
Högre ordningens differentialekvationer
• Högre ordningens differentialekvationer kan skrivas om till system av första ordningens ekvationer
y’’+7y’–3y = 0
y(0) = 0, y’(0) = 1
• Inför y1 = y, y2 = y’, vilket ger:
y1’ = y2
y2’ = 3y1–7y2
y1(0) = 0, y2(0) = 1
Detaljerna lämnas som övning åt intresserade eller som inläsning vid behov
Att anpassa en kurva till en datamängd
Se film 3.1–3.2
t y
0 6.24
1 4.61
2 3.48
3 2.55
4 2.06
5 1.42
6 1.21
7 0.69
8 0.62
9 0.39
10 0.37
Sammanfattning kurvanpassning
polyfit(x,y,n)
anpassa ett n-tegradspolynom till punkterna
polyfit(x,y,1)
anpassa linje enligt minsta-kvadrat-metoden
Ibland kan man överföra problemet till linjär form för att sedan anpassa en linje enligt minsta-kvadrat-metoden
ex:
y(x) = a ⋅ c
x!"
log y(x) = log a + x·log c
Vi kan nu hitta värden för log a och log c med hjälp av polyfit.
Beräkningar med Python
• Matlab välbeprövat, utvecklat under lång tid, använt av många
… men licenskostnaden kan avskräcka
• Ett fritt alternativ: Python med paketet numpy (ofta tillsammans med scipy, matplotlib, …)
• Python är ett generellt scriptspråk
• Kan användas interaktivt, precis som Matlab
• Kan använda scriptfiler, precis som Matlab
• Generell programmering ungefär som Java
• Begriplig syntax (för en Java-/Matlab-programmerare)
numpy
• Ett paket för Python
(måste ofta installeras separat)
• Numeriska beräkningar / scientific computing
• Synsätt och standardfunktioner tydligt inspirerat av Matlab
Läs mer på
https://numpy.org
import numpy
import matplotlib.pyplot as plt
x = numpy.linspace(0, 10) y1 = numpy.sin(x)
y2 = numpy.cos(x)
plt.plot(x, y1, 'r-') plt.plot(x, y2, ’g.') plt.show()