Created
April 22, 2016 02:48
-
-
Save jmg/4fc1e485df37213a443d67a8903a4a23 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#aca van los coeficientes de la cuadratica | |
a = 2 | |
b = 0 | |
c = -3 | |
#aca van las cotas del intervalo | |
ax = -3 | |
bx = 3 | |
delta = 1 | |
#estes es el error de la raiz en el cual cortar | |
error = 0.0001 | |
def evaluar_resultado(valor, a, b, c): | |
return a * valor ** 2 + valor * b + c | |
def evaluar_signo(valor, a, b, c): | |
resultado = evaluar_resultado(valor, a, b, c) | |
if resultado > 0: | |
return "+" | |
else: | |
return "-" | |
#busco por intervalos delta | |
ax_i = ax | |
bx_i = ax_i + delta | |
while bx_i < bx: | |
#inicializo fp (valor de la raiz) en un numero mayor a 0 para que entre en el while la primera vez | |
fp = 99999 | |
hay_raices = True | |
#para no pisar los valores de ax_i y bx_i me los guardo en otras variables que se van a pisar durante el ciclo while | |
ax_local = ax_i | |
bx_local = bx_i | |
while abs(fp) > error: | |
p = (ax_local + bx_local) / 2.0 | |
#evaluo el signo de la funcion en ax (cota minima del intervalo) | |
signo_ax = evaluar_signo(ax_local, a, b, c) | |
#evaluo el signo de la funcion en bx (cota maxima del intervalo) | |
signo_bx = evaluar_signo(bx_local, a, b, c) | |
#evaluo el signo de la funcion en p (la mitad del intervalo) | |
signo_p = evaluar_signo(p, a, b, c) | |
#si el signo de ax (cota minima del intervalo) es distinto de p entonces la raiz esta en el semi-intervalo (ax-p) | |
if signo_ax != signo_p: | |
#asigno bx = p para la proxima iteracion (me quedo con el semi-intervalo donde esta la raiz) | |
bx_local = p | |
elif signo_bx != signo_p: | |
#asigno ax = p para la proxima iteracion (me quedo con el semi-intervalo donde esta la raiz) | |
ax_local = p | |
else: | |
#todos tienen el mismo signo, entonces no hay raices en este intervalo, salgo del while: | |
hay_raices = False | |
break | |
#evaluo la funcion en el punto donde creo que esta la raiz, si me da muy cerca de 0 (en module menor al error predefinido) corto el while | |
fp = evaluar_resultado(p, a, b, c) | |
if hay_raices: | |
#si encontre raices en este intervalo delta las muestro | |
print "Raiz aproximada = %s" % p | |
print "Valor en Raiz aproximada = %s" % fp | |
#incremento el intervalo en delta y sigo buscando | |
ax_i += delta | |
bx_i += delta |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment