Ver Mensaje Individual
  #8 (permalink)  
Antiguo 25/07/2008, 06:25
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con array

Se me ocurre que una forma un poco más elegante de hacer el método de bisección es hacerlo recursivamente, en lugar de utilizar un bucle.

Ojo, no digo que sea mejor ni peor hacerlo de un modo o de otro. Sólo que a mi me parece un poco más elegante... y vaya, que me apetecía hacerlo xD Así que... he sacado el interprete de Python, le he dado una vueltecilla y he llegado a esto:
Código:
import math

def bisec(f,a,b,fa,fb,delta):
	c = (a+b)/2
	print 'c: ' + repr(c) + ' a: ' + repr(a) + ' b: ' + repr(b) + '\n'
	if (c==a) or (c==b) or math.fabs(a-b)<delta:
		return c,b-a
	fc = f(c)
	if fa*fc<0:
		return bisec(f,a,c,fa,fc,delta)
	else:
		return bisec(f,c,b,fc,fb,delta)

def resolver(f,a,b,delta):
	raiz,precision = bisec(f,a,b,f(a),f(b),delta)
	print 'Raíz encontrada en ' + repr(raiz) + ':\n f('+repr(raiz)+') = ' + repr(f(raiz)) + '\n(precision: '+repr(precision)+')'
Se podría usar con:
Código:
def f(x):
	return x*x*x-x-1

resolver(f,1.0,2.0,1.0e-6)
Por supuesto no he hecho nada de pedir la función al usuario ni nada de eso...