Daniloo Morales
Para los que quizás no entiendan el código, acá quise hacer una explicación super detallada
Raúl Casado
Buen aporte, gracias!
Juan Camilo Vergara Salazar
excelente
¿Qué es la aproximación de soluciones en ciencia de la computación?
La aproximación de soluciones es un concepto clave en ciencia de la computación que busca ofrecer una respuesta cercana a un problema cuando una solución precisa no es factible o no está dentro de nuestro espacio de búsqueda. Estos algoritmos son útiles cuando es necesario ofrecer resultados rápidos, pero comprenden un intercambio (trade-off) entre precisión y velocidad. A medida que intentamos lograr una precisión mayor (epsilon más pequeño), requeriremos más ciclos de cómputo.
¿Cómo desarrollar un algoritmo de aproximación para la raíz cuadrada?
Para entender cómo aproximarnos a la raíz cuadrada de un número, creamos un programa que hace precisamente eso. Aquí explicamos paso a paso:
Definición del objetivo y epsilon:
epsilon que representa cuán cerca queremos estar de la solución real. En este ejemplo, usamos 0.01.Inicialización de variables:
paso como epsilon al cuadrado, y respuesta empieza en 0.0.Iteración para encontrar la aproximación:
while que continúa ejecutándose mientras el valor absoluto de (respuesta**2 - objetivo) sea mayor o igual a epsilon y respuesta sea menor o igual al objetivo.respuesta por paso.Verificación de la respuesta:
(respuesta**2 - objetivo) es mayor o igual a epsilon para decidir si se encontró la solución aproximada.objetivo = float(input("Ingrese un número: ")) epsilon = 0.01 paso = epsilon**2 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 para {objetivo}") else: print(f"La raíz cuadrada aproximada de {objetivo} es {respuesta}")
¿Cómo afectan la precisión y la velocidad en el algoritmo?
La relación entre precisión y velocidad es fundamental en estos algoritmos:
Mayor precisión (epsilon pequeño): Se requiere un tiempo de cálculo mayor debido a la necesidad de más iteraciones para lograr la respuesta deseada. Esto es crucial en aplicaciones donde la precisión es crítica, como cálculos para misiones espaciales.
Menor precisión (epsilon grande): Permite obtener resultados más rápidamente pero con menor precisión, útil cuando se necesita una respuesta rápida y precisa.
Este balance entre velocidad y precisión depende del contexto y las necesidades específicas del problema a resolver.
¿Qué se aprende al modificar el epsilon?
Experimentar con diferentes valores de epsilon es importante:
epsilon más pequeño incrementa la cantidad de iteraciones, impactando en el tiempo de ejecución.epsilon, el algoritmo opera más rápido, pues alcanza la aproximación con menos iteraciones.Probar estas variaciones en tu propia computadora te ayudará a comprender mejor el funcionamiento del algoritmo y cómo factores del hardware pueden influir en la ejecución y rendimiento de los programas.
En resumen, los algoritmos de aproximación son herramientas poderosas cuando no es posible obtener una solución exacta, permitiéndonos definir nuestro criterio para alcanzar el balance adecuado entre precisión y velocidad. Explorar diferentes valores de epsilon y medir su impacto te predispone para aplicaciones más sofisticadas en el futuro. Recuerda que el camino hacia convertirte en un ingeniero de software competente implica conocer cómo y cuándo aplicar estas técnicas según el contexto. ¡Sigue explorando y compartiendo tus experimentos para enriquecer el aprendizaje conjunto!
Daniloo Morales
Para los que quizás no entiendan el código, acá quise hacer una explicación super detallada
Raúl Casado
Buen aporte, gracias!
Juan Camilo Vergara Salazar
excelente
Edwin García
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
Manuel Alejandro Aguilar Téllez Girón
Wow! Al parecer Go es el más rápido. ¿Has hecho más pruebas?
Edwin García
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.
Edward Rodríguez
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.
Jesus Manuel Torrano Esqueda
Excelente aporte... gracias
Luis Raul Del Moral Contreras
Muchas gracias, no sabia que asi podias poner comentarios
Aún espero xd .
Guillermo Vara De Gante
Iván Darío Sánchez Jiménez
Excelente, muchas gracias compañero
Valenttina Cardozo
Gracias!
Alberto Castro Flores
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
Anderson Traslaviña
Esta buena esta explicacion, estubo confusa la explicacion de David Aroesti
Lorenzo Enrique Piñango Cerezo
Gracias :)
Anderson Meza
🖥📌En el momento en que tengan un bucle infinito pueden oprimir 'ctrl + c' para terminar el proceso.
Rolando Tarqui Benito
mi patata de computadora y yo te lo agradecemos
Marcos Monteverde
Excelente, gracias!
Luis Dotto
Marcos Monteverde
jajajjaja, me siento como alan turing decifrando enigma 🤣
Sergio Orejarena Rueda
- -
Maybe it is time to buy a new one haha
Sergio Orejarena Rueda
Es nuevo 😌😓
Juan José Calderón
Se demoró 3 dias :,(
Juan Fernando Moyano Ramírez
jajajajaj
Usuario anónimo
UserQue paciencia tuviste para aguantar ! ...Es admirable tu perseverancia !!!
Josue Noha Valdivia
Diagrama de flujo
Joan David Ospina Garcia
efectivo
Paula Scatarelli
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?
Karl Behrens Gil
Jose Roberto
Muchas gracias
Andrés Soret Chacin
Tus aportes son muy buenos amigo. Muchas gracias por compartirlos 😁👍👍
Gabriel Missael Barco
Ignacio Crespo
Excelente aporte compañero! Muy interesante la gráfica que creaste! para comprender mejor la clase!
Oscar Francisco Trujillo Puentes
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.
Daniloo Morales
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%
Paula Scatarelli
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!
Patricia Rodríguez Martínez
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
Cristian Blandon
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!
Patricia Rodríguez Martínez
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.
Demetrio Cumplido Narciso
Una forma más visual de ver esto.
Santiago Caldevila
en realidad no es lineal sino q parabolica
martin tibaldo
No termino de entenderlo, alguien puede ir explicando paso a paso??
David Jaramillo Saldarriaga
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
Juan Pablo Díaz Correa
Ejecutando este código me doy cuenta lo pésima que es mi computadora
Liliana Londono Agudelo
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.
Daniel Ponce Morales
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.
Juan Carlos Rincón Gómez
Es la diferencia entre la solución y la realidad. Tu escoges que tanta diferencia va a haber.
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
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.
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.
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}')