## TP sur le tracé de courbes

import matplotlib.pyplot as plt
import numpy as np


## Exercice: polygone régulier

n = 7
X = [ np.cos(2*k*pi/n) for k in range(0,n+1)]
Y=  [ np.sin(2*k*pi/n) for k in range(0,n+1)]

plt.plot(X,Y)

plt.legend(['cosinus'],loc='upper left')
plt.show()


## Exercice: création de subdivision

# Q1
n = 100
X = [k/n for k in range(101)]
Y = [x**2 for x in X]


plt.plot(X, Y)
plt.show()

# Q2 
X0 = np.linspace(0,1,5) # on crée 5 poteaux donc 4 intervalles
Y0 = X0**2 # l'opérateur puissance sur ce tableau numpy applique la fonction carrée à tous les éléments de X


## Exercice: fonctions puissances
plt.clf()
exposants = [ 0.5, 1 , 2, 3]

for a in exposants:
    X = np.linspace(0,2,100)
    Y = [x**a for x in X] # ou Y =X**a avec vectorisation
    plt.plot(X,Y, label = 'a=' + str(a))

plt.grid()
plt.legend(loc='upper left')
plt.show()




## Exercice: graphe d'une suite récurrente

n = 11 # nombre de points

# définition de la suite u définie par u_{n+1} = f(u_n)
u =-8.41
def f(t):
    return -0.5*t +63

# Création des listes de coordonnées des points
X = [k for k in range(n)]
Y = [0 for k in range(n)]
Y[0]= u

# Calcul des points de la suite
for k in range(1,n): # n-1 itérations
    u = f(u)
    Y[k] = u

plt.plot(X,Y)
plt.show()


## Diagramme de bifurcation de la fonction logistique u_{n+1} = f(u_n) avec f(x) = rx(1-x) et u_0 =0.5

"""On va faire varier r de 0 à 4, et pour chaque r, représenter pour n entre 100 et 500, les points de coordonnées (r,u_n)"""


plt.clf() # clear figure
R = np.linspace(0,4, 201)
for r in R:
    # calcul des points de la suite
    n = 200
    u = 0.5
    X = []
    Y = []
    for k in range(n):
        u = r*u*(1-u)
        if k >= 100:
            X.append(r)
            Y.append(u)
    plt.plot(X,Y, 'b.')


plt.xlabel("valeurs de r")
plt.ylabel("valeurs de la suite logistique")
plt.show()

# rq: pour r dans [0,1], la suite Cv vers 0, puis pour r dans [1,3] CV vers 1-1/r, puis deux valeurs d'adhérence...