Introducción a las Ciencias de la Computación y la Programación


Enteros y Punto Flotante

Este cuaderno muestra la representación de números enteros y de punto flotante. Comienza mostrando cómo se representan los enteros utilizando bits, proporcionando ejemplos prácticos y conversiones de enteros a cadenas de bits. Luego, se muestran los números de punto flotante, explicando su representación detallada, incluyendo el signo, el exponente y el significando, y cómo estas representaciones pueden afectar los cálculos numéricos debido a errores de redondeo y límites de precisión. También se muestra una introducción al cálculo simbólico utilizando la librería Symbolics, mostrando cómo realizar operaciones simbólicas que no dependen de valores numéricos específicos.


Introducción a la modelación matemática

El cuaderno muestra una introducción a la modelación matemática. Se centra en el problema de estimar la cantidad de jugo en una naranja mediante un enfoque matemático. Se presenta un modelo matemático básico asumiendo la forma esférica de la naranja y propone un método numérico para estimar la cantidad de jugo. También se discute la implementación del método numérico y la importancia de determinar y validar los parámetros del modelo, así como de considerar y cuantificar los diferentes errores introducidos en el proceso de modelación.


Ajuste de curvas

El cuaderno aborda el ajuste de curvas y datos, explorando métodos para encontrar modelos que describan con precisión el comportamiento de datos observados, centrándose en el crecimiento de tumores en ratones. Se discuten varios enfoques, como el ajuste lineal, polinómico cúbico, redes neuronales artificiales y ecuaciones diferenciales, específicamente el modelo de Von Bertalanffy. El ajuste de curvas busca establecer relaciones entre variables optimizando los parámetros del modelo para minimizar el desajuste entre datos observados y generados, utilizando la técnica de mínimos cuadrados basada en la norma euclidiana.


Ecuaciones No Lineales

El cuaderno trata sobre métodos numéricos para encontrar las raíces de una función real \( f: \mathbb{R} \to \mathbb{R} \). Se exploran varios métodos, incluyendo el de bisección, el de Newton y el método del punto fijo. El método de bisección se basa en la propiedad de cambio de signo de la función en un intervalo y se implementa para encontrar raíces de funciones continuas. El método de Newton utiliza la derivada para iterar hacia una raíz, y el método de punto fijo busca un valor \( x^* \) tal que \( F(x^*) = x^* \). El cuaderno también presenta implementaciones y ejemplos prácticos usando la función \( \exp(x) - \sin(x) \) para ilustrar cada método.


Datos, variables y expresiones
Descripción de la imagen

Datos, variables y expresiones

El cuaderno introduce conceptos fundamentales de programación en Julia, comenzando con los tipos básicos de datos (números, cadenas y booleanos) y el uso de variables para almacenarlos. Explica cómo combinar datos y operadores en expresiones, realizar operaciones aritméticas, manipular cadenas y trabajar con tipos de datos utilizando funciones nativas. También aborda la interacción con el usuario mediante entrada de datos, operadores lógicos para realizar comparaciones y ejemplos prácticos como el cálculo del área de un círculo, utilizando fórmulas matemáticas y constantes predefinidas. Además, se enseña cómo realizar conversiones de tipos y definir constantes inmutables. Estos conceptos se presentan de manera progresiva, con ejemplos prácticos que facilitan su comprensión.


Estructuras de control
Descripción de la imagen

Estructuras de control

El documento es un cuaderno interactivo diseñado para introducir y practicar el uso de estructuras de control en el lenguaje de programación Julia. A lo largo del material, se exploran diferentes estructuras como bucles (for y while), condicionales (if-else) y comandos avanzados (break y continue). Cada sección combina teoría con ejercicios prácticos que permiten al lector experimentar con el código directamente. Se presentan conceptos básicos, como iterar sobre listas y rangos, junto con ejemplos más avanzados, como bucles anidados para operar sobre matrices y el manejo de diccionarios. También incluye el uso de estructuras de control para manejar condiciones dinámicas y patrones comunes como tablas de multiplicar, triángulos de asteriscos y pirámides de números. Además, se introduce el manejo de excepciones con try-catch-finally, explicando cómo capturar y manejar errores en el código. Todo esto se acompaña de ejercicios prácticos que fomentan la comprensión y el dominio de estas herramientas clave en la programación.


Listas, secuencias y arreglos
Descripción de la imagen

Listas, secuencias y arreglos

