Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.07 KB | None | 0 0
  1. ##Exercice 1
  2.  
  3. ##1)
  4. #a)
  5.  
  6. # On a la relation : y_k+1 = y_k + h*F(y_k,t), avec h le pas (h = (b-a)/n)
  7.  
  8. #b)
  9.  
  10. def euler(F,a,b,y0,n):          #F une fonction, a,b,y0 des réels, n entier
  11.     y,t,h = y0,a,(b-a)/n       #On initialise les ordonnées et les abcisses, et on calcule le pas
  12.     liste_y = [y0]             #On initialise la liste des ordonnées
  13.     liste_t = [a]              #On initialise la liste des abcisses
  14.     while t<b:                 #On complète la liste des t et y jusqu'à t =b
  15.         y = y+h*F(y,t)          #On crée le yk+1 d'après la définition
  16.         liste_y.append(y)       #On l'ajoute à la liste des y
  17.         t += h                  #On fait de même pour les t
  18.         liste_t.append(t)
  19.     return(liste_t,liste_y)
  20.  
  21. #c)
  22.  
  23. # On étudie l'équation y' = y avec y(0) = 1 : on veut donc trouver y(x) = exp(x)
  24.  
  25. #d)
  26.  
  27. # La fonction effectue n tours de boucle, dans lesquelles on effectue un produit et deux sommes
  28. # On a donc une complexité d'environ 3n linéaire en n, ou en O(n)
  29.  
  30. #e)
  31.  
  32. # On dit que la méthode est d'ordre 1 car une multiplication du nombre de tours de boucles par 10
  33. # entraîne une division par 10 de l'erreur associée à la méthode
  34.  
  35. ##2)
  36.  
  37. #a)
  38.  
  39. def dicho(f,a,b,eps):       #f une fonction, a,b,eps des réels
  40.     p,g,r = a,b,(a+b)/2     #On initialise les valeurs hautes, basses et au milieu
  41.     while abs(f(r)) > eps:  #La fonction s'arrête quand on atteint 0 à eps près
  42.         if f(r)*f(p) < 0:   #Si la racine est entre la valeur basse et le milieu:
  43.             g = r           #On modifie la valeur haute
  44.         else: p = r         #Sinon, on modifie la valeur basse
  45.         r = (p+g)/2         #On met à jour la valeur du milieu
  46.     return r
  47.  
  48. #b)
  49.  
  50. #On a la relation u_k+1 = u_k - f(u_k)/f'(u_k)
  51.  
  52. #c)
  53.  
  54. def derive(f,a):    #f une fonction, a réel
  55.     eps = 1e-9      #On impose une précision de 10^-9
  56.     return (f(a+eps)-f(a))/eps  #On renvoie la valeur approximative de f'(a)
  57.  
  58. #d)
  59.  
  60. def newton(f,a):        #f une fonction, a réel
  61.     u = a               #On pose u_0 = a
  62.     for i in range(10): #On itère 10 fois
  63.         u = u - f(u)/derive(f,u)    #On applique la relation de récurrence
  64.     return u            #On renvoie la dernière valeur de u
  65.  
  66. #e)
  67.  
  68. # h(y_n+1) vérifie l'équation (E)
  69.  
  70. #f)    
  71.    
  72. def euler_implicite(F,a,b,y0,n): #F une fonction, a,b,y0,n des réels
  73.     y,t,h = y0,a,(b-a)/n         #On initialise les y,t et on calcule le pas
  74.     liste_t,liste_y = [a],[y0]   #On initialise les listes des t et y
  75.     while t<b:
  76.         t += h
  77.         liste_t.append(t)
  78.         y = newton(lambda x:x-y-h*F(x,t),y) #On résoud l'équation (E) avec newton
  79.         liste_y.append(y)           #On ajoute le y ainsi calculé
  80.     return liste_t,liste_y
  81.  
  82. ##3
  83.  
  84. #a) Au lieu d'utiliser une fonction F à valeurs réelles, on utilise une fonction
  85. # à valeurs vectorielles : les valeurs y_k sont donc des vecteurs
  86.  
  87. #b)
  88.  
  89. from math import sin
  90. import numpy as np
  91.  
  92. def F(y,t):     #y un vecteur, t un réel
  93.     return np.array((y[1],t*y[0]+sin(y[1])))
  94.  
  95. euler(F,1,3,np.array((1,0)),100)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement