Пример #1
0
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()
Пример #2
0
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()
Пример #3
0
#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))
Пример #4
0
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()