def compeq1(): """ Comparaison graphe convergence de y' = 1-y avec y(0) = 5 pour t dans [0,1] avec méthode d'Euler explicite et RK2""" equations.a = -1. equations.b = 1. t0, y0 = 0., 5. T = 1. h = 0.2 #Définition de la boucle for for i in range(0, 6, 1): N = int(T / h) #Nombre d'itérations [t, y1] = methodes.euler_explicite(t0, h, N, y0, equations.f_affine) [t, y2] = methodes.RK2(t0, h, N, y0, equations.f_affine) # Solution exacte aux mêmes instants z1 = equations.sol_affine(t, y0) # Calcul de l'erreur maximum relative e1 = np.max(np.abs((z1 - y1) / z1)) e2 = np.max(np.abs((z1 - y2) / z1)) plt.plot(h, e1, 'b-+') plt.plot(h, e2, 'r-+') h = h / 2 plt.xscale('log') plt.yscale('log') plt.xlabel('h') plt.ylabel('e1,e2') plt.title("Erreur en fonction du pas h") plt.legend() plt.show()
def RK2_1() : """Résolution approchée de y' = 1-y avec y(0) = 5 pour t dans [0,1] avec la méthode de RK2""" equations.a = -1. equations.b = 1. t0,y0 = 0.,5. T = 1. h = 0.2 print("Valeur de l'erreur en fonction de h") #Définition de la boucle for for i in range(0,6,1) : N = int(T/h) #Nombre d'itérations [t,y1] = methodes.RK2(t0,h,N,y0,equations.f_affine) # Solution exacte aux mêmes instants z1 = equations.sol_affine(t,y0) # Calcul de l'erreur maximum relative e1 = np.max(np.abs((z1-y1)/z1)) #Graphe des solutions exactes et approchées plt.figure(1) plt.plot(t,y1,'b-+') plt.plot(t,z1,'r') plt.xlabel('t') plt.ylabel('y') plt.title("Méthode de Runge Kutta 2") # Écriture de l'erreur en fonction de h print("{0} | {1}".format(h,e1)) plt.figure(2) plt.plot(h,e1,'b-+',label = 'Pour h = '+ str(h)) h = h/2 plt.xscale('log') plt.yscale('log') plt.xlabel('h') plt.ylabel('e1') plt.title("Erreur en fonction du pas h") plt.legend() plt.show()
#import matplotlib.pyplot as plt from pylab import * #permet d'eviter l'utilisation de plat devant les parametres graphiques import methodes import equations # Résolution approchée de y' = 2-y avec y(0) = 3 pour t dans [0,5] equations.a = -1. #on affecte a la valeur a dans equations la valeur de -1 en terme d'entier (presence du point apres le nombre) equations.b = 2. # on affecte a la veleur b de equations la valeur 2 t0,y0 = 0.,3. T = 5. # Avec un pas de 0.1, il faut donc 50 iterations N,h = 50,0.1 [t,y1] = methodes.euler_explicite(t0,h,N,y0,equations.f_affine) # Solution exacte aux mêmes instants z1 = equations.sol_affine(t,y0) # Calcul de l'erreur maximum relative e1 = np.max(np.abs((z1-y1)/z1)) # Graphe des solutions exactes et approchées plot(t,y1,'b-+',label='solution approchée h=0.1') plot(t,z1,'r-',label='solution exacte') xlabel('t') ylabel('y') title("Méthode d'Euler explicite") legend() savefig('eq_affine.png') show() print(len(y1)) print(len(z1)) # Écriture de l'erreur en fonction de h print("{0} | {1}".format(h,e1))
import equations #Resolution approchée de y'=1-y avec y(0)=5 dans [0,1] equations.a=-1. equations.b=1. t0=0. y0=5. T=1. h=[0.2,0.1,0.05,0.025,0.0125,0.00625] N=[5,10,20,40,80,160] erreur=zeros(6) #de taille 6 car l'on considere 6 h differents for i in range(1,6,1): # t tableau des subdivisions ( c'est un vecteur) # y vecteurs des solutions calculees au subdivisons t [t,ycal]=methodes.euler_explicite(t0,h[i],N[i],y0,equations.f_affine) yexact=equations.sol_affine(t,y0) erreur[i]=max(abs((ycal-yexact)/yexact)) #Ecriture de l erreur en fonction de h print("Valeur de h : "+str(h[i])+" et son erreur associe "+str(erreur[i])) plot(h,erreur) xscale('log') title("Erreur en fonction du pas h en echelle logarithmique") xlabel('erreur logarithmique') ylabel('pas de subdivision') grid("on") #plusieurs methodes pour mettre en echelle logarithmique #loglog() met les deux axes en echelles logarithmiques show()