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. 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. R/ El programa se ejecuta de la siguiente manera: python lab9.1 (coeficientes del polinomio) (valor incial) Ej: python lab9.1 1 2 3 5 El código que se implementó junto con su documentación es el siguiente: # coding: utf-8 #Se importa sys para terminar el programa cuando se necesite #y leer los argumentos ingresados por la cli del usuario import sys #Se ejecutará el código solo si la cantidad de argumentos #ingresada por cli es mayor a 3, si es menor, se imprime #un error notificando al usuario. if len(sys.argv) < 3: print "Error: cantidad o tipo de valores incorrecto" #Si es mayor ejecutamos el código else: #Se inicializa la lista coeficientes que contendrá #los coeficientes del polinomio de grado n que ingrese #el usuario, empezando por el coeficiente del término de grado n coeficientes = [] #Se inicializa la variable solaprox que es la solución aproximada #que se imprimirá al usuario solaprox = 0 #Se trata de "castear" el valor a un float try: valorinicial = float(sys.argv[1]) #de no ser posible se imprime un error notificando al usuario
#y se termina el programa. except Exception: números" print "Error:\nEl tipo de datos ingresado no es el correcto por favor solo ingrese #Se ingresa a la lista coeficientes los valores ingresados por el usuario #y se tratan de "castear" todos los datos, si es posible los valores se guardan #en la lista. for i in range (2,len(sys.argv)): try: coeficientes.append(float(sys.argv[i])) except Exception: #Si no fue posible se le notifica al usuario un error. print "No ingresó los valores correctos, ingrese números por favor" #Se le da a la variable gradon el valor de la longitud de la lista #coeficientes, esto para facilitar la escritura del código siguiente. gradon = len(coeficientes) #Se crea el método evaluarfuncion el cual se le envia un parámetro #valor1 equivalente al valor inicial ingresado por el usuario o #la nueva solución obtenida a través del método de Newton, para evaluar #el polinomio en este valor. def evaluarfuncion (valor1): #Se inicializa la variable resultado la cual es el resultado del polinomio #ingresado por el usuario evaluada en el parámetro valor1 este valor retornado. resultado = 0 #Se evaluá el polinomio en el valor1 por medio de un for #el cual lee el coeficiente del grado n del polinomio y lo #multiplica por el valor1 elevado al grado de ese coeficiente #del polinomio. Y va sumando estos resultados en la variable resultado. for i in range (0,gradoN): resultado += coeficientes[i]*valor1**(gradon-(i+1)) #Se retorna resultado del polinomio evaluado. return resultado #Se crea el método el método evaluarderivada el cual dervida el polinomio #ingresado por el usuario, recibe un parámetro, el cual es el valor inicial
#ingresado por el usuario o la nueva solución obtenida a través del método #de Newton, para evaluar la derivada del polinomio en este valor. def evaluarderivada (valor1): #Se incializa la lista derivada la cual contendrá los coeficientes de la #derivada del polinomio ingresado por el usuario. derivada = [] #Se inicializa la variable resultado la cual es el resultado de la #derivada evaluada en el parámetro enviado este valor es retornado. resultado = 0 #Se evaluá la derivada del polinomio en el valor1 por medio de un for #el cual lee el coeficiente del grado n de la derivada y lo #multiplica por el valor1 elevado al grado de ese coeficiente #de la derivada. Y va guardando estos resultados en la variable resultado. for i in range (0,gradoN-1): derivada.append(coeficientes[i]*(gradon-(i+1))) derivada[i] = derivada[i]*valor1**(gradon-i-2) resultado += derivada[i] #Se retorna resultado del polinomio evaluado. return resultado #Se crea el método encontrarsol usa el algoritmo del método de Newton #para encontrar una solución aproximada del polinomio ingresado por el usuario, #se ejecutará el algoritmo hasta que el error sea menor a 0.0001 o el número de #iteraciones llegue a 20, este método retorna el valor de solnueva el cual contiene #la solución aproximada. def encontrarsol (): #Se define la variable solnueva la cual es el resultado de la solución aproximada solnueva = 0 #Se define la variable solvieja inicialmente con el valor inicial solvieja = valorinicial #Se define la variable numeroiteraciones para controlar el número de veces #que se ejecutará el bloque de código siguiente. #Se define el error el cual controlada junto con el número de iteraciones cuantas #veces se ejecuta el bloque de código siguiente #Ambas variables funcionan para asegurar si el método converge o no. numeroiteraciones= 0 error = 1
#Se ejecuta el algoritmo de Newton mientras las iteraciones sean menores a 20 o #el error menor a 0.0001 y si y solo si la evaluación en la derivada del parámetro #enviada a la misma distinta de 0, esto para evitar una división entre 0. while (numeroiteraciones < 20 and evaluarderivada(solvieja)!= 0) or (error > 0.0001 and evaluarderivada(solvieja)!= 0): solnueva = solvieja - evaluarfuncion(solvieja)/evaluarderivada(solvieja) solvieja = solnueva error = solvieja - solnueva numeroiteraciones = numeroiteraciones+1 return solnueva #Se determina el valor de la variable solaprox como el valor que retorna el #método encontrarsol() solaprox = encontrarsol() #Si la solución es distinta de 0 se imprime el valor de la misma if solaprox!= 0: print "La solución aproximada es: %6f" %(solaprox) #sino se le indica al usuario que el método no convergió. else: print "No se pudo encontrar la raíz por medio del método" 2. La carga en un capacitor en un circuito RC serie ante un impulso escalón con valor V está descrito por una ecuación diferencial. 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 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) = 0. R/ El código junto con su documentación son: #! /usr/bin/python #coding: UTF-8 import sys #Se verifica que la cantidad de argumentos ingresada por el usuario sea igual a 6. if len(sys.argv)!= 6:
print "\nerror: ingresó un número incorrecto de argumentos, debe ingresar 6\n" #Si es igual a 6 se asginan los valores a las variables. R = float(sys.argv[1]) #resitencia C = float(sys.argv[2]) #Capacitancia V = float(sys.argv[3]) #Tensión p = float(sys.argv[4]) #Paso ti = 0 #Tiempo inicial tf = float(sys.argv[5]) #tiempo final qt = 0 #Además se crea el archivo del tipo CSV donde se imprimirán los resultados. archivo = open('resultados', 'w') #Se crea el método derivadacarga que evalúa y retorna el valor de dq a partir de los parámetros enviados def derivadacarga(r, C, V, qt): return (C*V-qt)/(C*R) #Se crea un ciclo que para cuando el tiempo inicial sea igual al final indicado por el usuario #Y guarda los resultado en el archivo indicado. while ti < tf: evaluado = derivadacarga(r, C, V, qt) qt = qt + p * evaluado tensiontiempo = qt * C resultado = '%.4f, %.15f' %(ti,tensiontiempo) ti += p print >> archivo, resultado