def g(x):
    resultado = - 0.1*x**4 - 0.15*x**3 - 0.5*x**2 - 0.25*x + 1.2
    return resultado

def fx_adelante(f,x,h):
    derivada = (f(x+h) - f(x))/h
    return derivada

print('f\'(0.5) =', fx_adelante(g,0.5,0.25))

"""
Explanation: Serie de Taylor
\begin{equation}
    f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x - a)^{n}
\end{equation}
Expansión hacia adelante
\begin{equation}
    f(x) \approx f(a) + f'(a) (x - a) + \frac{1}{2} f''(a) (x - a)^{2} + \frac{1}{6} f'''(a) (x - a)^{3} + \cdots
\end{equation}
Usando un cambio de variable $x - a = h$
\begin{equation}
    f(x) \approx f(a) + f'(a) h + \frac{1}{2} f''(a) h^{2} + \frac{1}{6} f'''(a) h^{3} + \cdots
\end{equation}
Reemplazando $a = x - h$
\begin{equation}
    f(x) \approx f(x - h) + f'(x - h) h + \frac{1}{2} f''(x - h) h^{2} + \frac{1}{6} f'''(x - h) h^{3} + \cdots
\end{equation}
Usando un cambio de variable $x = x_{i}$
\begin{equation}
    f(x_{i}) \approx f(x_{i} - h) + f'(x_{i} - h) h + \frac{1}{2} f''(x_{i} - h) h^{2} + \frac{1}{6} f'''(x_{i} - h) h^{3} + \cdots
\end{equation}
Reemplazando $x_{i} - h = x_{i-1}$
\begin{equation}
    f(x_{i}) \approx f(x_{i-1}) + f'(x_{i-1}) h + \frac{1}{2} f''(x_{i-1}) h^{2} + \frac{1}{6} f'''(x_{i-1}) h^{3} + \cdots
\end{equation}
Recorriendo los índices
\begin{equation}
    f(x_{i+1}) \approx f(x_{i}) + f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} + \frac{1}{6} f'''(x_{i}) h^{3} + \cdots
\end{equation}
Expansión hacia atrás
La expansión hacia adelante puede escribirse como 
\begin{equation}
    f(x_{i} + h) \approx f(x_{i}) (h)^{0} + f'(x_{i}) (h)^{1} + \frac{1}{2} f''(x_{i}) (h)^{2} + \frac{1}{6} f'''(x_{i}) (h)^{3} + \cdots
\end{equation}
Entonces la expansión hacia atrás será
\begin{equation}
    f(x_{i} - h) \approx f(x_{i}) (-h)^{0} + f'(x_{i}) (-h)^{1} + \frac{1}{2} f''(x_{i}) (-h)^{2} + \frac{1}{6} f'''(x_{i}) (-h)^{3} + \cdots
\end{equation}
Simplificando
\begin{equation}
    f(x_{i-1}) \approx f(x_{i}) - f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} - \frac{1}{6} f'''(x_{i}) h^{3} + \cdots
\end{equation}
Primera diferencia hacia adelante
Usando dos términos de la serie de Taylor expandida hacia adelante
\begin{equation}
    f(x_{i+1}) \approx f(x_{i}) + f'(x_{i}) h
\end{equation}
Despejando la primera derivada
\begin{equation}
    f'(x_{i}) = \frac{f(x_{i+1}) - f(x_{i})}{h}
\end{equation}
End of explanation
"""


def fx_atras(f,x,h):
    derivada = (f(x) - f(x-h))/h
    return derivada

print('f\'(0.5) =', fx_atras(g,0.5,0.25))

"""
Explanation: Primera diferencia hacia atrás
Usando dos términos de la serie de Taylor expandida hacia atrás
\begin{equation}
    f(x_{i-1}) \approx f(x_{i}) - f'(x_{i}) h
\end{equation}
Despejando la primera derivada
\begin{equation}
    f'(x_{i}) = \frac{f(x_{i}) - f(x_{i-1})}{h}
\end{equation}
End of explanation
"""


def fx_centrada(f,x,h):
    derivada = (fx_adelante(f,x,h) + fx_atras(f,x,h))/2
    return derivada

print('f\'(0.5) =', fx_centrada(g,0.5,0.25))

"""
Explanation: Primera diferencia centrada
Usando tres términos de la serie de Taylor expandida hacia adelante
\begin{equation}
    f(x_{i+1}) \approx f(x_{i}) + f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} \label{ecuacion6}
\end{equation}
Usando tres términos de la serie de Taylor expandida hacia atrás
\begin{equation}
    f(x_{i-1}) \approx f(x_{i}) - f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} \label{ecuacion7}
\end{equation}
Restando \eqref{ecuacion7} de \eqref{ecuacion6}
\begin{equation}
    f(x_{i+1}) - f(x_{i-1}) \approx 2 f'(x_{i}) h
\end{equation}
Despejando la primera derivada
\begin{equation}
    f'(x_{i}) = \frac{f(x_{i+1}) - f(x_{i-1})}{2 h}
\end{equation}
También puede escribirse como el promedio de una diferencia hacia adelante y una diferencia hacia atrás
\begin{equation}
    f'(x_{i}) = \frac{\frac{f(x_{i+1}) - f(x_{i})}{h} + \frac{f(x_{i}) - f(x_{i-1})}{h}}{2}
\end{equation}
End of explanation
"""


