9 de octubre de 2012

Diagrama de Bloques

Automatización y Control de Sistemas Dinámicos
Reporte 2

Representen el sistema que buscan controlar en el proyecto grupal a través de un diagrama de bloque.

En el Reporte 1 de hace algunas semanas, habíamos obtenido la función de trasferencia de nuestro sistema, en mi caso, estoy trabajando en el proyecto de modulación nivel de sonido en un altavoz, que depende del ruido de la sala en que te encuentres.

Antes de llegar a función de transferencia había partido del circuito creado suponiendo que se decide hacer el uso de Arduino como controlador de la planta.


Ya había mencionado en tal reporte que las dos funciones principales eran las del micrófono y la bocina que daban parte a la siguiente función de transferencia.

$\dfrac {Cs}{Rs} =\dfrac {Ri+L}{\dfrac {\dfrac {s^{2}}{w^{2}}} {\dfrac {s^{2}}{w^{2}}+\dfrac {s}{wQ_{TSA}}+1}}$

Y esta la podemos simplificar un poco para poder trabajar con ella y nos queda de la siguiente forma.

$\dfrac {Cs}{Rs} =\dfrac {(Ri+L) \left( \dfrac {s^{2}}{w^{2}} + \dfrac {s}{wQ_{TSA}} + 1 \right)}{\dfrac {s^{2}}{w^{2}}}$

La función de transferencia mostrada puede ser representada como un diagrama de bloque, el cual de una entrada se produce una salida, pero vamos a hacer el proceso inverso de la simplificación de diagrama de bloques, en el cual vamos a desarrollar todos los componentes de la planta.


Lo primero que se hace es quitar la división grande del único bloque, y según las reglas del álgebra de bloques, tenemos que una división resulta de una suma de la salida a la entrada del sistema, que se representa como sigue.


El siguiente paso es separar la multiplicación del bloque superior, y para esto se sabe que cuando es una multiplicación, los bloques se quedan en serie, por lo que esta parte es fácil de entender el resultado.


Ahora la sumas que tenemos en los bloques resultantes, es posible cambiarlos por puntos de suma, como bloques separados, pero sin perder el orden que se tenia de los elementos.


Falta tomar en cuenta que la entrada y la salida generada por la planta esta en función del tiempo, como se describió en el reporte anterior.

Y esta última imagen representa el diagrama de bloques de la función de transferencia.

Recursos consultados:
Simplificar Diagrama de Bloques
Álgebra de Bloques

8 de octubre de 2012

Proyecto de Redes Neuronales

Redes Neuronales Artificiales
Presentación Intermedia: Reporte y Programa

Este es el reporte de medio curso para la materia de Redes Neuronales Artificiales, en la cual estoy trabajando en el proyecto de Reconocimiento de Personas Mediante Voz, en conjunto con mis compañeros Cecilia Urbina y Roberto Martínez.

El objetivo del proyecto es que al final del semestre tengamos un sistema funcional que permita identificar si un usuario es el correcto o no, mediante su voz. Esto dentro de un sistema que muestre una ventana y que de un texto que tendrá que ser leído por la persona que intenta autentificarse, el audio es captado y analizado, y crea una entrada de datos a la red neuronal la cual se encargara de decir en su salida si el usuario fue identificado o no, y mostrar el resultado finalmente mediante una ventana.

Trabajo grupal


En la siguiente captura se muestran los commits realizados desde la semana en que conformamos el equipo, y con esto podemos crear evidencia del trabajo realizado. En base a esto explicaré que fue lo que se ha hecho en conjunto y lo que yo he hecho.



En las primeras semanas se trabajo conforme a lo que íbamos viendo en clase, que trataba de crear el programa que recibía desde línea de comandos entradas binarias, para el vector de entradas y creábamos el vector de pesos aleatorio. La modificación del primer código fue en base a lo que Cecilia trabajo en hacer una clase especial para lo que en un futuro sería la neurona simple.

Luego tuvimos algunas sesiones en las que trabajamos en conjunto en cuanto al aprendizaje de la neurona, hasta este momento no teníamos alguna forma de comprobar si lo que estábamos haciendo estaba bien o no. El código modificado fue subido en un commit mostrado con el nombre Equipo, para mostrar que ahí trabajamos todos.

En las semanas pasadas dividimos el trabajo para poder avanzar un poco más, entonces Cecilia se encargó de empezar con la interfaz de entrada y el pre-procesamiento del audio, yo me encargué de continuar con el código de la neurona, hacer que aprendiera y verificar que estaba funcionando como debería, Roberto se encargó de agregar el uso de Tkinter para poder visualizar el aprendizaje de la neurona, y la ventana que arrojará el sistema cuando lo demás este completo.

Código relevante


Los siguientes códigos son solo una fracción del código completo, para mostrar algunas partes elementales.

En la siguiente sección mostrada, es parte del código del programa generador, en este caso ya que nos enfocamos un poco para solo dos dimensiones, cuando se pide al programa que genere un numero de muestras para un vector de entrada de dos dimensiones con su salida esperada, este las crea y guarda en un archivo. Para poder determinar la salida se hace una comparación, pero para evitar que sea algo que siempre de el mismo resultado coloque dos variables de ruido esto con el fin de que la salida esperada de los vectores de entrada no siempre cree la misma gráfica dividida transversalmente.


La siguiente parte es solo la muestra resumida de lo que hace el código al mandarle los datos de entrada a la neurona y las operaciones que hace, para cuando modifique el código que habíamos trabajado en equipo esta parte sufrió grandes cambios ya que anteriormente no se había tomado en cuenta el umbral dentro del vector de pesos.


Aportes


En seguida concretizo el trabajo que realicé, en unas cuantas líneas:
  • Reestructurar el código de la clase Neurona.
  • Cambiar la entrada de datos a números flotantes.
  • Modificar la entrada manual de datos a la lectura de un archivo.
  • Corrección del método de aprendizaje.
  • Conteo de errores cuando se mantiene esta activo el método de aprendizaje.
  • Graficar la salida correcta de los datos creados por el generador con Gnuplot.
  • Graficar los datos obtenidos después del aprendizaje con la neurona.
  • Mejora del código después del agregado de visualización con Tkinter.
  • Corrección de bugs después del agregado de visualización.

Gráficas generadas con Gnuplot


Gráfica generada con los datos tal y como los crea el generador, esto sirve de referencia para saber si lo que la neurona hará tiene una salida semejante que divida las dos clases tal y como en la imagen.


Tomando los datos generados desde la neurona, podemos ver los puntos con salida esperada 0 y los puntos con salida esperada 1, y estos con un contorno de color verde cuando al momento de comparar la activación con cero, el resultado no dío igual que el esperado, y al final se pinta la línea creada con los datos arrojados por el vector de pesos.


Vídeo demostración


El siguiente vídeo muestra el funcionamiento de la neurona ya con interfaz gráfica con Tkinter y después de las correcciones aplicadas.

En el vídeo se muestra una terminal donde se ejecuta el programa generador de los vectores de entrada y su salida esperada, y luego se usan los archivos generados para correr el programa de la neurona, que inicia un proceso de aprendizaje, modificando el vector de pesos, para llegar a separar en dos clases los puntos con salida esperada 0 y los puntos con salida esperada 1.


Presentación en equipo


Integrantes del equipo:



20 de septiembre de 2012

Public-key Repository

Seguridad de la Información y Criptografía
Homework 5

The homework for this week is:
Implement a HTTP public-key repository for key exchange that employs RSA-based digital signatures.

My program is running in the web hosting Heroku. I used this host because it's free and I can write code in python. You can see the page in the next url:


The web page must be displayed like the next image:


How this work?


  • Imagine that you are in a Facebook chat, and you are talking with Alice. Then Alice start talking with you but saying strange things, so you aren't sure if is the real Alice.
  • Now you want to verify if is Alice or not, so you send a challenge in the chat.
  • Previously Alice, created a private and a public key for the RSA algorithm, and she is registered in a web service where the public key is stored.
  • Then you enter to the web service, send the challenge showed to Alice.
  • Alice use the script provided in the same web service.
  • In the script she write the x (challenge), her d, and her n. The script returns a response.
  • Alice send the response of the script to you via Facebook chat.
  • You write the response in the web service and click in the verify button.
  • The web service show if is the correct Alice or not.

Code


This is the script where the other person download for get the response:


The python script in the server:


And the template that I created for the page:


Screenshots


When the client don't write the response and click verify.


When the client write a text instead of a number in the response field.


When the verification fails.


Test


I test my app with Juan Espinosa.


And I verify if was the real Juan Espinosa, and was correct.


References:
RSA Algorithm - Elisa Schaeffer

16 de septiembre de 2012

Escribir Fórmulas con Lógica Predicativa

Verificación y Validación de Software
Entrada 6

Para esta semana hemos seleccionado un ejercicio del Capítulo 4: "The World According to Predicate Logic" del libro llamado "Logic in Action". El enlace al PDF se encuentra al final de esta publicación.

El ejercicio que seleccione trata de escribir la fórmula lógica predicativa de unas oraciones, pero para poder entender que es lo que tenía que hacer, el mismo libro tiene algunos ejemplos, por lo que me gustaría empezar mostrandoles esas oraciones y su respectiva fórmula.

Los ejemplos van desde el uso simple de cuantificadores, hasta las que usan cuantificadores múltiples dentro de la fórmula. Para todos se asume que el dominio son los seres humanos o personas.

Tenemos que:
∀, todos, para todos.
∃, alguien, por lo menos uno, algunos, algunas.
Wx, significa que una persona "x" camina (Walk).
Bx, evalúa si "x" es un niño (Boy).
Gx, evalúa si "x" es una niña (Girl).
Sxy,significa que "x" ve a "y" (Sees).

Después de definir estas fórmulas podemos ver los ejemplos:
Alguien camina: ∃xWx
Algún niño camina: ∃x(Bx ^ Wx)
Una niña ve a John: ∃x(Gx ^ Sxj)
Todos los niños caminan: ∀x(Bx ⇒ Wx)
Alguien ve a todos: ∃x∀ySxy

Después de ver estos ejemplos logre aclarar mi mente y empece a contestar mi ejercicio que es el siguiente.

Ejercicio 4.13
Escribe las siguientes oraciones a fórmulas de lógica de predicados. Suponga que el dominio del discurso son los seres humanos.

Necesitamos una expresión que evalúe si alguien ama a alguien, entonces denotamos Lxy, para una "x" que ama a "y", donde L es abreviación de "Love". Además de B y G, que ya mencione anteriormente que evalúan si se es niño o niña.


1. Algún niño no ama a todas las niñas. (Some boy doesn’t love all girls)

∃x(Bx ^ ∀y(Gy ^ ¬Lxy))

Se evalúa si algún "x" es un niño, y si para toda "y" que resulte ser niña, "x" no ama a toda "y".


2. Todo niño que ama a una niña es también amado por alguna niña. (Every boy who loves a girl is also loved by some girl)

∀x((Bx ^ ∃y(Gy ^ Lxy)) ⇒ ∃z(Gz ^ Lzx))

La primer parte es parecida al anterior, pero ahora se habla de "todo niño" lo que nos hace cambiar el cuantificador, y quitamos la negación en L, porque ahora se dice que el niño ama a la niña. Para la segunda parte se dice que el niño "x" es amado también por una niña, y necesitamos una variable más, porque la niña "y" que el niño "x" ama, puede no ser la misma niña que ama a ese niño "x". Se agrega el signo condicional entre las dos partes, ya que la primer parte implica que la segunda también sea cierta.


3. Toda niña que ama todos los niños no ama a todas las niñas. (Every girl who loves all boys does not love every girl)

∀x((Gx ^ ∀y(By ⇒ Lxy)) ⇒ ∀z(Gz ^ ¬Lzx))

Aquí la primera parte de la oración implica a la segunda, y se traduce como, toda niña "x" que ama a niños "y", entonces niña "y" no ama a niñas "z". Otra forma de entender la oración después de haberla escrito en fórmula lógica, es que si una niña ama a los niños, se sabe que esa niña no ama a las niñas.


4. Ninguna niña quién no ama a un niño ama una niña que ama a un niño. (No girl who does not love a boy loves a girl who loves a boy)

∀x(((Gx ^ ∀w(Bw ^ ¬Lxw)) ^ ∀y(Gy ^ ∃z(Bz ^ Lyz))) ⇒ ¬Lxy)

Gx ^ ∀w(Bw ⇒ ¬Lxw): una niña "x" que no ama a todo niño "w".
Gy ^ ∃z(Bz ^ Lyz): una niña "y" que ama a un niño "z".
¬Lxy: si los dos anteriores se cumplen, entonces la niña "x" no ama a la niña "y", y es ahí donde se aplica la negación que refiere a "ninguna niña" (ninguna niña "x" ama a niña "y").


Páginas consultadas:
The World According to Predicate Logic

13 de septiembre de 2012

Public Key Algorithms - RSA

Seguridad de la Información y Criptografía
Homework 4

The homework for this week was:
"Implement RSA authentication in Python for a client-server system with sockets."

I will describe what the code should do:
  1. The server open a socket, and wait for a client.
  2. The client start a session with the server.
  3. The server send a random "x" to the client.
  4. The client calculate a f(x) where the function can be anyone.
  5. Get from a user file the (d, n) previously created.
  6. Calculate r = (y^d)mod(n), and send it to the server.
  7. Send to the server the name of the current user and the r.
  8. The server receive the the data, and open a file with a list of all the users.
  9. The server find the correct public key (e, n) from the current user.
  10. The server calculate y = (r^e)mod(n) and get the same "y" that the client calculate.
  11. Verify if the "y" received is equal to f(x) in the server. (This is for authenticate the user)
  12. If the previous sentence was true, send to the client a verification message. (I send "OK" and the client print "Welcome")
  13. If not, close the connection. (My code send form the server "NO" and when the client receive this print "Something was wrong")

Generator of public and private keys



Server



Client



Execution


First of all the folder with the three python files.


I send an argument to the "create keys" program for create 5 users. Create one file per each user with the private key, and all the public keys for all the users are in the file "users".


When we want to run the programs, we need to open two terminals, one for the server and one for the client.

The client receive an argument that indicate the user to use in this running.


The numbers indicate what part of the list was mentioned in the first part in this post. Some numbers aren't in the same sequence that the list and others are omitted becasue the program do it internal and don't have a debug print.

Server:
[1] Socket opened
Sesion started
[3] Sended to the client x = 43
User name:  user3
And received r = 209263
[9] Public key: (349, 225391)
User accepted
Sesion closed
Client:
[2] Connected with the server
Current user:  user3
[5] Private key: (68117, 225391)
The server send me x = 43
[4] After the function f(x) = 1892
[6] My f(x) encrypted, r = 209263
[12] Welcome
Sesion closed
This is the file of user that the server use to find if the current user is allowed or not.


And the keys for the user that I used in the example. Check that the "n" is the same in the use3 in the previous image.


For the function of euclides(), I saw the pseudo-code of the reference [1], and for the gcd() I saw the pseudo-code from the book "Matematica Discreta - Richard Johnsonbaugh".

References:
[1] - Fundamentos matemáticos del método RSA

11 de septiembre de 2012

Modelo Matemático

Automatización y Control de Sistemas Dinámicos
Reporte 1

Para el primer reporte de la materia tenemos que modelar lo que se controlará en nuestro proyecto de equipo y tenemos que calcular la función de transferencia para la planta.

El proyecto en el que trabajaré con mi equipo es de ajuste de volumen. La idea es de controlar el volumen de sonido en una bocina o altavoz, de acuerdo al ruido que se encuentra en el entorno. Esto es que si tenemos reproduciendo una canción en un cuarto, y en determinado momento entra gente a platicar, el volumen del dispositivo que esta emitiendo el sonido de la canción, aumente paulatinamente para que se siga escuchando con igual fuerza la canción.

Un ejemplo práctico de donde se usa este tipo de sistemas, es en los automóviles, donde el volumen de la música dentro del auto aumenta cuando el motor emite mucho ruido, en cambio cuando este esta detenido, el volumen baja, esto con el fin de reducir problemas de audición para el conductor. También Apple, ya tiene patentado algo así para uso en iPods y Macbooks.


Circuito propuesto


La idea que tenemos para nuestro proyecto es que utilizando micrófono y altavoces de la computadora, como en la imagen anterior, podamos modelar el sistema, o que mediante un dispositivo externo conectado al equipo de sonido, logremos modificar el nivel de volumen. Aquí tengo un circuito suponiendo que hacemos uso de un Arduino como el equipo ya lo había propuesto.


Función de entrada


Como tenemos pensado, el dispositivo que nos dará una entrada al sistema será nuestro micrófono, que podríamos cambiar por un sensor que perciba niveles auditivos en decibeles, pero con un micrófono podemos medir cantidad de ruido, además de que en cuanto electrónica, es más barato comprar un micrófono que el medidor de decibeles.

La función que define la entrada de nuestro micrófono como sigue.

$Blv=Ri+L\dfrac {di} {dt}$
Donde:
$R$es la resistencia
$i$es la corriente
$Blv$voltaje inducido
$L\dfrac {di} {dt}$voltaje
$v =$$\dfrac {dy} {dt}$

