Advertisement
Guest User

801_SteifeDGL.py

a guest
Apr 24th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.45 KB | None | 0 0
  1. """
  2. Steife Differentialgleichungen
  3. Beispiel 2 aus der Zusammenfassung:
  4. - Konvergenz fuer N = 999
  5. - Oszillation mit konstantem Betrag fuer N = 1000
  6. - Divergenz fuer N = 1001
  7. @author: Kevin Kazuki Huguenin-Dumittan
  8. """
  9.  
  10. #Probiere verschiedene Werte fuer N aus!
  11.  
  12. from numpy import *
  13. from matplotlib.pyplot import *
  14. from scipy.linalg import *
  15. from scipy.optimize import fsolve
  16.  
  17.  
  18. # Explizites Eulerverfahren
  19. def eE(f,t0,tEnd,y0,N):
  20.     dim = size(y0)
  21.     y = zeros((N+1,dim))
  22.     t, h= linspace(t0,tEnd,N+1, retstep=True)
  23.     y[0,:] = y0
  24.    
  25.     for i in range(N):
  26.         y[i+1,:] = y[i,:] + h*f(t[i],y[i,:])    
  27.     return t,y
  28.  
  29. # Implizites Eulerverfahren
  30. def iE(f,t0,tEnd,y0,N):
  31.     dim = size(y0)
  32.     y = zeros((N+1,dim))
  33.     t, h= linspace(t0,tEnd,N+1, retstep=True)
  34.     y[0,:] = y0
  35.    
  36.     for i in range(N):
  37.         F = lambda x: x - y[i,:] - h*f(t[i+1],x)
  38.         y[i+1,:] = fsolve(F,y[i,:] + h*f(t[i],y[i,:]))    
  39.     return t,y
  40.    
  41.  
  42. # Beispiel 2 aus der Zusammenfassung:
  43. # (Anderes gutes Beispiel: Gedaempftes Pendel aus den Runge-Kutta Programmen)
  44. f = lambda t,y: array([998*y[0] + 1998*y[1], -999*y[0]-1999*y[1]])
  45. u0 = 1
  46. v0 = 0
  47. y0 = array([u0,v0])
  48. t0 = 0.
  49. tEnd = 2.
  50.  
  51.  
  52. N = 999 # Divergenz, da (tEnd-t0)/N > 0.002
  53. N = 1000 # Oszillation, da (tEnd-t0)/N = 0.002
  54. N = 1001 # Konvergenz, da (tEnd-t0)/N < 0.002
  55.  
  56.  
  57. t_eE,y_eE = eE(f,t0,tEnd,y0,N)
  58. t_iE,y_iE = iE(f,t0,tEnd,y0,N)
  59.  
  60. #Plotten
  61. sol = lambda t:array([-exp(-1000*t)+2*exp(-t),exp(-1000*t)-exp(-t)])
  62. tsol = linspace(t0,tEnd,1000)
  63. y_exact = sol(tsol)
  64.  
  65. figure()
  66. plot(t_eE,y_eE[:,0],'r.-',lw=0.05, label='u(t) eE')
  67. plot(t_iE,y_iE[:,0],'b.-',label='u(t) iE')
  68. plot(tsol,y_exact[0],'k',label='u(t) Exact')
  69. #plot(t_eE,y_eE[:,1],'m.-',lw=0.05, label='v(t) eE')
  70. #plot(t_iE,y_iE[:,1],'c.-',label='v(t) iE')
  71. #plot(tsol,y_exact[1],'k--',label='v(t) Exact')
  72. legend(loc='lower right')
  73. title('Verhalten von steifen DGL')
  74. xlabel('Zeit t')
  75. ylabel('Position y(t)')
  76. xlim(0,1.5)
  77. ylim(-4,5)
  78. grid(True)
  79. show()
  80.  
  81.  
  82. # Plotten: Detaillierte Ansicht des letzten Teiles durch Einschraenkung
  83. # beider Achsen mit xlim und ylim, der Rest ist genau gleich
  84. figure()
  85. plot(t_eE,y_eE[:,0],'ro-',lw=0.25, label='u(t) eE')
  86. plot(t_iE,y_iE[:,0],'b.-',label='u(t) iE')
  87. plot(tsol,y_exact[0],'k',label='u(t) Exact')
  88. legend(loc='lower right')
  89. title('Verhalten von steifen DGL: Detaillierte Ansicht')
  90. xlabel('Zeit t')
  91. ylabel('Position y(t)')
  92. xlim(1.9,2)
  93. #ylim(-0.2,0.8)
  94. ylim(-1,1.7)
  95. grid(True)
  96. show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement