miércoles, 30 de abril de 2014

Lenguaje de Programación C

C es un lenguaje de programción creado en 1972 por Dennis M. Ritchie y también Kernighan, en los Laboratorios Bell (La electrónica moderna se desarrolló en gran parte en estos laboratorios). 

Es un lenguaje que permite acceder al hardaware por lo que es usado ampliamente en la creación de sistemas operativos (GNU-Linux, Windows, OSX)  y en sistemas embebidos que usan microprocesadores (celulares, dvds, etc). 

Se creo pensando en que sirva para cualquier plataforma o arquitectura y en lo posible facilmente portable, por ejemplo que el código que sirve para leer un dvd en un computador sirva para el reproductor de dvd conectado al televisor.

Es un lenguaje de programación estructurada, por lo que tiene subrutinas (llamadas también funciones o métodos), bloques condicionales y bucles. Se espera que cada linea de código se ejecute inmediatamente después de la anterior a menos que se llame a un subrutina. Esto a diferencia que en ensamblador existe el comando goto que permite ir a cualquier linea del programa pero puede causar errores si no se llega a la linea correcta.  El llamado a subrutinas permite también realizar programación funcional.   
Para la programación orientada a objetos (POO) se creo C++. Actualmente JAVA que imita bastantes características de C++ es más usado en POO.


Entre las principales características de cualquier programa escrito en C están:

  • La inclusión de bibliotecas( librerías , cabeceras):

#include <stdio.h> /*añade un librería que se encuentra en la carpeta por default, suelen ser las mas usadas*/ 
#include "micarpeta/milibreria" /*añade una librería que se encuentra en otra carpeta del programador.*/

  • La definición de contantes y macros:
#define hola hello //reemplaza todos los "hello" por "hola" en todo el código a continuación. 
#define pi  3.141592 //reemplaza la palabra pi por su valor numérico.
#if, #else, #elif, #endif    /*sirven para crear bloques condicionales para que el codigo sea distinto segun ciertas condiciones de la pataforma pero se encuentre en un solo archivo de codigo fuente*/ 
#ifdef, #ifndef   /*comprueba si se ha definido una constante o nombre, se usa para lo mismo que las cuatro anteriores. */


  • La declaración de funciones:

void main(); /*Una función que no devuelve ningún valor y no necesita ningún valor de entrada. */
int suma(int sumando_a, int sumando_b); /*Una función que devuelve un valor entero y necesita como argumentos dos valores enteros.*/


  • La declaración de variables: 
Se declaran usando la sintaxis: tipo nombre;


int a; //una variable numérica entera. 
char b; //una variable numérica de 0 a 256 usada generalmente para representar texto en ascii. 
float c; //una variable numérica decimal. 

Si se declaran antes de la función main() son llamadas variables globales, las declaradas dentro de cada función son variables locales. Una buena practica es colocar nombres distintos a las globales de las locales para corregir errores con mayor facilidad.


  • El código de las funciones :
Ejemplo: Para la función "suma" declarada arriba el código sería:

int suma(int sumando_a, int sumando_b){ 
int resultado=sumando_a+sumando_b; /*Se puede asignar valor a las variables en su declaración */ 
return resultado; /*toda función no declarada como void necesita tener al menos un sentencia return */  
}
Recordar: Toda sentencia termina con " ; ".


  • La función principal main():
Todo programa escrito en C, necesita por lo menos la función main() para ejecutarse (funcionar).


  • La función if: 
Se usa para realizar condicionantes: Si x entonces y, caso contrario z. No necesariamente se usa el caso contrario. 
  
if (a<b) {  
//Lo que tiene que suceder si en efecto "a" es menor a "b" 
} 
else { 
// Lo que tiene que suceder si "b" es menor o igual a "a" 
}

  • La función switch:
Se usa si una variable puede tener múltiples valores y cada valor necesita una distinta acción a realizar.

switch (x){ 
case 1: //Lo que debe suceder si x es 1;  break; 
case 2: //Lo que debe suceder si x es 2;  break; 
default: // Lo que debe suceder si x no es 1 ni 2;  break;  
}
  • La función while:
