Andrés Mora Zúñiga B14463 Laboratorio 9 Parte Uno La primera

Anuncio
Nota: 100
Andrés Mora Zúñiga
B14463
Laboratorio 9
Parte Uno
La primera parte del laboratorio consistía en utilizar el método de Newton para el calculo de las raíces
reales de un polinomio de grado n. La solución a esta parte del laboratorio me quedó así:
#! /usr/bin/python
# -*- coding: utf-8 -*import sys
#Primero se asegura que el numero de argumentos sea el minimo correcto.
if len(sys.argv) < 4 :
print 'Numero insfuciente de argumentos'
print 'Debe introducir minimo un polinomio de grado 1 para calcular la solucion real cerca del punto
establecido'
print 'Los datos deben ir: coeficientes-del-polinomio punto-referente'
sys.exit(1)
# Se declaran las variables con las cuales se va a trabajar.
variables = len(sys.argv) - 2
coeficientes = []
derivados = []
punto = int(sys.argv[len(sys.argv)-1])
valorfx = 0
valordfx = 0
#Define los coeficientes de la funcion original en un vector utilizando la linea de entrada de comandos
def coef():
for i in range (0, variables):
coeficientes.append(int(sys.argv[i+1]))
# Define los coeficientes de la derivada con base a los coeficientes de la original.
def coefderiv():
for n in range (0, variables-1):
derivados.append(int(coeficientes[n]) * (variables - (n+1)))
derivados.append(0)
# Evalua la funcion en un punto enviado como parametro.
def funcionevaluada(x):
a=0
for i in range (0, variables):
a += coeficientes[i]*(x**(variables-i-1))
return a
# Evalua la derivada de la funcion en un punto enviado como parametro.
def derivadaevaluada(x):
b=0
for i in range (0, variables):
b += derivados[i]*(x**(variables-i-2))
return b
# Utiliza el metodo de Newton para calcular la aproximacion.
def aproximacion():
x = punto
for i in range (0, 20):
valorfx = funcionevaluada(x)
valordfx = derivadaevaluada(x)
x = x - (valorfx/valordfx)
return x
# Orden logico de la ejecucion de comandos para que el programa funciones adecuadamente
coef()
coefderiv()
print aproximacion()
El método coef() me define mediante un algoritmo simple, un vector que contiene los coeficientes de la
función original.
El método coefderiv() realiza algo similar pero con los coeficientes de la derivada de la función.
Los métodos funcionevaluada() y derivadaevaluada(), me hacen exactamente eso, evaluar las funciones
en un punto variante que se ingresa como un parámetro.
Finalmente el método aproximación es el que implimenta todos los métodos anteriores con el fin de
llevar a cabo el algoritmo de Newton para hallar las raíces reales del polinomio de grado n.
Este método toma un punto x definido por el usuario y le aplica el algoritmo, aumentando o
disminuyendo el el valor de este punto y luego volviendo a evaluar todo hasta que se estabilice. El
programa realiza las iteraciones 20 veces para que la aproximación sea buena.
Parte Dos
Esta parte tenía como finalidad utilizar el método de Euler para encontrar la tensión como una función
variante en el tiempo debido a las variantes de la carga por este mismo. El programa debía de calcular
las tensiones variantes en el tiempo varias veces, e imprimir en un archivo todos los valores de la
tensión referentes a un tiempo específico hasta llegar al tiempo final. Los pasos también eran definidos
por el usuario. El programa me quedó así:
#! /usr/bin/python
# -*- coding: utf-8 -*import sys
#Primero se asegura que el numero de argumentos sea el correcto.
if not len(sys.argv) == 6:
print 'Ingreso un numero incorrecto de argumentos\nDebe de ingresar R C V paso tiempo-final'
sys.exit(1)
# De ser correcto, procede a asignar los valores con los que se va a trabajar, R resitencia, C
capacitancia, V tension, paso, tf Tiempo Final, y se establencen los valores qt carga variante en el
tiempo y ti tiempo inicial en 0 como valores iniciales.
R = float(sys.argv[1])
C = float(sys.argv[2])
V = float(sys.argv[3])
paso = float(sys.argv[4])
tf = float(sys.argv[5])
qt = 0
ti = 0
# Este metodo es el utilizado para evaluar la derivada, recibe los argumentos dados por el usuario y un
q variante.
def evaluar(q, R, C, V):
dq = (C*V-q)/(C*R)
return dq
# Se crea el archivo CSV para escritura de resultados.
CSV = open('Valores de tiempo y tension', 'w')
# A partir de aqui el programa implementa el metodo de euler para encontrar la tension e imprime los
resultados en el archivo establecido.
while ti < tf:
devaluada = evaluar(qt, R, C, V)
ti += paso
qt = qt + paso * devaluada
tension = qt * C
resultado = '%.3f , %f' %(ti, tension)
print >> CSV, resultado
El orden lógico del programa es el siguiente:
1. Se verifica que la cantidad de argumentos ingresados sea el correcto para poder llegar a la
solución correcta del problema, de lo contrario el programa no se ejecuta.
2. Luego de verificar que la cantidad es correcta, procede al almacenar en variables las entradas
del vector de línea de comandos para una manipulación mas sencilla.
3. Se define el método que deja calcular las variaciones de la carga con respecto al tiempo y se
nombra evaluar().
4. Se crea el archivo CSV sobre el cual se van a imprimir los datos de tensiones y tiempo.
5. Y se implementa el método de Euler para calcular la tensión.
En el método de Euler se evalua la derivada, se aumenta el paso en uno, y se le agrega al valor original
de la carga la derivada evaluada por la longitud del paso para ir aumentando poco a poco la carga y
obteniendo valores bastante aproximados para la tensión en un tiempo que avanza desde el inicial = 0 ,
hasta el final en pasos definidos por el usuario.
El archivo de valores de tiempo contra tensión se obtuvo al ingresar los valores:
R = 100
C=1
V = 10
paso = 0.01
tiempo final = 10
Nota: el archivo se adjunta como parte de la solución del laboratorio.
Descargar