## Graphes

import numpy as np
import matplotlib.pyplot as plt

## Exo 0 : dessiner un A
plt.close("all") # fermeture de la figure en cours
x=np.arange(0,5,2)
y=[0,2,0]
plt.xlim(0,4)
plt.ylim(0,2)
plt.plot(x,y,'b',linewidth=5) # on force un peu le trait
t=[1,3]
z=[1,1]
plt.plot(t,z,'b',linewidth=5) # tout en bleu
plt.show()

## Exo 5 : Approximation polynômiale de l'exponentielle

plt.close("all") # fermeture de la figure en cours
plt.axis("scaled")
plt.xlim(-2,2)
plt.ylim(-1,3)
x=np.linspace(-2,2) # au voisinage de 0, les courbes sont très proches les unes des autres.
y=np.exp(x)
plt.plot(x,y,label="exp") # label permet de mettre une légende
y0=x**0
plt.plot(x,y0,label="$x^0$")
y1=1+x
plt.plot(x,y1,label="$1+x^1$")
y2=1+x+x**2/2
plt.plot(x,y2,label="$1+x^1+\dfrac{x^2}{2}$")
y3=1+x+x**2/2+x**3/6
plt.plot(x,y3,label="$1+x^1+\dfrac{x^2}{2}+\dfrac{x^3}{6}$")
plt.legend(loc=0) # on affiche les différents label à la "meilleure" place
plt.show()

## Exo 7 : Monômes

def monome(N,a,b):
    """ Cette fonction représente les fonctions $x\to x^k$ pour k=1,...,N entre a et b """
    plt.close("all") # fermeture de la fenêtre en cours
    plt.axis("equal")
    plt.xlim(a,b)
    plt.ylim(-b**N,b**N)
    plt.axes(fc=[0.72,0.7,0.95]) # couleur de fonds d'écran
    plt.grid(True) # quadrillage de la feuille
    x=np.linspace(a,b,100) # vecteur des abscisses
    for k in range(1,N+1):
        plt.plot(x,x**k,label='$x\mapsto x^{'+str(k)+'}$')
        # Préparation de la légende avec des commandes LaTeX
    plt.title('Monômes de '+'$x\mapsto x^{'+str(1)+'}$'+' à '+'$x\mapsto x^{'+str(N)+'}$')
    plt.legend(loc=0)
    plt.show()

## Exo 8 : suites récurrentes

def recurrente(f,u0,N,a,b):
    """ Cette fonction décrit les suites récurrentes du type u_(n+1)=f(u_n) avec le tracé de la courbe entre a et b, puis l'escalier ou l'escargot décrivant la suite (u_n) """
    plt.close("all") # fermeture de la fenêtre en cours
    x=np.linspace(a,b,100) # vecteur des abscisses
    plt.plot(x,f(x)) # Tracé de la courbe
    plt.plot([a,b],[a,b]) # Tracé de y=x
    plt.plot([0,0],[a,b],'k')  # Tracé de l'axe des ordonnées
    plt.plot([a,b],[0,0],'k')  # Tracé de l'axe des abscisses
    plt.xlim(a,b)
    plt.ylim(a,b)
    plt.grid(True)
    u=u0   # initialisation de la suite
    X=[u]  # initialisation de la liste des abscisses
    Y=[u]  # initialisation de la liste des ordonnées

    for k in range(N):
        v=f(u) # Calcul du terme suivant de la suite
        X. append(u)
        Y. append(v) # Le point suivant a pour coordonnées (u_k,u_(k+1))
        # On va maintenant reporter sur la première bissectrice
        X.append(v)
        Y.append(v)
        u=v  # u_k devient u_(k+1)

    plt.plot(X,Y,'-ro')  # Tracé
    plt.show()

def f(x):
    return 1/4*x**2+3/4

# tapez dans le shell recurrente(f,0,10,0.2,1.2)
# Vous pouvez essayer avec d'autres fonctions

## calcul

X1=np.linspace(-10,-0.01)
X2=np.linspace(1.01,10)
Y1=X1*np.log((X1-1)/X1)
Y2=X2*np.log((X2-1)/X2)
plt.close("all")
plt.grid(True)
plt.plot([0,0],[Y2[0],1],'k')  # Tracé de l'axe des ordonnées
plt.plot([-10,10],[0,0],'k')  # Tracé de l'axe des abscisses
plt.plot(X1,Y1,'r',X2,Y2,'m')
plt.show()