import math
import numpy as np
#import sympy as sp
#import matplotlib.pyplot as plt

# Euler's method for first order ODEs
def em(f,x0,y0,x,n):
    dom = x0
    h = (x-x0)/n
    res = y0
    for i in range(n):
        res = res + h*f(dom,res) 
        dom = dom+h
    return res

#Midpint method for first order ODEs
def mpm(f,x0,y0,x,n):
    dom = x0
    h = (x-x0)/n
    res = y0
    for i in range(n):
        k1= f(dom,res)
        k2= f(dom+h/2,res+h*k1/2)
        res = res + h*k2
        dom = dom+h
    return res

#Runge-Kutta method for first order ODEs
def rkm(f,x0,y0,x,n):
    dom = x0
    h = (x-x0)/n
    res = y0
    for i in range(n):
        k1= f(dom,res)
        k2= f(dom+h/2,res+h*k1/2)
        k3= f(dom+h/2,res+h*k2/2)
        k4= f(dom+h,res+h*k3)
        res = res + (k1+2*k2+2*k3+k4)*h/6
        dom = dom+h
    return res

#Shooting method
def sm(f,x0,y0,x,n):
    return 0
