# -*- coding: utf-8 -*-
"""
Created on Wed Mar 18 15:32:35 2015

@author: Roupoil
"""

import matplotlib.pyplot as plt

def pendule(y0,z0,t0,tf,n):
    y,z,t=y0,z0,t0
    temps,ordonnee,derivee=[t0],[y0],[z0]
    h=(tf-t0)/float(n)
    for i in range(n):
        y=y+h*z
        z=z-h*sin(y)
        t=t+h
        temps.append(t)
        ordonnee.append(y)
        derivee.append(z)
    plt.plot(temps,ordonnee)
    return ordonnee

pendule(0,1.5,0,20,10)
pendule(0,1.5,0,20,100)
pendule(0,1.5,0,20,1000)

def pendulephase(y0,z0,t0,tf,n):
    y,z,t=y0,z0,t0
    temps,ordonnee,derivee=[t0],[y0],[z0]
    h=(tf-t0)/float(n)
    for i in range(n):
        y=y+h*z
        z=z-h*sin(y)
        t=t+h
        temps.append(t)
        ordonnee.append(y)
        derivee.append(z)
    plt.plot(ordonnee,derivee)
    return ordonnee

pendulephase(0,1.5,0,20,10)
pendulephase(0,1.5,0,20,30) 
pendulephase(0,1.5,0,20,1000)  

def penduleheun(y0,z0,t0,tf,n):
    y,z,t=y0,z0,t0
    temps,ordonnee,derivee=[t0],[y0],[z0]
    h=(tf-t0)/float(n)
    for i in range(n):
        ay=y+h*z
        az=z-h*sin(y)
        y=y+h/2*(z+az)
        z=z-h/2*(sin(y)+sin(ay))
        t=t+h
        temps.append(t)
        ordonnee.append(y)
        derivee.append(z)
    plt.plot(temps,ordonnee)
    return ordonnee
    
penduleheun(0,1.5,0,20,1000)

def pendulerk(y0,z0,t0,tf,n):
    y,z,t=y0,z0,t0
    temps,ordonnee,derivee=[t0],[y0],[z0]
    h=(tf-t0)/float(n)
    for i in range(n):
        ay=y+h/2*z
        az=z-h/2*sin(y)
        by=y+h/2*az
        bz=z-h/2*sin(ay)
        cy=y+h*bz
        cz=z-h*sin(by)
        y=y+h/6*(z+2*az+2*bz+cz)
        z=z-h/6*(sin(y)+2*sin(ay)+2*sin(by)+sin(cy))
        t=t+h
        temps.append(t)
        ordonnee.append(y)
        derivee.append(z)
    plt.plot(temps,ordonnee)
    return ordonnee

pendulerk(0,1.5,0,20,1000)

pendule(0,2,0,20,1000)
penduleheun(0,2,0,20,1000)
pendulerk(0,2,0,20,1000)