Este cuaderno interactivo introduce a los usuarios en el uso y la manipulación de listas, arreglos y secuencias en Julia, con un enfoque práctico y progresivo. Las listas, entendidas como colecciones unidimensionales que almacenan elementos de diferentes tipos, son el punto de partida. Se detalla cómo crearlas, acceder a sus elementos mediante índices, modificarlas dinámicamente y aplicar operaciones básicas como ordenarlas, invertirlas o calcular su longitud. El documento avanza hacia los arreglos multidimensionales, explicando cómo se pueden representar datos en dos o más dimensiones, como matrices. Aquí se explora cómo reorganizar datos con la función reshape(), acceder a elementos específicos utilizando índices, y realizar operaciones comunes como transponer matrices o calcular la suma total de sus elementos. También se abordan las secuencias, una estructura que facilita el manejo de rangos de números en Julia. Se muestra cómo aplicar funciones a los elementos de una secuencia utilizando map(), cómo filtrar valores con filter() y cómo convertir una secuencia en un arreglo manipulable con collect(). A esto se suma la introducción a técnicas más avanzadas, como el uso de reduce() para combinar elementos de una colección en un solo valor, unique() para eliminar duplicados y otras operaciones agregadas. El cuaderno incluye una serie de ejercicios prácticos que refuerzan cada concepto explicado. Entre ellos destacan la manipulación de listas mediante la adición y eliminación de elementos, la reorganización y operación sobre matrices, y el procesamiento de secuencias para transformar y filtrar datos. Además, se proponen ejercicios clásicos como invertir listas, eliminar duplicados y rotar elementos, que permiten aplicar las habilidades adquiridas de manera concreta.


Funciones
Descripción de la imagen

Funciones

Este cuaderno interactivo explica el concepto y uso de funciones en Julia, desde lo básico hasta lo avanzado, destacando su papel en la modularidad y reutilización del código. Comienza con la definición de funciones básicas, incluyendo argumentos predeterminados y sintaxis compacta. Luego, explora el manejo de variables locales y globales, aclarando su impacto en el alcance y el rendimiento del código. Avanza hacia funciones intermedias y avanzadas, como el uso de argumentos con nombre, funciones anónimas y de orden superior, que permiten recibir o devolver otras funciones. Además, introduce herramientas como map, filter y reduce para manipular colecciones de datos de forma eficiente. El cuaderno incluye ejercicios prácticos y visualizaciones interactivas, como gráficos de funciones cuadráticas y senoidales, que ayudan a comprender cómo las funciones pueden modelar relaciones matemáticas y dinámicas. Es una guía completa y progresiva que proporciona una sólida base para trabajar con funciones en Julia de manera eficiente y organizada.


Clases y Objetos
Descripción de la imagen

Clases y Objetos

Este cuaderno interactivo explica cómo Julia implementa conceptos similares a clases y objetos a través de estructuras (struct) y tipos. Introduce estructuras inmutables y mutables para definir datos y métodos que operan sobre ellos, mostrando cómo asociar funciones a estructuras y sobrecargar funciones para diferentes tipos. También aborda constructores personalizados para crear instancias con lógica específica y el uso de tipos abstractos para jerarquías y polimorfismo. Se destaca la composición como alternativa a la herencia para combinar estructuras de manera modular. Incluye ejemplos prácticos como la creación de puntos, círculos y la visualización interactiva del área de un círculo mediante controles dinámicos. Este material combina teoría y práctica para enseñar conceptos clave de programación estructurada en Julia, enfatizando la claridad y la reutilización del código.


Recursión
Descripción de la imagen

Recursión

Este cuaderno interactivo explica a fondo la recursión en Julia, mostrando cómo resolver problemas dividiéndolos en subproblemas más pequeños. Comienza con ejemplos básicos como el cálculo del factorial y la suma de números hasta un valor dado, destacando la importancia de los casos base para evitar ciclos infinitos. Se exploran conceptos intermedios como la sucesión de Fibonacci, que genera un árbol de cálculos, y el problema de las Torres de Hanoi, que muestra la lógica paso a paso. A nivel avanzado, se introducen la recursión de cola para optimizar funciones, la memoización para evitar cálculos repetitivos y el backtracking, utilizado en problemas como las N-reinas. El cuaderno incluye visualizaciones como el triángulo de Sierpinski, que demuestra cómo las funciones recursivas pueden generar patrones gráficos complejos. Es una guía completa que combina teoría, práctica y ejemplos interactivos, ideal para aprender y dominar la recursión en Julia.


Grafos
Descripción de la imagen

Grafos

La teoría de grafos estudia cómo los objetos están relacionados entre sí mediante nodos y aristas. Los grafos pueden ser dirigidos (con relaciones unidireccionales) o no dirigidos (relaciones bidireccionales) y se utilizan para modelar situaciones como redes sociales, sistemas de transporte y conexiones en sistemas complejos. Propiedades clave incluyen el grado de los nodos (número de conexiones), la conexidad (si todos los nodos están interconectados), los ciclos (rutas cerradas) y las componentes conexas (subgrafos donde todos los nodos están conectados entre sí). Los algoritmos como BFS (búsqueda en amplitud) y DFS (búsqueda en profundidad) permiten explorar y analizar grafos, encontrar caminos y detectar patrones. La representación visual de grafos facilita el análisis y su aplicación en áreas como redes computacionales, optimización de rutas y biología, mostrando su relevancia práctica en múltiples disciplinas.


Optimización
Descripción de la imagen

Optimización

