Hola estoy haciendo un programa que me calcule raices con el método de la bisección, y quiero que me vaya guardando los valores de p y fp en un vector utilizando array de Numpy. El programa no me echa ningún error, pero en p no me guarda los valores que debería guardar.
he dividido el programa en tres ficheros:
Fichero evaluar.py
Código:
from math import *
lista_segura = ['math','acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
dicc_seguro = dict([ (k, locals().get(k, None)) for k in lista_segura ])
funcion = raw_input("Introduce la funcion\n")
Fichero Metodos.py (este es el fichero main del programa)
Código:
#!/usr/bin/python
# coding: latin-1
import os, sys
import Biseccion
a = float(input("Introduce el extremo inferior del intervalo\n"))
b = float(input("Introduce el extremo superior del intervalo\n"))
TOL = float(input("Introduce la tolerancia del metodo\n"))
N = int(input("Introduce el numero maximo de iteraciones a realizar\n"))
Biseccion.biseccion(a, b, TOL, N)
Biseccion.dibujar(a,b)
El fichero Biseccion.py
Código:
#!/usr/bin/python
import evaluar
from pylab import *
def biseccion(a, b, TOL, N):
evaluar.dicc_seguro['x']=a
fa = eval(evaluar.funcion, {"__builtins__":None}, evaluar.dicc_seguro)
vectorx = zeros(N)
i = 1
while i<=N :
p = (a+b)/2
#vectorx[i] = p
print p
for i in range(1, N):
vectorx[i]=p
evaluar.dicc_seguro['x']=p
fp = eval(evaluar.funcion, {"__builtins__":None}, evaluar.dicc_seguro)
if (fp == 0.0) or ((b-a)/2.0)<TOL:
break
i = i+1
if (fa*fp)>0 :
a = p
else :
b = p
print "La raiz buscada es: ",p
print "Vector x",vectorx
def dibujar(a,b):
t = arange(a,b,0.1)
evaluar.dicc_seguro['x']=t
plot(t, eval(evaluar.funcion, {"__builtins__":None}, evaluar.dicc_seguro), linewidth=1.0)
xlabel('Abcisa')
ylabel('Ordenada')
title('Metodo Biseccion con f(x)=' + evaluar.funcion)
grid(True)
axhline(linewidth=2, color='r')
axvline(linewidth=2, color='r')
show()
El problema reside en este último fichero en la función biseccion, he optado por poner el bucle este
Código:
for i in range(1, N):
vectorx[i]=p
Pero no me guarda los diferentes valores de p, sólo me guarda un único valor para todos los valores de vectorx
Pongo aquí un ejemplo de salida del programa:
Cita: Introduce la funcion
x-1.3333
Introduce el extremo inferior del intervalo
1
Introduce el extremo superior del intervalo
2
Introduce la tolerancia del metodo
0.00001
Introduce el numero maximo de iteraciones a realizar
10
1.5
1.25
1.375
1.3125
1.34375
1.328125
1.3359375
1.33203125
1.333984375
1.3330078125
1.33349609375
1.33325195312
1.33337402344
1.33331298828
1.3332824707
1.33329772949
1.33330535889
La raiz buscada es: 1.33330535889
Vector x [ 0. 1.33330536 1.33330536 1.33330536 1.33330536 1.33330536
1.33330536 1.33330536 1.33330536 1.33330536]
Como se puede apreciar en Vector x debería de tener los valores 1.5, 1.25, 1.375 etcétera, pero no es así. ¿Alguien me puede decir qué estoy haciendo mal?
Aclarar que el método de la bisección me va correcto pero necesito vectorx para poder dibujar los puntos de aproximación del método en una gráfica.
Por cierto, esto no son mis deberes de clase, estoy aprendiendo Python por mi cuenta y ahora no se a quién preguntar porque mis tiempos de facultad ya hace años que acabaron y no eran de programador
Muchas gracias