Función de salida


Y tenemos también la función de salida de nuestra planta, que en este caso pertenece a la función de un altavoz. Esta la obtuve de un PDF mencionado al final, y esta es la función base, ya que existen algunas derivadas de esta que son usadas para mejora de sonido y amplificación.

En la salida de nuestro sistema controlaremos el sonido o volumen de reproducción de alguna canción.

$Hs=\dfrac {\dfrac {s^{2}}{w^{2}}} {\dfrac {s^{2}}{w^{2}}+\dfrac {s}{wQ_{TSA}}+1}$
Donde:
$s$variable de frecuencia compleja
$w$frecuencia angular
$Q_{TSA}$factor de calidad total

Función de transferencia

Sabemos que seguramente cuando analicemos en equipo la estructura de bloques que tendrá nuestra planta para la implementación física, podríamos agregar bloques intermedios que reduzcan el cambio repentino de volumen, pero por el momento solo considere las obvias y necesarias.

Por definición tenemos que la función de transferencia esta dada por la transformada de la entrada entre la transformada de la salida, y otra expresión también utilizada es la división de X entre Y.

$Gs =\dfrac {L[entrada]}{L[salida]} =\dfrac {Y(s)}{X(s)} $

Y sustituyendo nuestras funciones de entrada y salida nos queda lo siguiente, donde L significa la transformada de Laplace de la función contenida.

$Gs =\dfrac {L\left(Ri+L\dfrac {di} {dt}\right)}{L\left(\dfrac {\dfrac {s^{2}}{w^{2}}} {\dfrac {s^{2}}{w^{2}}+\dfrac {s}{wQ_{TSA}}+1}\right)}$

Entre platicas con mi equipo hemos pensado acerca de los datos que nos estará arrojando el micrófono, creemos que las funciones que estarán en nuestro sistema serán puramente lineales, dependiendo de como tengamos que manipular los datos de entrada.

Referencias:
Sonido y Acústica - INACAP
Modelo de un Micrófono
Funciones de transferencia - ITESCAM
Función de transferencia del sistema altavoz-caja

9 de septiembre de 2012

Lógica Predicativa

Verificación y Validación de Software
Entrada 5

Para esta semana la tarea es del tema de lógica predictiva, y para esto tenemos un par de enunciados que debemos expresar mediante lógica de predicados y deducir una conlusión.

El ejercicio que yo seleccione es el número 91 de la página 106 del libro "Symbolic Logic" de Lewis Carroll. Al final se encuentra el enlace a la versión en línea del libro.

Los enunciados originales son los siguientes:

All clear explanations are satisfactory.
Some excuses are unsatisfactory.

Y al español las podemos traducir como:

Todas las explicaciones claras son satisfactorias.
Algunas excusas son insatisfactorias.

Las expresiones que usé son las siguientes.

C(x): clear explanations, explicaciones claras
S(x): satisfactory, satisfactorias
E(x): excuses, escusas

Para este caso podemos denotar a x como un comentario cualquiera, y que puede ser evaluado como una explicación o una escusa, o determinar si ese comentario es satisfactorio o no.

Los cuantores usados son los siguientes.

∀: Todos, para todos
∃: Por lo menos uno, algunos, algunas

Ahora vamos a escribir los enunciados con cuantores lógicos y usando las expresiones mencionadas.

  • Todas las explicaciones claras son satisfactorias.

  • ∀x C(x) ⇒ S(x)

  • Algunas excusas son insatisfactorias.

  • ∃x E(x) ⇒ ¬S(x)

    Ahora podemos usar equivalencias lógicas de los cuantores para poder llegar a la conclusión, e inclusive es fácil hacerlo con sentido común. Podemos entender del segundo enunciado que algunas escusas no son satisfactorias, pero es posible encontrar escusas que son satisfactorias.

    Sabemos del primer enunciado que toda explicación clara es satisfactoria, entonces como no todas las excusas son satisfactorias, sabemos que no todas las escusas son explicaciones claras.

    La conclusión es:

    Algunas excusas no son explicaciones claras.

    Lo mismo pero en inglés:

    Some excuses are not clear explanations.

    Y escrito con expresiones lógicas:

    ∴ ∃x E(x) ⇒ ¬C(x)

    Fuentes consultadas:
    Symbolic Logic By Lewis Carroll
    Lógica Predictiva - Elisa Schaeffer