La optimización es un proceso para encontrar los valores máximos o mínimos de una función, con o sin restricciones. Es fundamental en áreas como la economía, la ingeniería y la ciencia de datos, donde se busca maximizar eficiencia, minimizar costos o resolver problemas complejos. En la optimización sin restricciones, el objetivo es localizar extremos locales o globales de una función, mientras que en la optimización con restricciones se añaden condiciones que deben cumplirse, como límites en los valores de las variables. Se emplean ejemplos como funciones cuadráticas simples y funciones no lineales con múltiples puntos óptimos, como la función de Himmelblau. Los gráficos ayudan a visualizar el comportamiento de las funciones y los puntos óptimos, reforzando la comprensión de las técnicas de optimización. Este enfoque permite aplicar métodos para resolver problemas prácticos en distintos contextos.


Complejidad computacional
Descripción de la imagen

Complejidad computacional

El contenido de este documento se centra en la complejidad computacional, un área de estudio que evalúa la eficiencia de los algoritmos en términos de **tiempo** y **espacio**. Se explican conceptos fundamentales como las notaciones de complejidad O-grande (para el peor caso), Omega-grande (para el mejor caso), y Theta (para casos promedio), utilizadas para describir el comportamiento de los algoritmos a medida que crece el tamaño de los datos de entrada. Se destacan ejemplos prácticos, como la búsqueda secuencial (complejidad lineal, O(n)) y la búsqueda binaria (complejidad logarítmica, O(log n)). Además, se incluyen ejercicios y visualizaciones que comparan estas técnicas, mostrando gráficamente cómo varía su rendimiento. El documento también aborda la complejidad espacial, explicando cuánta memoria utilizan los algoritmos, especialmente los recursivos, que consumen más espacio debido al uso de la pila de llamadas. Se introducen algoritmos clásicos de ordenamiento como el ordenamiento burbuja O(n^2) y el ordenamiento rápido O(n log n). Finalmente, se exploran problemas más avanzados, como los problemas P y NP, con ejemplos como el Problema del Viajante de Comercio y el Problema de la Mochila, explicando su dificultad computacional y cómo estas soluciones pueden verificarse en tiempo polinómico. Se utilizan gráficos, ejemplos prácticos y visualizaciones para hacer comprensibles estos conceptos teóricos y su aplicabilidad.


Introducción a la criptografía
Descripción de la imagen

Introducción a la criptografía

El cuaderno presenta una introducción detallada a los conceptos fundamentales de la criptografía, su evolución histórica, tipos principales, aplicaciones y desafíos actuales. Comienza explicando la importancia de la criptografía en la seguridad de la información, destacando propiedades clave como la confidencialidad, integridad, autenticación y no repudio. Se abordan técnicas clásicas como el Cifrado César y el cifrado por transposición, mostrando su relevancia histórica y sus limitaciones frente a los métodos modernos. Los principales tipos de criptografía incluyen: 1. Criptografía Simétrica: Utiliza una sola clave para cifrar y descifrar. Ejemplo: AES. 2. Criptografía Asimétrica: Emplea pares de claves (pública y privada). Ejemplo: RSA y criptografía de curvas elípticas (ECC). 3. Funciones Hash: Generan un resumen irreversible de datos para aplicaciones como firmas digitales y protección de contraseñas. Se incluyen ejemplos de implementación de algoritmos como XOR, AES y RSA, junto con explicaciones sobre su funcionamiento interno y aplicaciones prácticas. Además, se presentan conceptos avanzados como la criptografía poscuántica y los retos que plantea la computación cuántica a los algoritmos actuales. Finalmente, el cuaderno incluye ejercicios y visualizaciones interactivas para ilustrar los conceptos, haciendo énfasis en cómo la criptografía protege la información en aplicaciones modernas como blockchain, transacciones electrónicas y redes seguras.


Introducción al modelamiento 3D
Descripción de la imagen

Introducción al modelamiento 3D

El contenido explora el modelado tridimensional y la representación de datos en 3D usando PlutoPlotly, centrándose en la creación y análisis de gráficos interactivos. Comienza con la introducción de puntos tridimensionales definidos por coordenadas (x, y, z), visualizados mediante gráficos de dispersión que permiten analizar la distribución de datos en un espacio tridimensional. Estos gráficos pueden personalizarse con marcadores, líneas y combinaciones de ambos. Se aborda la creación de mallas y superficies, estructuras que conectan puntos mediante caras triangulares para formar representaciones más complejas, como superficies topográficas. Estas herramientas permiten observar características clave como relieves y contornos, destacando variaciones en los datos. Los gráficos de dispersión y burbujas se utilizan para mostrar relaciones entre varias dimensiones de datos, como el tamaño y color de los puntos que representan información adicional. Esto es útil para analizar datos multivariados en áreas como demografía, economía o astrofísica. También se exploran gráficos de líneas tridimensionales que conectan puntos para mostrar tendencias o evoluciones en el tiempo. Además, se simulan movimientos aleatorios, como el movimiento Browniano, para ilustrar comportamientos dinámicos en 3D. Finalmente, el contenido se enfoca en la personalización de gráficos, como el ajuste de colores, transparencias y ejes, junto con el uso de cámaras dinámicas que permiten explorar los gráficos desde diferentes perspectivas. Este enfoque combina teoría y práctica para enseñar cómo usar herramientas tridimensionales para visualizar y analizar datos complejos de manera efectiva.