Introducir funciones en python

Como comentábamos hace unos meses, faltaba todavía como introducir funciones en los scripts, de manera que éste solicitase la función a evaluar.
Ayer, leyendo un poco pude hacerlo por medio de exec, que ejecuta un string en python. La idea es que inyectemos la función como string, y que luego modelemos el código que va a definir la función. Prácticamente:

print 'Introduzca función de x, por ej: log(x**2)'
funintroducida = str(raw_input('Funcion: '))
fnx = 'def function(x): \n' + '	return ' + funintroducida
exec fnx

Como vemos, solicita una función de x, la que toma como string. Luego concatena la definición de función, y obtenemos finalmente a function(x), nuestra función matemática.

Modifiqué un viejo script de regula falsi, para adaptarlo a este nuevo código. Además, añadí una función que sustituye los puntos evaluados (por ej, si estamos evaluando sin(x) en 3, dice sin(3) ).

#!/usr/bin/env python
# -*- coding: iso8859-15 -*-
print 'Script para cálculo de raices por régula falsi \n'

##################################################
# Este script pretende demostrar como puede      #
# introducirse una función por parte del usuario.#
# Primero, solicita una función de x y un punto  #
# para evaluarla, devolviéndolo. Luego aplica    #
# régula falsi para obtener la raíz. Enjoy!      #
##################################################

from math import *

#Así puedo introducir la función a utilizar en el programa
print 'Introduzca función de x, por ej: log(x**2)'
funintroducida = str(raw_input('Funcion: '))
fnx = 'def function(x): \n' + '	return ' + funintroducida
exec fnx
p = float(raw_input('Introduzca punto a evaluar: '))

#Función para que el programa de expresiones como 3**2 = 9
def evaluador(expresion,x,y):
	evaluado = ''
	for caracter in expresion:
		if caracter == 'x':
			evaluado = evaluado + str(x)
		else:
			evaluado = evaluado + caracter
	return evaluado+' = '+ str(y)

print 'Para el punto solicitado, '+ evaluador(funintroducida,p,function(p))

#Ahora calculo la raíz...

xa = float(raw_input("Introduzca margen izquierdo: "))
xb = float(raw_input("Introduzca margen derecho: "))
ya = function(xa)
yb = function(xb)
print "las ordenadas respectivas son:"
print "f(xa) = "+evaluador(funintroducida,xa,ya) + " y f(xb) = "+evaluador(funintroducida,xb,yb)

#criterios de parada
u = float(raw_input("Introduzca el número de iteraciones: "))
k = 0
yi = 100
print 'Calculando... \n'
while   k < u:
	ya = function(xa)
	yb = function(xb)
	xi = xb-(function(xb)*(xb-xa)/(function(xb)-function(xa)))
	yi = function(xi)
	if yi * ya < 0:
		xb = xi
	else:
		xa = xi
	k += 1

print "r es aproximado a %5.20f" % xi

Disculpen la ausencia, pero este semestre está un poco pesado!!
Comentarios y recomendaciones aceptadas! Espero sea útil.

Anuncios

About fclad

Estudiante de ingeniería, con todo lo que conlleva!
Esta entrada fue publicada en Proyectos y etiquetada , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s