he dividido el programa en tres ficheros:
Fichero evaluar.py
Código:
Fichero Metodos.py (este es el fichero main del programa)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")
Código:
El fichero Biseccion.py#!/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)
Código:
El problema reside en este último fichero en la función biseccion, he optado por poner el bucle este#!/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()
Código:
Pero no me guarda los diferentes valores de p, sólo me guarda un único valor para todos los valores de vectorxfor i in range(1, N): vectorx[i]=p
Pongo aquí un ejemplo de salida del programa:
Cita:
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?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]
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]
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