# -*- coding: utf-8 -*-
#Construction de l'exponentielle par la méthode d'Euler

#point de départ: f(0)=1 et f'(x)=f(x)

#calcul de exp(1)=e
def e(etape):
    x=0
    y=1
    pas=1/etape
    for i in range(etape):
       y=y+pas*y
       x=x+pas
    return y

#calcul d'une valeur choisie
def exp(a,etape):
    x=0
    y=1
    pas=a/etape
    for i in range(etape):
       y=y+pas*y
       x=x+pas
    return y

# la relation y=y+py se factorise en y=(1+p)y
# Ainsi on multiplie la valeur d'origine 1 pour (1+p) Ã  chaque étape ici n fois
# Soit au final, on a y=(1+p)^n= (1+a/n)^n

def exp2(a,n):
    return (1+a/n)**n

# Lorsque n augmente, l'approximation varie de moins en moins vite, on peut alors
# penser que la valeur devient de plus en plus précise.

def exp3(a,vitesse):
    # a pour la valeur à approximer et vitesse pour l'avancement
    n=2
    x=exp2(a,1)
    y=exp2(a,2)
    while abs(x-y)>vitesse:
        n=n+1
        x,y=y,exp(a,n)
    return n,y # n donne le nombre de répétition et y la dernière valeur obtenue

# courbe de la fonction exp par la méthode d'Euler sur [-1;1] en partant du point (0;1)
from matplotlib import pyplot as pl
from fractions import Fraction
def courbe_exp(n):
    y_pos=[1]
    y_neg=[1]
    x_pos=[0]
    x_neg=[0]
    # x_pos et y_pos pour les coordonnées des points d'abscisses positives
    # x_neg et y_neg pour les points d'abscisses négatives

    pas=Fraction(1,n)
    k=0
    for k in range(1,n+1):
        x_pos.append(x_pos[k-1]+pas)
        x_neg.append(x_neg[k-1]-pas)
        y_pos.append(y_pos[k-1]*(1+pas))
        y_neg.append(y_neg[k-1]*(1-pas))
    pl.xlim(-1,1.5)
    pl.ylim(0,3)
    pl.plot(x_pos,y_pos,'.')
    pl.plot(x_neg,y_neg,'.')
    pl.show()