Se usa para repetir un bloque de sentencias (lineas de programa) hasta que se cumpla una condición. Se puede usar while(1) para crear un bucle infinito. (La mayoría de programas embebidos corren desde que se prende el equipo hasta su apagado)   

int y=0; 
while(y<10){ 
//Esto se repetirá 10 veces; 
y++; /*Una forma de hacer y=y+1, en este caso se suma al después de la linea, ++y suma antes de realizar el resto de lo que se encuentre en la misma linea. Existen ademas y--, --y */ 
}

  • La función for:
Se usa para repetir un bloque de sentencias un numero definido de veces o para cambiar secuencialmente de valor una variable. El uso de arreglos hace inevitable el uso de la función for.

for (int i=0; i<10; i++){ 
//Esto se repetirá 10 veces 
}

El código de ejemplo de la función while y la función for hacen exactamente lo mismo pero con for resumimos en una linea lo escrito en tres con while. La función while en la practica se usa para condiciones mas complejas.


  • Comentarios
Si todo lo que esta despues de // si ocupa solo una linea o dentro de /* */ para comentarios de varias lineas.
Es una buena practica iniciar el programa con: 

/* Nombre del archivo: 
Proyecto o Programa principal al que pertenece:
Descripción básica:  
Autor:
Licencia: 
Fecha de creación:
Fecha de modificación: 
Logotipo en Ascii "|\/| (()) ~|~ [[-" ;-D, existen verdaderos artistas en esto. No es necesario pero le da un toque de dedicación y originalidad.   */

domingo, 27 de abril de 2014

Modelos Matemáticos VI: Aproximaciones

Hasta ahora hemos revisado como se puede expresar en lenguaje matemático hechos simples y cotidianos como el de una compra en una tienda, el movimiento de un objeto, la lotería, etc. También se dijo de manera breve como se modelan fenómenos que recién han empezado a comprenderse desde el siglo pasado. Pero algo más que se revisó fue la capacidad de digitalizar o discretizar los hechos para de esa manera obtener información, y a esta almacenarla y procesarla de forma mucho más fácil que si lo hiciéramos sobre tal cuál es.

Pues también existen formas de simplificar fórmulas matemáticas. O mejor dicho de aproximarse lo más posible sin perder sus características principales Uno de sus usos actuales es simplificar las operaciones de un computador. Sin embargo muchos hombres encontraron algunas de ellas antes del invento de cualquier calculadora o computador.

Series
Una de las formas de acercarse a una expresión matemática es mediante series, que no son más que sumas de varias cantidades. Para entender las series por lo general se explican primero las sucesiones, la más simple es la que usamos para contar: 1, 2, 3, 4, ....
Puede darse otro ejemplo como la sucesión de los múltiplos de 5: 5, 10, 15, 20, ....
Como se ve en los ejemplos una sucesión no es más que una lista ordenada de elementos, además estos pueden estar relacionados entre sí o no.

Aplicaciones: Resulta que los datos almacenados en un computador son una sucesión, la palabra "hola" está en algún lugar de la memoria de la siguiente manera: 'h', 'o', 'l', 'a' y es posible verla en la pantalla pues el programa accede a la memoria y recupera los datos en ese orden y es distinta a 'a', 'h', 'l', 'o' que es una palabra que no existe pero tiene los mismos elementos (Y se nota además que las palabras son sucesiones finitas cuyos elementos son las letras del idioma).  Se puede decir que en general toda señal digital y todo lenguaje humano es una sucesión.

Si se suman los elementos de una sucesión se obtiene una serie, una de las famosas es la serie de Sissa, inventor del ajedrez. Dice la leyenda que  el rey le ofreció 1 grano de trigo por la primera casilla, 2 por la segunda, 4 por la tercera, 8 por la cuarta y así sucesivamente hasta completar las 64 casillas. Resultado: Es imposible pues como detallan aquí, se necesitarían 907 cosechas anuales mundiales de trigo para pagar lo ofrecido.


Este tipo de series se conocen como divergentes, pues al sumar un término más de la sucesión el resultado cambia bastante en relación al resultado sin sumar ese último término.

Pero que pasa con la misma serie inversa a la de Sissa, es decir tomar y sumar 1+ 1/2 + 1/4 + 1/8+... . Pues que el resultado a medida que sumamos más términos se acerca más y más a 2. A este tipo de series se les llama convergentes pues la suma de más términos hace que se llegue más cerca de único resultado.


