# newton raphson vesion2
#
# calcula las raices de una funcion por el metodo de Newton Raphson
# para ello es necesarioescribir en tiempo de programacion
# la funcion f en tanto que la derivada en el punto se calcula numericamente
# luego en tiempo de ejecucion el programa pide un valor aproximado de la raiz esperada
# y el valor del error admisible entre dos iteraciones sucesivas, pide ademas
# el valor del delta h para el calculo d ela derivada
# 


# definicion d ela funcion
def f(x,a,b,c):
    f=a*x**2+b*x+c
    return f

# coeficientes de la funcion
    
a=3.0
b=10.0
c=-40.0
x=0.0

x=float(input("Ingrese un valor de raiz aproximado:"))
limite=x/100
limite=float(input("Ingrese el valor de error admitido entre corridas sucesivas:"))
h=float(input("Delta (para el calculo de la derivada numerica):"))
print ()

#impresion de la solucion exacta  
print ("Solucion exacta R1",(-b+(b**2-4*a*c)**.5)/(2*a),"R2",(-b-(b**2-4*a*c)**.5)/(2*a))  
iteracion=0
error_x=1.0

while abs(error_x)>abs(limite):
    iteracion=iteracion+1
    deri=(f(x+h,a,b,c)-f(x-h,a,b,c))/(2*h)
    #x_=x-f(x,a,b,c)/f1(x,a,b,c)
    x_=x-f(x,a,b,c)/deri
    print ("Iteracion:",iteracion,"Valor:",x_)
    error_x=x_-x
    x=x_

# verificacion
# verifico el valor de la funcion en el punto, si es cercano a cero esta bien

print ("Verificacion del resultado, valor d ela funcion en la raiza hallada:",f(x_,a,b,c))    
    

