Aproximación de soluciones
Curso de Introducción al Pensamiento Computacional con Python
Contenido del curso
Daniloo Morales
Raúl Casado
Juan Camilo Vergara Salazar
Edwin García
Manuel Alejandro Aguilar Téllez Girón
Edwin García
Edward Rodríguez
Jesus Manuel Torrano Esqueda
Luis Raul Del Moral Contreras
Cynthia Rojas Rivera
Andres GIRALDO
Edwinsiño Joan Josue Castañeda Paz
Guillermo Vara De Gante
Iván Darío Sánchez Jiménez
Valenttina Cardozo
Alberto Castro Flores
Anderson Traslaviña
Lorenzo Enrique Piñango Cerezo
Anderson Meza
Rolando Tarqui Benito
Marcos Monteverde
Luis Dotto
Marcos Monteverde
Sergio Orejarena Rueda
- -
Sergio Orejarena Rueda
Juan José Calderón
Juan Fernando Moyano Ramírez
Usuario anónimo
UserJosue Noha Valdivia
joand_ospina
Paula Scatarelli
Karl Behrens Gil
Jose Roberto
Andrés Soret Chacin
Gabriel Missael Barco
Ignacio Crespo
Oscar Francisco Trujillo Puentes
Daniloo Morales
Paula Scatarelli
Patricia Rodríguez Martínez
Cristian Blandon
Patricia Rodríguez Martínez
Demetrio Cumplido Narciso
Santiago Caldevila
martin tibaldo
David Jaramillo Saldarriaga
Juan Pablo Díaz Correa
Liliana Londono Agudelo
Daniel Ponce Morales
Juan Carlos Rincón Gómez
Para los que quizás no entiendan el código, acá quise hacer una explicación super detallada
Buen aporte, gracias!
excelente
Hice unas pruebas con varios lenguajes para probar cuanto se demoraban y eso encontré Para una encontrar la raiz de 121 con un epsilon de 0.0001 realizando 3 mediciones con cada lenguaje este fue el promedio en cada uno. Go 1.95 segundos C 8.30 segundos C++ 13.48 segundos javaScript 37.15 segundos Python 364.80 segundos
Wow! Al parecer Go es el más rápido. ¿Has hecho más pruebas?
La verdad me sorprendió, yo pensé que C sería más rápido. Aunque puede que al ser un programa tan pequeño el comportamiento sea diferente a uno más elaborado. Pero creo que voy a probarlos trabajando con el sistema de archivos. Python también me sorprendió, pensé que iba a ser más rápido que javaScript.
Como me costó entenderlo, trato aquí de dejarlo lo más aclarado posible, espero les sirva:
Es explicación larga, pero creo yo que clara.
Excelente aporte... gracias
Muchas gracias, no sabia que asi podias poner comentarios
Aún espero xd .
Tal cual el meme que estaba buscando.
Me pregunto si habrá llegado a medir el tiempo, yo voy unos minutos y mi portátil parece convertirse ya en un tostador :3
Les comparto como podrian medir el tiempo de ejecucion de su programa
import time start_time = time.time()
Importamos la libreria time y guardamos en una variable el tiempo de inicio del programa
print("--- %s seconds ---" % (time.time() - start_time))
Una vez que termine tomamos la hora actual y las restamos y eso nos dara el tiempo de ejecucion de nuestro programa
Excelente, muchas gracias compañero
Gracias!
Me tomo varios minutos entender el programa debido a que me costo un poco entender la explicación de David, voy a tratar de explicar con mis palabras las partes que fueron difíciles de comprender.
Básicamente epsilon es un porcentaje de error en este caso el 0.01 que seria el 1% de error que aceptamos para la respuesta, por eso recibimos 1.97 en vez de 2 como raiz cuadrada de 4. Se puede incrementar la precisión de la respuesta disminuyendo el porcentaje de error que como vemos en el video, puede ser de 0.001 lo que quiere decir que solo aceptamos el .1% de error en vez del 1% pero la computadora tardaría mucho mas tiempo en encontrar la respuesta que en este caso seria 1.99 o aproximado. En la expresion (respuesta2 - objetivo) >= epsilon simplemente estamos haciendo una comparacion entre el porcentaje de error en cada iteracion con el porcentaje de error de epsilon, asignando valores tenemos que: respuesta = .012 = .0001 - respuesta = 3.9999, por lo tanto 3.999 es mayor a epsilon que vale .01. el error, entonces en la primera iteracion tenemos que el error es de 399%, tenemos que seguir incrementando la respuesta hasta que el error sea mayo o igual que epsilon que es 1%, cuando se cumpla la condicion el ultimo valor iterado sera la respuesta que mas se aproxime a la raiz cuadrada de dos con el error que le asignamos
Esta buena esta explicacion, estubo confusa la explicacion de David Aroesti
Gracias :)
🖥📌En el momento en que tengan un bucle infinito pueden oprimir 'ctrl + c' para terminar el proceso.
mi patata de computadora y yo te lo agradecemos
Excelente, gracias!
jajajjaja, me siento como alan turing decifrando enigma 🤣
Me siento decepcionado de mi pc 😑
from time import time objetivo = int(input('Escoge un numero: ')) epsilon = 0.01 paso = epsilon**2 respuesta = 0.0 tiempo_inicio = time() while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: print(abs(respuesta**2 - objetivo), respuesta) respuesta += paso tiempo_total = time() - tiempo_inicio if abs(respuesta**2 - objetivo) >= epsilon: print(f'No se encontro la raiz cuadrada del objetivo') print(f'Tardo {tiempo_total} segundos') else: print(f'La raiz cuadrada de {objetivo} es {respuesta}') print(f'Tardo {tiempo_total} segundos')
from time import time objetivo = int(input('Escoge un numero: ')) epsilon = 0.0001 paso = epsilon**2 respuesta = 0.0 tiempo_inicio = time() while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: print(abs(respuesta**2 - objetivo), respuesta) respuesta += paso tiempo_total = time() - tiempo_inicio if abs(respuesta**2 - objetivo) >= epsilon: print(f'No se encontro la raiz cuadrada del objetivo') print(f'Tardo {tiempo_total} segundos') else: print(f'La raiz cuadrada de {objetivo} es {respuesta}') print(f'Tardo {tiempo_total} segundos')
Este último tardó muchísimo, de hecho se me apagó la laptop y no llegué a saber.
Maybe it is time to buy a new one haha
Es nuevo 😌😓
Se demoró 3 dias :,(
jajajajaj
Que paciencia tuviste para aguantar ! ...Es admirable tu perseverancia !!!
Diagrama de flujo
efectivo
sigo sin entender por qué chequeamos dos veces lo mismo, es decir, si salimos del while cuando la primera condición deja de ser verdadera, por qué luego lo volvemos a chequear en el if?
Aproximación de soluciones
Es similar a la enumarción exhaustiva, pero no necesita una respuesta exacta, por lo tanto podemos aproximar soluciones con un margen de error que llamaremos epsilon.
Como siempre en programación debemos hacer un trade-off, no podemos ser precisos y rápidos a la ves, por lo tanto cuando nuestro epsilon es muy pequeño esto significa que debemos realizar mas iteraciones para llegar a la aproximación, lo cual significa sacrificar tiempo. Y por otro lado si queremos que nuestro tiempo de ejecución sea lo mas corto posible debemos sacrificar la precisión aumentando el valor de epsilon.
objetivo = int(input('Escoge un numero: ')) epsilon = 0.01 # Definimos un margen de error. paso = epsilon**2 # Los pasos para buscar la raiz sera igual a epsilon^2 respuesta = 0 # Inicializamos una respuesta 0 while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: respuesta += paso if abs(respuesta**2 - objetivo) >= epsilon: print(f'No se encontró la raiz cuadrada de {objetivo}') else: print(f'La raiz cuadrada de {objetivo} es {respuesta}')
Puedes intentar ir moviendo la magnitud de epsilon para obtener una mejor precisión o mejorar el tiempo de ejecución.
Muchas gracias
Tus aportes son muy buenos amigo. Muchas gracias por compartirlos 😁👍👍
import matplotlib.pyplot as plt import numpy as np pruebas = np.arange(0.001, 0.05, 0.001) print(pruebas) iteraciones = [] objetivo = 17 for epsilon in pruebas: paso = epsilon**2 respuesta = 0.0 iteracion = 0 while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: respuesta += paso iteracion += 1 print(iteracion) iteraciones.append(iteracion) plt.plot(pruebas, iteraciones) plt.ylabel('Número de iteraciones') plt.xlabellabel('Epsilon')
Notas de la sesión:
objetivo = int(input('Escoge un número: ')) epsilon = 0.01 #Tolerancia para la aproximación paso = epsilon**2 #Tamaño del avance respuesta = 0.0 while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: respuesta += paso if abs(respuesta**2 - objetivo) >= epsilon: print(f'No se encontró la raíz cuadrada de {objetivo}') else: print(f'La raiz cuadrada de {objetivo} es {respuesta}')
Excelente aporte compañero! Muy interesante la gráfica que creaste! para comprender mejor la clase!
Hola, Les comparto las modificaciones que le hice al código para encontrar el numero de iteraciones y el tiempo transcurrido.
import time objetivo = int(input('Escoge un numero: ')) epsilon = 0.0001 paso = epsilon**2 respuesta = 0.0 num = 0 #numero para contar iteraciones start = time.time() while abs(respuesta**2 - objetivo) >= epsilon and respuesta <= objetivo: respuesta += paso num += 1 end = time.time() print(f'Para resolver hizo {num} iteraciones y se demoro {end - start} segundos') if abs(respuesta**2 - objetivo) >= epsilon: print(f'No se encontro la raiz cuadrada de {objetivo}') else: print(f'La raiz cuadrada de {objetivo} es {respuesta}')
Para encontrar la raíz cuadrada de 4 y usando un epsilon de 0.01 se obtuvo que para resolver el problema hizo 19975 iteraciones y se demoro 0.02600 segundos obteniendo que la raíz cuadrada de 4 es 1.9974999999997964.
Por otro lado, al usar el epsilon igual a 0.0001 se obtuvo que para resolver hizo 199997501 iteraciones y se demoro 249.87 segundos obteniendo que la raíz cuadrada de 4 es 1.999975006212548.
El resultado es mas preciso, pero al hacer un redondeo se quitan números decimales llegando que a la conclusión que no es necesaria la alta precisión para este calculo.
comunidad, para aquellos que no entiendan lo que valor puede tomar epsilon. piensen en, ¿cual es la incertidumbre o error, que quiero que como máximo puede tener mi busqueda de las soluciones?.
epsilon al valer 0.01 --> es como decir que mi valor respecto al valor esperado discrepan en 1%
Te hago una pregunta, a ver si me ayudas:
Cuando se interrumpe el ciclo While (porque respuesta**2 - objetivo deja de ser >= epsilon ) por qué tenemos un if preguntando exactamente lo mismo que acabamos de descartar en la interrupción del while?
Gracias de antemano!
El profesor no es bueno. Es un programa muy fácil y no lo pudo explicar de manera sencilla. Además, esa combinación de español con términos en inglés no es profesional. Hablo inglés y hablo español, pero no los mezclo
El profesor no es bueno, ¡Es excelente! :D
En programación es muy común hablar en inglés y en español, porque generalmente todo el código está en inglés, al igual que muchos de los key terms, por lo que te sugeriría verlo como una oportunidad de aprendizaje :)
Si se te dificultó entender, es completamente normal, puedes revisar este aporte de uno de los miembros de la comunidad... Es bastante claro :muscle:
¡Saludos!
Soy bilingúe, durante mi formación como ingeniero estudié programación y más de 10 ramos de cálculo, algebra y probabilidades. Es fácil entender el contenido de este curso si es bien explicado. Sólo es común hablar en dos idiomas cuando no dominas un tema o cuando la persona quiere parecer más interesante porque también domina los términos en inglés. No es un tema de demostrar saber inglés, es un tema de demostrar los conocimientos no importa el idioma en el que se elija comunicarse. Esto es un curso básico, dictado en español. No es necesario usar "trade off" cada 2 minutos e intercalar alguna palabras en inglés cada cierto tiempo. Aparte, el profesor no explica, sólo escribe el código y no prodfundiza. Sólo espero que los próximos cursos sean mejor explicados. Ahora bien, si es neceario revisar un aporte con más de 377 interacciones, creo que el objetivo de esta parte del curso no fue logrado por parte de la persona que lo imparte.
Una forma más visual de ver esto.
en realidad no es lineal sino q parabolica
No termino de entenderlo, alguien puede ir explicando paso a paso??
Este algoritmo deja de iterar con números enteros para iterar con números racionales, por lo que analiza más posibilidades.
El algoritmo solicita un número cualquiera.
Define un epsilon, que es la exactitud con la que quieres la respuesta.
El paso, es que tanto vas a aumentar a la respuesta por cada iteración que haga buscando la raiz.
La evaluación abs(response**2 - target) >= epsilon mira que tan cerca es la respuesta respecto al numero que se ingresa, por ejemplo, si el resultado de la resta es 0.005 que es menor que epsilon quiere decir que se logró una buena aproximación.
Ya el resto del código es solo para mostrar el resultado de la aproximación
Ejecutando este código me doy cuenta lo pésima que es mi computadora
Hoy me estoy sintiendo frustada; no he podido entender bien el concepto de epsilon, a pesar de que he revisado el algoritmo varias veces. Algún consejo, ayuda o explicación de alguno que si lo haya entendido bien, se agradece un montón.
Es un número positivo normalmente, tan pequeño como quieras, que usamos para hacer hacer aproximaciones.
por ejemplo si tu a epsilon le das el valor de 0.001, el resultado que te da es 1.99974..., cada vez más cercano a 2.
Es la diferencia entre la solución y la realidad. Tu escoges que tanta diferencia va a haber.