Serie 2
Transcription
Serie 2
D-MATH Dr. Vasile Gradinaru Alexander Dabrowski Numerische Methoden FS 2016 Serie 2 Best before: Di. 15.3 / Mi. 16.3, in den Übungsgruppen Koordinatoren: Alexander Dabrowski, HG G 52.1, alexander.dabrowski@sam.math.ethz.ch Webpage: http://www.math.ethz.ch/education/bachelor/lectures/fs2016/other/nm_pc 1. Trajektorie bei Streuung (Prüfungsaufgabe FS 13) Die Trajektorie eines Teilchens bei Streuung an einem Potential U (x, y) wird beschrieben durch: r̈ = −∇U wobei r = (x, y)T die Teilchenkoordinaten sind und U das Lennard-Jones Potential: 12 6 ! 1 1 U (x, y) = 4 − r r ist und r2 = x2 + y 2 . a) Plotten Sie die Teilchen-Trajektorien, die sich mit dem Störmer-Verlet Verfahren ergeben. b) Verwenden Sie folgende Anfangsbedingungen und Parameter: 8 • r(t = 0) = (−10, b)T , wobei b = 0.15, 0.3, 0.45, . . . , 3, 6 T • ṙ(t = 0) = (1, 0) , y 4 • Zeitschritt ∆t = 0.02, 2 0 −2 • Endzeit Tende = 15. −4 −10 −8 −6 −4 −2 x 0 2 4 6 Hinweis: Benutzen Sie das Template 1 ljones Template.py. Solution: Zunächst muss die Kraft auf das Teilchen explizit ausgerechnet werden: 2 1 x ∇U = −24 − . y r14 r8 (1) Anschliessend gibt es zwei Möglichkeiten das Störmer-Verlet Verfahren zu implementieren. Die Implementierungen sind in Listing 1 zu finden. Die Trajektorien sind in Abbildung 1 gezeigt. Listing 1: 1 ljones.py 1 import numpy a s np import matplotlib . pylab a s plt 3 d e f F(r): 5 Bitte wenden! 7 """ Bereche Beschleunigung fuer Streuproblem 9 Input : r ... Teilchen Koordinaten [x,y] 11 Output : Fval ... F(r) 13 """ 15 Fval = np. zeros (2) r2 = r [0]**2 + r [1]**2 rr = np. sqrt (r2) r14 = rr **14 r8 = rr **8 Fval [0] = 24.* r [0]*(2./ r14 - 1./ r8) Fval [1] = 24.* r [1]*(2./ r14 - 1./ r8) 17 19 21 23 # return r e t u r n Fval 25 d e f integrate_SV1 (r0 ,v0 ,dt , tEnd ): 27 29 """ Integriere Trajektorien im Lennard - Jones Potential mit dem Einschritt Stoermer - Verlet Verfahren 31 33 35 37 Input : r0 v0 dt tEnd ... ... ... ... Anfangskoordinaten r0 = [x0 ,y0] Anfangsgeschwindigkeiten v0 = [vx0 , vy0 ] Zeitschritt Endzeit 39 Output : t ... Zeit r ... Trajektorien r = [x ,y] v ... Geschwindigkeiten v = [vx ,vy] 41 """ 43 # Bestimme Anzahl Schritte N = tEnd /dt 45 47 49 51 53 # t r v mache Speicher = np. zeros (( N +1) ) = np. zeros ((2 ,N +1) ) = np. zeros ((2 ,N +1) ) # Setze Anfangsbedingungen t [0] = 0. r [: ,0] = r0 v [: ,0] = v0 55 57 59 61 # Integriere f o r i i n np. arange (N): ip = i + 1 t[ip] = t[i] + dt v12 = v[: ,i] + 0.5* dt*F(r[: ,i]) r[: , ip] = r[: ,i] + dt* v12 v[: , ip] = v12 + 0.5* dt*F(r[: , ip ]) 63 65 67 69 # return r e t u r n t,r,v d e f integrate_SV2 (r0 ,v0 ,dt , tEnd ): """ Integriere Trajektorien im Lennard - Jones Potential mit dem Siehe nächstes Blatt! 71 Zweischritt Stoermer - Verlet Verfahren 73 Input : r0 v0 dt tEnd 75 ... ... ... ... Anfangskoordinaten r0 = [x0 ,y0] Anfangsgeschwindigkeiten v0 = [vx0 , vy0 ] Zeitschritt Endzeit 77 79 Output : t ... Zeit r ... Trajektorien r = [x ,y] 81 """ 83 # Bestimme Anzahl Schritte N = tEnd /dt 85 87 89 91 93 # t r v mache Speicher = np. zeros (( N +1) ) = np. zeros ((2 ,N +1) ) = np. zeros ((2 ,N +1) ) # Setze Anfangsbedingungen t [0] = 0. r [: ,0] = r0 v [: ,0] = v0 95 97 99 101 103 # Mache ersten Schritt r [: ,1] = r [: ,0] + dt* v0 + 0.5* dt **2* F(r [: ,0]) # Integriere f o r i i n np. arange (1 ,N): im = i - 1 ip = i + 1 t[ip] = t[i] + dt r[: , ip] = - r[: , im] + 2.* r[: ,i] + dt **2* F(r[: ,i]) 105 107 109 111 # return r e t u r n t,r # Parameter tEnd = 15. dt = 0.02 Einschritt = True # Einschritt ( True ) oder Zweischritt ( False ) SV 113 115 117 119 121 123 125 127 # Berechne und Plotte Trajektorien plt . clf () f o r b i n np. linspace (0 ,3. ,21) : r0 = np. array ([ -10. , b]) v0 = np. array ([1. ,0.]) i f ( Einschritt ): [t,r,v] = integrate_SV1 (r0 ,v0 ,dt , tEnd ) else: [t,r] = integrate_SV2 (r0 ,v0 ,dt , tEnd ) plt . plot (r [0 ,:] ,r [1 ,:]) plt . grid (True) plt . xlabel ( ’$x$ ’) plt . ylabel ( ’$y$ ’) plt . savefig (’lj. pdf ’) 2. Plancksches Strahlungsgesetz (Aufgabe aus der Vorlesung) Verstehen Sie den Code BoltzmanConst.py Bitte wenden! 8 6 y 4 2 0 −2 −4 −10 −8 −6 −4 −2 x 0 2 4 6 Abbildung 1: Trajektorien im Lennard-Jones Potential. Solution: Listing 2: Python-Skript zu Aufgabe 2) 2 4 6 from numpy import linspace , exp , inf from pylab import figure , plot , savefig , show # Plank ’s law for blackbody radiation c1 = 3.7413*10**8 # W \ mu m ^4/ m ^2 c2 = 1.4388*10**4 # \mu m K T = 1000.0 # T = temperature in K 8 10 12 # monochromatic emissive power of a blackbody : d e f Eblam (lam , T =1000.0) : # lam = wavelength in \um r e t u r n c1 / ( lam **5 * ( exp (c2 /( lam *T)) -1.0) ) 14 16 18 20 p r i n t ’ ------------ plot ---------------’ y = linspace (0.01 , 10 , 1000) figure () plot (y, Eblam (y ,1600.0) / 10.0**4) savefig ("E. png ") show () 22 24 p r i n t ’ ------------ integrate : quad ---------------’ from scipy import integrate 26 28 # total energy lost per unit area Q, abserr , info = integrate . quad ( Eblam ,0 , inf , full_output =True) neval = info [’neval ’] Siehe nächstes Blatt! 30 # Q = sigma * T ^4; sigma = Stefan - Boltzmann constant p r i n t Q/T**4 , abserr , ’neval =’, neval 32 34 36 T = 200. # 5778. Q, abserr , info = integrate . quad ( Eblam ,0 , inf , args =(T), full_output =True) neval = info [’neval ’] # Q = sigma * T ^4; sigma = Stefan - Boltzmann constant p r i n t Q/T**4 , abserr , ’neval =’, neval 38 40 42 p r i n t ’ ------------ integrate : simpson ---------------’ from simpson import simpson f o r N i n xrange (20 ,50) : p r i n t simpson ( Eblam ,0.01 ,20. , N) /1000**4 , N 44 46 48 p r i n t ’ ------------ integrate : simpsadapt ---------------’ from simpsadapt import simpsadapt a = simpsadapt ( Eblam ,0.01 ,200. , eps =1E -6) p r i n t a, a [0]/1000**4 Abbildung 2: Plancksches Strahlungsgesetz Listing 3: Ausgabe des Skript 1 3 5 7 9 ------------ plot --------------BoltzmanConst .py :13: RuntimeWarning : overflow encountered i n exp r e t u r n c1 / ( lam **5 * ( exp (c2 /( lam *T)) -1.0) ) ------------ integrate : quad --------------5.66929491023 e -08 9.87919738904 e -07 neval = 105 5.66929491023 e -08 2.74856409294 e -08 neval = 165 ------------ integrate : simpson --------------5.58764899512 e -08 20 5.58633622191 e -08 21 Bitte wenden! 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 5.58568841455 e -08 22 5.58550419581 e -08 23 5.58561175664 e -08 24 5.5858777415 e -08 25 5.58620684146 e -08 26 5.58653667597 e -08 27 5.58683087932 e -08 28 5.58707211582 e -08 29 5.58725592785 e -08 30 5.58738578675 e -08 31 5.587469394 e -08 32 5.58751610543 e -08 33 5.58753527541 e -08 34 5.58753530235 e -08 35 5.58752317476 e -08 36 5.58750435057 e -08 37 5.58748283976 e -08 38 5.58746139549 e -08 39 5.58744174882 e -08 40 5.5874248457 e -08 41 5.58741106215 e -08 42 5.58740038646 e -08 43 5.58739256451 e -08 44 5.58738721014 e -08 45 5.58738388444 e -08 46 5.58738214943 e -08 47 5.58738160147 e -08 48 5.58738188954 e -08 49 ------------ integrate : simpsadapt --------------(56691.894595927217 , 1.6007106751203537 e -10 , 8192) 5.66918945959 e -08 Siehe nächstes Blatt! 3. Kernaufgabe: Anfangsamplitude eines Pendels zu gegebener Periode Solution: 12 Punkte insgesamt. Die Bewegungsgleichung eines mathematischen Pendels (Reibung vernachlässigt) der Länge l ist eine nicht-lineare gewöhnliche Differentialgleichung 2. Ordnung und das zugehörige Anfangswertproblem ist g ϕ̈ = − sin (ϕ) , l ϕ(0) = ϕ0 ∈ ]0, π ], 2 ϕ̇(0) = 0 , wobei ϕ(t) der Winkel des Pendels in Bezug zur vertikalen Richtung und g die Gravitationskonstante ist. Für grosse Amplituden ist die Periode T eine Funktion des Anfangswertes. Man kann eine Formel für T (ϕ0 ) wie folgt herleiten. Wir betrachten die gesamte Energie des Pendels, welche in der Zeitentwicklung erhalten bleiben muss 1 mgl(1 − cos ϕ0 ) = ml2 ϕ̇2 + mgl(1 − cos ϕ) . {z } |2 | {z } E0 =E(0) E(t) Auflösen dieser Gleichung nach ϕ̇ ergibt dϕ ϕ̇ = =± dt r 2g (cos ϕ − cos ϕ0 ) l und per Integration nach t bekommt man die Periode s Z ϕ0 1 l √ dϕ . T (ϕ0 ) = 4 2g 0 cos ϕ − cos ϕ0 Dieses Integral ist singulär bei ϕ = ϕ0 und numerisch schwierig zu berechnen. Deshalb wendet man erst die Substitution cos ϕ = 1 − 2 sin2 ϕ2 und dann die Variabeltransformation sin θ = sin( ϕ 2) an und bekommt ϕ sin( 20 ) s Z π 2 l 1 p (2) T (ϕ0 ) = 4 dθ . g 0 1 − k 2 sin2 θ {z } | :=K(k) ϕ0 wobei k := sin 2 und |ϕ0 | < π. Das bestimmte Integral K(k) ist gerade die Definition einer wohlbekannten speziellen Funktion: das vollständige elliptische Integral erster Art. Wir betrachten in dieser Aufgabe das nicht-lineare Anfangswertproblem. Bestimmen Sie den Anfangswinkel ϕ0 , so dass T = 1.8 s die Periode der Lösung ist. Die Parameter sind l = 0.6 m und g = 9.81 ms−2 . Aufgrund der Symmetrie passiert das Pendel in jedem Fall bei t = T4 und t = 3T 4 seinen tiefsten Punkt. Daher können wir das Problem folgendermassen formulieren: Bestimmen Sie ϕ0 > 0, so dass für die Lösung t 7→ ϕ(t) ϕ(0.45) = 0 gilt. Bitte wenden! a) Schreiben Sie die Differentialgleichung 2. Ordnung als eine System von Differentialgleichungen 1. Ordnung. Solution: 1 Punkt. Wir definieren y1 := ϕ und y2 := ϕ̇ ≡ y˙1 , und erhalten das AWP: ( ẏ1 = y2 y1 (0) = ϕ0 , g y2 (0) = 0 . ẏ2 = − l sin (y1 ) (3) b) Schreiben Sie eine Python Funktion IntegratePendulum(phi0, tEnd, l, g, flag) die den Integrator ode45 benutzt, um die Pendelgleichung mit den Parametern l und g zu lösen. Für flag=True soll nur die numerische Approximation von φ(tEnd) anstatt der gesamten numerischen Lösung zurückgegeben werden. Solution: 1 Punkt. (Implementation der right-hand-side.) c) Lösen Sie das Anfangswertproblem auf [0, tEnd] für die beiden gegebenen Anfangswerte ϕ0 = 0.8 π2 und ϕ0 = 0.99 π2 . Plotten Sie in beiden Fällen den zeitlichen Verlauf von ϕ und ϕ̇. Verifizieren Sie, dass die Periode der Lösung für den ersten Startwert kleiner und für den zweiten Startwert grösser als T = 1.8 s ist. Solution: 2 Punkte. (Korrekter Aufruf der Funktion aus der letzten Teilaufgabe.) d) Die Funktion F sei nun mithilfe der Lösung ϕ(t) definiert als F (ϕ0 ) := ϕ(0.45) . Verwenden Sie die Python Funktion fsolve aus dem Modul scipy.optimize um die Nullstelle von F (ϕ0 ) zu bestimmmen1 . Plotten Sie die Lösung und verifizieren Sie, dass die numerische Lösung tatsächlich die Periode T = 1.8 s hat. Solution: 2 Punkte. (Korrekter Aufruf von fsolve mit extra Argumenten.) e) Anstelle einer numerischen Approximation der Lösung ϕ(t) der Differentialgleichung kann auch die Formel (2) in der Definition der Funktion F verwendet werden F (ϕ0 ) := 1 T (ϕ0 ) − 0.45 . 4 Bestimmen Sie wiederum die Nullstelle von F . Das elliptische Integral K(k) soll mittels einer zusammengesetzten Simpson Quadraturregel auf 10 Intervallen approximiert werden. Solution: 3 Punkte. (1 Implementation der Quadratur, 1 Berechnung des elliptischen Integrals, 1 Aufruf von fsolve mit Lambda.) f ) Eine wesentlich effizientere Methode zur Berechnung der Funktion K(k) verwendet das arithmetisch-geometrische Mittel agm(x, y) zweier Zahlen. Es berechnet sich iterativ wie folgt: x0 := x, y0 := y und xn + yn 2 √ := xn yn . xn+1 := yn+1 1 F ist stetig und steigend auf [0.8π/2, 0.99π/2] (grössere Anfangswerte sind längere Perioden) daher hat F auf diesem Intervall eine eindeutige Nullstelle. Siehe nächstes Blatt! Im Limit n → ∞ gilt xn = yn = agm(x, y). Das elliptische Integral lässt sich nun schreiben als Z π2 1 π 1 p . dξ = K(k) = 2 2 2 agm(1 − k, 1 + k) 0 1 − k sin ξ Verwenden Sie diese Iteration zur Approximation von T (ϕ0 ) und bestimmen Sie die Nullstelle von F . Aufgrund der guten Konvergenz sind nur sehr wenige Iterationen notwendig. Für diese Berechnung hier reichen 5, da stets 0 < k < 1. Solution: 3 Punkte. (1 Implementation der AGM Iteration, 1 Berechnung des elliptischen Integrals, 1 Aufruf von fsolve mit Lambda.) Hinweis: Verwenden Sie das Template 2 pendulum Template.py und ode45.py. Solution: Listing 4: 2 pendulum.py 1 3 from numpy import array , sin , pi , shape , sqrt , linspace import matplotlib . pyplot a s plt from ode45 import ode45 import scipy . optimize 5 7 9 d e f PendulumODE (y, l, g): """ PendulumODE return the right - hand side of the math . pendulum """ dydt = array ([ y[1] , -g * sin (y [0]) / l]) r e t u r n dydt 11 13 d e f IntegratePendulum (phi0 , tEnd =1.8 , l =0.6 , g =9.81 , flag = F a l s e ): """ IntegratePendulum solve the mathematical pendulum with ode45 15 17 19 21 23 25 27 29 Input : phi0 tEnd flag ... initial condition ... end time ... flag == False return complete solution : (phi , phi ’, t) flag == True return solution at endtime only : phi ( tEnd ) """ i f shape ( phi0 ) == (1 ,) : phi0 = phi0 [0] y0 = array ([ phi0 , 0]) tspan = (0 , tEnd ) t, y = ode45 (lambda t, y: PendulumODE (y, l, g) , tspan , y0 ) i f flag : r e t u r n y [ -1][0] else: r e t u r n (y, t) 31 33 d e f simpson (f, a, b, N): r """ Simpson quadrature of function f from a to b with N subintervals . 35 37 39 41 f: Function f(x) a, b: Bounds of the integration interval N: Number of subintervals """ x, h = linspace (a, b , 2*N+1 , retstep =True) I = h /3.0 * sum(f(x [: -2:2]) + 4.0* f(x [1: -1:2]) + f(x [2::2]) ) return I 43 Bitte wenden! 45 47 49 51 53 d e f elliptic_k_quad (k, N =10) : """ Compute the elliptic integral K(k) via composite Simpson qudrature . Input : k ... function argument N ... number of intervals for Simpson Output : K(k) ... function value """ f = lambda x: 1.0 / sqrt (1.0 - k **2 * sin (x) **2) r e t u r n simpson (f, 0, 0.5* pi , N) 55 57 d e f agm (x , y, nit =5) : """ Computes the arithmetic - geometric mean of two numbers x and y. 59 61 63 65 67 69 71 Input : x , y ... two numbers nit ... number of iteration Output : agm (x,y) """ xn = x yn = y f o r i i n xrange ( nit ): xnp1 = 0.5 * (xn + yn) ynp1 = sqrt (xn *yn) xn = xnp1 yn = ynp1 r e t u r n xn 73 75 d e f elliptic_k_agm (k , nit =5) : """ Compute the elliptic integral K(k) via arithmetic - geometric mean iteration . 77 Input : k 79 81 ... function argument nit ... number of iteration Output : K(k) ... function value """ r e t u r n 0.5* pi / agm (1.0 -k, 1.0+k, nit = nit ) 83 85 i f __name__ == ’ __main__ ’: from time import time 87 89 91 # Parameter values tEnd = 1.8 l = 0.6 g = 9.81 93 # Unteraufgabe c) 95 97 99 # Solve ODE for extreme values to check the period length : a1 = 0.8 y1 , t1 = IntegratePendulum (a1 * pi * 0.5 , tEnd , l, g, F a l s e ) a2 = 0.99 y2 , t2 = IntegratePendulum (a2 * pi * 0.5 , tEnd , l, g, F a l s e ) 101 103 105 plt . figure () ax1 = plt . subplot (211) plt . plot (t1 , y1. transpose () [0] , ’b’, label =r’$f \, | \, f_0 = %1.2 f \, \ frac & · · · {\ pi }{2} $’ % a1) plt . plot (t1 , y1. transpose () [1] , ’b--’, label =r’$\ frac {df }{ dt} \, | \, f_0 = & · · · %1.2 f \, \ frac {\ pi }{2} $’ % a1 ) plt . plot (t2 , y2. transpose () [0] , ’r’, label =r’$f \, | \, f_0 = %1.2 f \, \ frac & Siehe nächstes Blatt! 107 109 111 · · · {\ pi }{2} $ ’ % a2) plt . plot (t2 , y2. transpose () [1] , ’r--’, label =r’$\ frac {df }{ dt} \, | \, f_0 = · · · %1.2 f \, \ frac {\ pi }{2} $’ % a2 ) plt . title ( ’ Solutions to the pendulum ODE for different initial amplitudes ’) plt . xlabel (r’$t$ ’) plt . legend ( loc =’upper left ’) plt . grid (True) & 113 # Unteraufgabe d) 115 117 119 121 123 125 127 129 131 133 135 137 # zero finding : p r i n t (" Initial value via time - integration ") starttime = time () phiT = scipy . optimize . fsolve ( IntegratePendulum , a1* pi *0.5 , args =( tEnd *0.25 , l & · · · , g, True)) p r i n t ( phiT ) endtime = time () p r i n t (’ needed %f seconds ’ % ( endtime - starttime )) # compute complete solution with period = tEnd for plotting y3 , t3 = IntegratePendulum (phiT , tEnd , l, g, F a l s e ) y3 = y3. transpose () ax1 = plt . subplot (212) plt . plot (t3 , y3 [0] , ’-’, label =r ’$f$ ’) plt . plot (t3 , y3 [1] , ’b-- ’, label =r’$\ frac {df }{ dt}$’) plt . title (r’ Solution to the pendulum ODE for $f_0 = %1.3 f $’ % phiT ) plt . xlabel (r’$t$ ’) plt . legend ( loc =’upper left ’) plt . grid (True) plt . savefig (’ Pendulum . pdf ’) plt . show () 139 # Unteraufgabe e) 141 143 145 p r i n t (" Initial value via exakt formula for T") p r i n t (" Elliptic Integral by Quadrature ") d e f quarter_period_quad ( phi ): r e t u r n sqrt (l /(1.0* g)) * elliptic_k_quad ( sin ( phi /2.0) ) 147 149 151 starttime = time () phiT = scipy . optimize . fsolve (lambda tau : quarter_period_quad ( tau ) - 0.45 , pi & · · · *0.5) p r i n t ( phiT ) endtime = time () p r i n t (’ needed %f seconds ’ % ( endtime - starttime )) 153 155 # Unteraufgabe f) 157 p r i n t (" Initial value via exakt formula for T") p r i n t (" Elliptic Integral by Arithmetic - Geometric Mean ") 159 161 163 165 d e f quarter_period_agm ( phi ): r e t u r n sqrt (l /(1.0* g)) * elliptic_k_agm ( sin ( phi /2.0) ) starttime = time () phiT = scipy . optimize . fsolve (lambda tau : quarter_period_agm ( tau ) - 0.45 , pi & · · · *0.5) p r i n t ( phiT ) endtime = time () Bitte wenden! 167 p r i n t (’ needed %f seconds ’ % ( endtime - starttime )) Abbildung 3: Die Lösung des AWP für ϕ0 = 0.8π/2, ϕ0 = 0.99π/2 und für den Startwert ϕ0 der die Periode T = 1.8 Sekunden liefert. 6 Solutions to the pendulum ODE for different initial amplitudes f | f0 =0.80 π2 4 df π 2 dt | f0 =0.80 2 f | f0 =0.99 π2 0 df π 2 dt | f0 =0.99 2 4 6 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 Solution to the pendulum ODE for f =1 . 486 t 0 6 4 2 0 2 4 6 0.0 f df dt 0.2 0.4 0.6 0.8 t 1.0 1.2 1.4 Listing 5: Ausgabe des Skripts 4 1 3 5 7 9 11 Initial value via time - integration [ 1.48551281] needed 0.011535 seconds Initial value via exakt formula f o r T Elliptic Integral by Quadrature [ 1.48551244] needed 0.001089 seconds Initial value via exakt formula f o r T Elliptic Integral by Arithmetic - Geometric Mean [ 1.48551244] needed 0.000607 seconds 1.6 1.8