Y son de este tipo de series las conocidas como Serie de Taylor y Serie de Fourier.

Serie de Taylor
La serie de Taylor básicamente lo que hace es aproximar una función matemática (expresión en la cual existen variables que al darles un valor dan un valor a la función ) cualquiera en un polinomio. Sus términos dependen de las sucesivas derivadas de la función original , que en un solo punto pasan a ser valores fijos o constantes llamados coeficientes, y  la "x" continua como variable pero en cada término aumenta su potencia a la cual esta elevada (llamada también grado). Una serie de Taylor es un serie de potencias.

  f(x) = f(a)
  + \frac{f'(a)}{1!}(x - a)
  + \frac{f^{(2)}(a)}{2!}(x - a)^2
  + \cdots
  + \frac{f^{(n)}(a)}{n!}(x - a)^n
  + R_n(f)


El polinomio puede parecer que no reduce en realidad a la función sino que mas bien la agranda en infinitos términos, pero la verdadera utilidad esta en que un computador puede hallar las raíces de una función o el valor aproximado de la derivada de la función en el punto "a" con solo los dos primeros términos de la serie.
Además el tomar solo los dos primeros términos hace que la función, sin importar que complicada esta sea, se vuelva lineal, es decir solo contiene "x" sin elevar a ninguna potencia y esto es muy importante pues existe muchísima teoría matemática que toma como principio la linealidad y muchas veces se requiere linealizar para llegar a una solución mucho más rápido.

Hablando de lo mismo, el estudio de líneas rectas es más sencillo que de las curvas, a pesar de existir métodos, ecuaciones y funciones para líneas curvas, estas pueden tener muchísimas formas como para generalizar esos métodos, es más fácil dividirla en muchas pequeñas líneas rectas formando una serie de líneas rectas.




Serie de Fourier
 La serie de Fourier es al igual a la de Taylor un polinomio que expresa una función, pero lo hace en términos de otras funciones, seno y cosenos. Una particularidad es que la función debe ser periódica, es decir que el valor de la función en un punto "a" sea el mismo en el punto "a+T" y en "a+2T", "a+3T", etc. Donde T es el período y 1/T es la frecuencia principal.  Los coeficientes son ao, y los distintos  an y bn. Como el coseno y el seno tienen como argumento a n/T, son senos y cosenos de múltiplos de la frecuencia principal.
La letra que parece "E" se llama epsilon y en su forma mayúscula sirve para representar sumas sucesivas. En este caso la suma empieza en n=1 y va sumando todos los términos que surgen de ir aumentando n hasta "llegar" al infinito.
f(t) \sim \frac{a_0}{2} + \sum_{n=1}^\infty\left[a_n\cos\frac{2n\pi}{T}t + b_n\sin\frac{2n\pi}{T}t\right]
La utilidad de las series de Fourier esta en que muestra que cualquier función peródica no tiene una sola frecuencia sino varias, a menos que se un simple seno o coseno. 

Representación gráfica de las series de Fourier. A medida que se aumentan los términos mas se parece la serie a la función original

En los procesos naturales es muy común los ciclos repetitivos en el tiempo es por eso que la función se le ha denominado f(t) y no f(x) donde "t" representa al tiempo . Esto es importante en comunicaciones donde todo se trabaja en frecuencias, seguramente conoces a alguna estación de radio más por su frecuencia que por su nombre o quizás como estrategia su nombre es su frecuencia. Pero como no todo es periódico se necesitaba algo que logre pasar más funciones en términos de su frecuencia, para esto existen las transformadas pero eso es otro tema.

Por último la "verdad" puede ser vista como una serie, donde los coeficientes dependen de la confianza que tenemos a la fuente que representa cada término. Un concepto parecido a este se usa en redes neuronales en el perceptrón, modelo mtemático más simple de una neurona, es la suma de distintas características multiplicadas por distintos pesos (coeficientes) nos indica a que clase pertenece el sujeto de quienes son las características analizadas al compararlas con un valor umbral. Así si el valor supera al umbral se considera de una clase (verdadero) y si no de la otra clase (falso). Pero esto también es otro tema.