Nota: 100 - Universidad de Costa Rica

Anuncio
Nota: 100
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
I CICLO 2012
LABORATORIO 9
MÉTODOS NUMÉRICOS
CHRISTIAN CHAVES BEJARANO A81740
1. Escriba un programa que permita encontrar raíces de un polinomio de grado n usando el método de newton (http://en.wikipedia.org/wiki/Newton’s_method).El programa debe recibir, a
través de la línea de comandos, los coeficientes del polinomio y un valor inicial x0 . Por ejemplo,
si se quiere encontrar una raíz para el polinomio
p(x) = 2x3 − 6x2 + 4x − 8
con el valor inicial 10, el programa debe ejecutarse de la siguiente forma:
\ $ ./ newton . py 2 -6 4 -8 10
Si el método converge, se deben continuar las iteraciones hasta que la solución se estabilice,
al menos hasta el cuarto decimal. Si no converge, el programa debe detenerse luego de un
número definido de iteraciones(al menos 20)y notificar al usuario que no se puede encontrar
una solución.
Mediante el siguiente código desarrollado en lenguaje de Python se soluciona el problema propuesto, la solución
al mismo se logra mediante el método de Newton encontrado en la web, este método permite la solución a un
polinomio de grado n a partir de un valor inicial brindado:
# !/ usr / bin / python
# Declara la direccion absoluta del ejecutor de python
# -* - coding : utf -8 -* # Permite agregar tildes y otros simbolos
import sys
# Importa la libreria sys , que permite el uso de variables argv
import math
# Importa la libreria math , que permite utilizar operaciones y funciones
matematicas
# Se definen las FUNCIONES a utilizar
# Define la funcion donde se evalua el polinomio en el valor inicial
def funcion ( polinomio , xo ) :
funcion =0
tamano = range ( len ( polinomio ) )
for grado in tamano :
funcion +=( float ( polinomio [ grado ]) *( math . pow ( float ( xo ) , int (
tamano [ grado ]) ) ) )
return float ( funcion )
1
# Define la derivada de la funcion donde se evalua el polinomio derivada en el
valor inicial
def derivada ( polinomio , xo ) :
tamano = range ( len ( polinomio ) )
derivada =0
for grado in tamano :
derivada +=( float ( polinomio [ grado ]) * grado *( math . pow ( float ( xo ) ,
int ( tamano [ grado ] -1) ) ) )
return float ( derivada )
# Programa Principal
# Manejo de errores
# Si no se ingresa un polinomio el programa debe indicar el error
if len ( sys . argv ) <=4:
print " Debe ingresar un polinomio de grado n "
sys . exit (1)
# Se definen las variables a utilizar dentro de las funciones
# Valor inicial xo en la posicion del tamano de la lista sys . argv menos uno
xo = float ( sys . argv [( len ( sys . argv ) ) -1])
# Se define el polinomio como la lista que va desde la posicion uno a la ultima
menos uno dado que son los valores a considerar dentro de la lista de sys .
argv
polinomio = sys . argv [1:( len ( sys . argv ) ) -1]
# Se intercambia el orden de valores de la lista
polinomio . reverse ()
print " Este programa calcula un polinomio de orden n en este caso orden %d " %(
len ( polinomio ) )
# Se inicializa el programa
k =0
resultados =[]
# Iteracion de al menos 20 ocasiones
while k < 20:
# Metodo de Newton
x1 = xo -( funcion ( polinomio , xo ) / derivada ( polinomio , xo ) )
xo = x1
k +=1
# Se guardan los valores dentro de la lista resultado
resultados . append ( x1 )
print x1
# Si la diferencia entre los valores en la posicion 19 y 18 en la lista
resultados es menor a 0 ,0001 el metodo converge de lo contrario se indica
if math . fabs ( resultados [19] - resultados [18]) <0.0001:
print " El metodo converge por lo tanto x1 seria %f " %( resultados [19])
else :
print " No se puede encontrar solucion "
La ejecución del mismo se puede observar en la terminal mediante el comando python nombredelarchivo.py
x x x x, donde el usuario ingresa los valores deseados en la cli, se proponen dos ilustraciones de la
2
interpretación en la terminal, la primera donde el método converge y una segunda donde el método no
converge:
Figura 1: Interpretación del Método de Newton, con convergencia
Figura 2: Interpretación del Método de Newton, o hay convergencia
2. La carga en un capacitor en un circuito RC serie ante un impulso escalón con valor V está
descrito por la siguiente diferencial:
dq(t)
1
=
(CV − q(t))
dt
RC
Escriba un programa que utilice el método de Euler (http://en.wikipedia.org/wiki/Euler’s_method)para
aproximar el voltaje en el capacitor v(t) = C · q(t). El programa debe recibir como argumento, a
3
través de la línea de comandos, los valores de C, R y V, el tamaño del paso y el tiempo final.
EL cálculo debe iniciar en t=0, asumiendo como condición inicial q=0.
\ $ ./ euler . py 10000 1e -6 10 0.01 10
El programa debe generar un archivo CSV(comma separated values) con el tiempo (t) y el
voltaje (v(t) determinado en cada iteración.
El presente programa ha sido desarrollado mediante la utilizacion del método de Euler para encontrar la
solución a la ecuación diferencial que calcula el voltaje del capacitor en el tiempo, el siguiente código muestra
la solución propuesta, ademas se crea un archivo CSV el cual se adjunta dentro de los archivos:
# !/ usr / bin / python
# Declara la direccion absoluta del ejecutor de python
# -* - coding : utf -8 -* # Permite agregar tildes y otros simbolos
import sys
# Importa la libreria sys , que permite el uso de variables argv
import math
# Importa la libreria math , que permite utilizar operaciones y funciones
matematicas
# Se definen las FUNCIONES a utilizar
# Define la funcion donde se evalua el metodo de Euler con los valores ingresados
por el usuario
def Euler (R , C , V , h , qt ) :
CargaTiempo = qt + h *( C *V - qt ) /( R * C )
# Se calcula la carga en el tiempo que inicialmente es cero
return CargaTiempo
# PROGRAMA PRINCIPAL
# Manejo de errores
# Si no se ingresa la cantidad adecuada de valores el programa debe indicar el error
if len ( sys . argv ) !=6:
print " Debe ingresar la cantidad de valores requerida Resistencia ,
Capacitancia , Voltaje , tamano del paso y tiempo final "
sys . exit (1)
# Se definen las variables a utilizar dentro de las funciones , todas ellas son
ingresadas por la linea de comando , el termino en la posicion cero corresponde
al nombre del archivo por lo tanto no se toma en consideracion
R = float ( sys . argv [1])
C = float ( sys . argv [2])
V = float ( sys . argv [3])
h = float ( sys . argv [4])
TiempoFinal = float ( sys . argv [5])
4
print " Este programa utiliza el metodo de euler para aproximar el valor del voltaje
en el capacitor "
# Se inicializa el programa y se crean las variables iniciales
qt =0
t =0
datos = open ( ’ parte2 . csv ’ , ’w ’) # Crea el archivo CSV
print >> datos , " Tiempo ( t ) " , " Voltaje ( t ) " # Crea los titulos de los valores en el
archivo
voltajes =[] # Lista donde se guardan los voltajes obtenidos
# Iteracion hasta alcanzar el tiempo final
while t < TiempoFinal :
# Metodo de Euler
CargaTiempo = Euler (R , C , V , h , qt ) # Se evalua la funcion
Voltaje = C * CargaTiempo
qt = CargaTiempo # Se reasigna la variable inicial y se empieza la iteracion de
nuevo
t += h
print >> datos , t , Voltaje
# datos . write (" Tiempo ( t ) %f Voltaje ( t ) %.5g " %(t , Voltaje ) )
# Se guardan los valores dentro de la lista voltajes
voltajes . append ( Voltaje )
print " Tiempo ( t ) %f , Voltaje ( t ) %.5g " %(t , Voltaje )
Este código muestra la utilización del método para la solución del problema propuesto, la siguiente ilustración
muestra la funcionabilidad del mismo:
Figura 3: Interpretación del Método de Euler
La siguiente ilustración muestra el archivo CSV generado:
5
Figura 4: Archivo CSV generado
6
Descargar