def fxx_adelante(f,x,h):
    derivada = (f(x+2*h) - 2*f(x+h) + f(x))/h**2
    return derivada

print('f\'\'(0.5) =', fxx_adelante(g,0.5,0.25))

"""
Explanation: Segunda diferencia hacia adelante
Usando tres términos de la serie de Taylor expandida hacia adelante una posición
\begin{equation}
    f(x_{i+1}) \approx f(x_{i}) + f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2}
\end{equation}
Multiplicando por dos
\begin{equation}
    2 f(x_{i+1}) \approx 2 f(x_{i}) + 2 f'(x_{i}) h + f''(x_{i}) h^{2} \label{ecuacion9}
\end{equation}
Usando tres términos de la serie de Taylor expandida hacia adelante dos posiciones
\begin{equation}
    f(x_{i+2}) \approx f(x_{i}) + 2 f'(x_{i}) h + 2 f''(x_{i}) h^{2} \label{ecuacion10}
\end{equation}
Restando \eqref{ecuacion10} de \eqref{ecuacion9}
\begin{equation}
    2 f(x_{i+1}) - f(x_{i+2}) \approx f(x_{i}) - f''(x_{i}) h^{2}
\end{equation}
Despejando la segunda derivada
\begin{equation}
    f''(x_{i}) = \frac{f(x_{i+2}) - 2 f(x_{i+1}) + f(x_{i})}{h^{2}}
\end{equation}
End of explanation
"""


def fxx_atras(f,x,h):
    derivada = (f(x) - 2*f(x-h) + f(x-2*h))/h**2
    return derivada

print('f\'\'(0.5) =', fxx_atras(g,0.5,0.25))

"""
Explanation: Segunda diferencia hacia atrás
Usando tres términos de la serie de Taylor expandida hacia atrás una posición
\begin{equation}
    f(x_{i-1}) \approx f(x_{i}) - f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2}
\end{equation}
Multiplicando por dos
\begin{equation}
    2 f(x_{i-1}) \approx 2 f(x_{i}) - 2 f'(x_{i}) h + f''(x_{i}) h^{2} \label{ecuacion12}
\end{equation}
Usando tres términos de la serie de Taylor expandida hacia atrás dos posiciones
\begin{equation}
    f(x_{i-2}) \approx f(x_{i}) - 2 f'(x_{i}) h + 2 f''(x_{i}) h^{2} \label{ecuacion13}
\end{equation}
Restando \eqref{ecuacion13} de \eqref{ecuacion12}
\begin{equation}
    2 f(x_{i-1}) - f(x_{i-2}) \approx f(x_{i}) - f''(x_{i}) h^{2}
\end{equation}
Despejando la segunda derivada
\begin{equation}
    f''(x_{i}) = \frac{f(x_{i}) - 2 f(x_{i-1}) + f(x_{i-2})}{h^{2}}
\end{equation}
End of explanation
"""


def fxx_centrada(f,x,h):
    derivada = (fxx_adelante(f,x,h) - fxx_atras(f,x,h))/h
    return derivada

print('f\'\'(0.5) =', fxx_centrada(g,0.5,0.25))

"""
Explanation: Segunda diferencia centrada
Usando tres términos de la serie de Taylor expandida hacia adelante
\begin{equation}
    f(x_{i+1}) \approx f(x_{i}) + f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} \label{ecuacion15}
\end{equation}
Usando tres términos de la serie de Taylor expandida hacia atrás
\begin{equation}
    f(x_{i-1}) \approx f(x_{i}) - f'(x_{i}) h + \frac{1}{2} f''(x_{i}) h^{2} \label{ecuacion16}
\end{equation}
Sumando \eqref{ecuacion16} a \eqref{ecuacion15}
\begin{equation}
    f(x_{i+1}) + f(x_{i-1}) \approx 2 f(x_{i}) + f''(x_{i}) h^{2}
\end{equation}
Despejando la segunda derivada
\begin{equation}
    f''(x_{i}) = \frac{f(x_{i+1}) - 2 f(x_{i}) + f(x_{i-1})}{h^{2}}
\end{equation}
También puede escribirse como la diferencia de una diferencia hacia adelante y una diferencia hacia atrás
\begin{equation}
    f''(x_{i}) = \frac{\frac{f(x_{i+1}) - f(x_{i})}{h} - \frac{f(x_{i}) - f(x_{i-1})}{h}}{h}
\end{equation}
End of explanation
"""


