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