Skip to content

Instantly share code, notes, and snippets.

@jmg
Created April 22, 2016 02:48
Show Gist options
  • Save jmg/4fc1e485df37213a443d67a8903a4a23 to your computer and use it in GitHub Desktop.
Save jmg/4fc1e485df37213a443d67a8903a4a23 to your computer and use it in GitHub Desktop.
#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