Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/07/2008, 02:34
Avatar de tofol
tofol
 
Fecha de Ingreso: febrero-2008
Mensajes: 30
Antigüedad: 16 años, 9 meses
Puntos: 1
Pregunta Duda con array

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