lunes, 22 de noviembre de 2010

Lenguajes orientados a objetos

Los lenguajes orientados a objetos son los que implementan las características de la programación orientada a objetos.
Los conceptos definidos o las características de la programación orientada a objetos no son una condición para que a un cierto lenguaje se le pueda llamar lenguaje orientado a objetos. Existen algunos conceptos de la programación orientada a objetos que pueden no estar presentes en un cierto lenguaje, pero sin embargo esto no quita que este lenguaje deje de ser un lenguaje orientado a objetos.

Puede ser que las condiciones que son mínimas pero necesarias las provea el formalismo, el cual modela mejor las propiedades de un sistema orientado a objetos, dichas propiedades son: los tipos de datos abstractos.
Cualquier lenguaje que permita definir tipos de datos, y operaciones nuevas sobre estos tipos de datos y además que permita realizar instancias a los tipos de datos, se puede considerar como un lenguaje orientado a objetos.

Como el mismo nombre lo indica, un lenguaje de programación orientado a objetos se basa en la idea de un objeto, que es la combinación de métodos y variables locales, formando una entidad de programación.

Algunos de los lenguajes orientados a objetos:
  • Python
  • C++
  • Java
  • Smalltalk
  • COBOL
  • PHP 5
Ciertas Ventajas de un lenguaje orientado a objetos:
  • Induce a la re utilización del código
  • Admite la creación de sistemas mas complejos
  • Vinculación del sistema al mundo real
  • Posibilita la creación de programas visuales
Conceptos básicos del modelo orientado a objetos

Objetos
Todo un programa esta compuesto en base por varios componentes y dichos componentes son los objetos, en sí cada objeto tiene su función especifica en dicho programa y además todos los componentes (objetos) pueden comunicarse entre ellos de formas predefinidas.

Los objetos tienen características y comportamientos. Las características las tienen mantenidas en una o mas variables y los comportamientos los implementan con métodos. Dichos métodos son subrutinas que están asociadas a los objetos.

Cuando a las características del objeto les damos valores, se dice que el objeto tiene estados. Dichos estados son almacenados en un momento determinado por las variables.

Clase
En sí una clase es un modelo, prototipo o plantilla genérica para un conjunto de objetos con características parecidas (similares).
También es un modelo que define las variables y lo métodos que son similares a todos los objetos de una clase.

Hay otra formar de llamar a un objeto de una clase en particular y esto es, instancia de una clase, es decir objeto e instancia son representación de una clase en particular. Es decir, entre objeto e instancia no hay diferencia.

Herencia
La herencia consiste en que una clase puede heredar sus variables y sus métodos a varias subclases. La clase que hereda es llamada super clase o también clase padre. Esto quiere decir, que una subclase además de tener sus atributos y métodos propios, también tiene los atributos y métodos que son heredados por la clase padre. Y así se crea una jerarquía de herencia.

Se puede tener una jerarquía de clases grande, por ejemplo:

En donde Clase A es la clase padre de B. Clase B es la subclase de A. La clase B es la clase padre de C, D y E. Y C, D y E son las subclases de B.

Envío de mensajes
Los objetos interactúan entre si, por medio de los mensajes.

Características que son asociadas a la POO (Programación Orientada a Objetos)

Abstracción
La abstracción consiste en abstraer las características esenciales y similares de un objeto.

Encapsulamiento
El encapsulamiento consiste en unir las variables y los métodos de una clase, es decir, se tiene todo esto en una sola entidad.

Ocultamiento
El ocultamiento consiste en ocultar los detalles internos de una clase y solo exponer los detalles que son necesarios para el resto del sistema.
El ocultamiento permite la restricción y el control del uso de una clase. El ocultamiento permite la restricción porque habrá cierto contenido del comportamiento de la clase, que no podrá ser accedido por otras clases. Y también el ocultamiento permite el control de uso de una clase porque se darán mecanismos para modificar el estado de la clase.


Referencias

Saludos.


Lenguaje FORTRAN

Como anteriormente mencione FORTRAN es un lenguaje muy potente y es el primer lenguaje científico que fue desarrollado enlos últimos años de la década de los 50. En Unix tradicionalmente los programas en FORTRAN se escriben con la extensión .f, por ejemplo, supongamos que un programa se llama prueba, entonces será prueba.f

VARIABLES EN FORTRAN
Al comienzo de un programa en FORTRAN, se declararan las varibles, de la manera siguiente:
TIPO VARIABLE.

Los tipos de variables son:

INTEGER (para números enteros, es decir, sin decimales).
REAL (para números decimales y exponenciales).
CHARACTER (esta variable va seguida de *n, que es el número de caracteres que permitirá la variable)

Depende de la precisión que se desee de las variables, la forma en que serán declaradas, es decir, si se desea que una variable entera y una variable decimal, seán de simple precisión (de 4 bytes), entonces se declararán así:
INTEGER *4 VARIABLE
REAL *4 VARIABLE

Pero si se desea que la variables tengan una doble precisión(8 bytes), entonces se declarán así:
INTEGER *8 VARIABLE
REAL *8 VARIABLE

ENTRADA Y SALIDA DE DATOS
Ahora, para imprimir en pantalla cualquier oración, se escribe PRINT*,
Hay otra forma para imprimir en pantalla, la cual es WRITE(*,*)
Para leer algún dato que el usuario introduzca, se utiliza, READ(*,*)

BUCLE DO
La sintaxis de este bucle es muy sencilla, dicha sintaxis es la siguiente:
DO índice = valor inicial, valor final

...

END DO

CONDICIÓN IF

La sintaxis de esta condición es:

IF(condición) THEN

...

END IF

En la condición del if van ciertos operadores, los cuales son:
.EQ. : igual a
.LT. : menor que
.GT. : mayor que
.LE. : menor o igual que
.GE. : mayor o igual que
Es muy sencillo utilizar estos operadores en la condición del IF, por ejemplo supongamos que queremos comparar las variables A y B, con los distintos operadores, entonces lo que haremos será lo siguiente:

IF(A.EQ.B)THEN
...
END IF


IF(A.LT.B)THEN
...
END IF



IF(A.GT.B)THEN
...
END IF



IF(A.LE.B)THEN
...
END IF


IF(A.GE.B)THEN
...
END IF

Referencia
FORTRAN


Saludos.

Presentación Tipos de datos (Presentación #4)

Bueno, aquí les muestro mi video de la presentación de tipos de datos, con aplicación al tema que yo seleccione, el cual es boletos de avión.



Bueno, disculpen en donde me salgo de la presentación en un momento, es que moví mal el mouse.

Presentación para descargar aquí

Saludos.

domingo, 21 de noviembre de 2010

Lenguajes Imperativos (Reporte #7)

FORTRAN
Fortran es un lenguaje de programación muy potente además de ser el primer lenguaje científico. Su desarrollo due en los últimos años de la década de los 50. Fortran es un lenguaje compilado, es decir, que los programas creados en el, deberán ser traducidos a lenguaje máquina mediate la compilación.
La extensión de los progamas de Fortran en Unix tradicionalmente es .f.

El programa que realice en Fortran es sencillo y lo llame edad.f, lo que realiza este programa es que de acuerdo al año de nacimiento del usuario y el año actual (información que introducirá el usuario), se imprimirá la edad del usuario y también se imprimirá si es un niño, adolescente, joven o adulto.

Código
INTEGER NAC, ACT, EDAD

WRITE(*,*) 'Ingresa el año de tu nacimiento:'
READ(*,*)NAC
WRITE(*,*) 'Ingresa el año actual:'
READ(*,*)ACT
EDAD = ACT - NAC
IF(EDAD.GE.6)THEN
IF(EDAD.LE.12)THEN
WRITE(*,*) 'Eres un niño de edad: ', EDAD
END IF
END IF
IF(EDAD.GT.12)THEN
IF(EDAD.LT.18)THEN
WRITE(*,*) 'Eres un adolescente de edad: ', EDAD
END IF
END IF
IF(EDAD.GE.18)THEN
IF(EDAD.LT.25)THEN
WRITE(*,*) 'Eres un joven de edad: ', EDAD
END IF
END IF
IF(EDAD.GE.25)THEN
IF(EDAD.LT.60)THEN
WRITE(*,*) 'Eres un adulto de edad: ', EDAD
END IF
END IF
END
Bueno, hay algo muy importante que mecionar, y esto es que al realizar un programa en Fortran se tendrán que pasar espacios, antes de comenzar a escribir el código, es decir se tabulará cada línea. Si no se realiza esto, entonces el programa no se podrá compilar, ya que esto me sucedía a mi hasta que pase espacios y asi el programa pudo ser compilado.

Bueno, comencé declarando las varibles como enteras mediante INTEGER.
Después pido al usuario que introduzca su año de nacimiento y el año actual y después con esos datos se obtiene la edad del usuario y de acuerdo a la edad se entra en las diferentes condiciones para imprimir si es un niño, adolescente, joven o adulto.

Write(*,*), se utiliza para imprimir y Read(*,*) para leer un dato que el usuario introduzca.
Como vemos utilice varios IF, cuya sintaxis es: IF(condición)THEN ... END IF

En la condición de cada IF utilice varios operadores matemáticos, es decir, utilice: .GE. .LE. .GT. y .LT. Estos operadores quieren decir lo siguiente:
.GE. : mayor o igual que
.LE. : menor o igual que
.GT. : mayor que
.LT. : menor que

También hay otro operador para la condición igual que, el cual es .EQ.
El programa termina con END

Para compilar este programa, tecleamos en la terminal (si tenemos instalado Fortran):
gfortran edad.f
Y después de ser compilado lo ejecutaremos escribiendo en la terminal:
./a.out
Aquí les coloco las imagenes de la ejecución de cada condición.


Si es un niño

Si es un adolescente
Si es un joven

Si es un adultoC
El lenguaje de programación C fue creado en el año 1972. Es una evolución del lenguaje anterior B. Fue creado por Dennis M. Ritchie. La extensión de los programas en C es .c

Bueno, el programa que realice en C, al cual llame cadmay.c determina si una cadena introducia por un usuario es igual, mayor o menor a la segunda cadena que el usuario deberá introducir.

Código
#include<stdio.h>
#include<string.h>

int LongCadena1, LongCadena2;
char Cadena1[50];
char Cadena2[50];

int main(int argc, char *argv[]){
printf("Introduce la primera cadena: ");
gets(Cadena1);
printf("Introduce la segunda cadena: ");
gets(Cadena2);

LongCadena1 = strlen(Cadena1);
LongCadena2 = strlen(Cadena2);

if(LongCadena1 == LongCadena2){
printf("La cadena %s es de la misma longitud que la cadena %s \n", Cadena1, Cadena2 );
}
else if(LongCadena1 > LongCadena2){
printf("La longitud de la cadena %s es mayor que la de la cadena %s \n", Cadena1, Cadena2);
}
else{
printf("La longitud de la cadena %s es menor que la de la cadena %s \n", Cadena1, Cadena2);
}


}

Para las cadenas que fueran introducidas por el usuario, utilice arreglos. Utilice la función gets para que las cadenas fuesen leídas. Primero se pide al usuario que introduzca la cadena 1 y la cadena 2, después mediante la función strlen se mide la longitud de cada cadena, luego estas 2 longitudes son comparadas mediante if-else. Dependiendo de como sea la longitud de las cadenas, será lo que se imrpimirá, es decir si son iguales, si la primera es mayor a la segunda o viceversa.
Para compilar este programa escribimos en la terminal:
gcc cadmay.c
Y para ejecutarlo, escribimos:
./a.out
Y aquí les muestro las imagenes de la ejecuión de este programa, de cada condición.

Si las cadenas son iguales
Si la cadena1 es mayor a la cadena2
Si la cadena1 es menor a la cadena2

PASCAL
El lenguaje de programación Pascal, es un lenguaje que fue desarrollado en los años de 1968 y 1969, peor fue hasta el año de 1970, que fue publicado. Fue creado por el profesor Niklaus Wirth. Pascal es un lenguaje imperativo que facilita la utilización de la programación estructurada, además los tipos de las variables que se utilizarán en los programas realizados en este lenguaje, deberań ser declarados antes de ser utilizadas (las variables).
La extensión de los programas es .pas ó .p

El programa que realice en Pascal lo llame convmet.pas y lo que hace es convertir metros a diferentes unidades con el uso de un tipo switch en C.
Convierte metros a pulgadas, a kilometros, a pies y a centímetros.

Código
program convmet;
var metros, km, pulg, pies, cm : real;
var op : char ;
begin
writeln(' ==================');
writeln(' Conversiones');
writeln(' ==================');
writeln('A cual opcion deseas convertir los metros 1)Pulgadas, 2)Kilometros, 3)Pies, 4)Centimetros ');
readln(op);
Case op of
'1' : begin
writeln('*Metros a Pulgadas*');
writeln('Ingresa los metros a convertir: ');
readln(metros);
pulg := metros * 39.3700787;
writeln('Convertidos a pulgadas son: ', pulg)
end;
'2' : begin
writeln('*Metros a Kilometros*');
writeln('Ingresa los metros a convertir: ');
readln(metros);
km := metros * 0.001;
writeln('Convertidos a kilometros son: ', km);
end;
'3' : begin
writeln('*Metros a Pies*');
writeln('Ingresa los metros a convertir: ');
readln(metros);
pies := metros * 3.2808399;
writeln('Convertidos a pies son: ', pies);
end;
'4' : begin
writeln('*Metros a Centimetros*');
writeln('Ingresa los metros a convertir: ');
readln(metros);
cm := metros *100;
writeln('Convertidos a centimetros son: ', cm);
end;
end;


end.

Como vemos declare las variables con su tipo de dato. Dichas variables de declaran así:
var nombrevariable : tipodedato;

El programa comienza con begin y termina con end.. Primero se pide al usuario la opción que quiere elegir. Para esto utilice writeln. Pero para imprimir se utiliza write y si se desea imprimir una línea después de lo que haya impreso, entonces se utiliza writenl. Después con read(op) se lee el número de la opción que el usuario introdujo, y mediante Case op of, se entra a la opción que el usuario ingreso., Cada caso se comienza con begin y termina con end; Dentro de cada caso coloque la operación a realizar, es decir, las conversiones de unidades. La sintaxis para dichas operaciones y también para las asignaciones es resta:=num1-num2.

Para compilar este programa escribimos en la terminal (si tenemos instalado Pascal):
fpc convmet.pas
Y para ejecutarlo lo siguiente:
./convmet
Aquí les muestro las imagenes de cada opción.


Metros a pulgadas

Metros a kilometros

Metros a pies

Metros a centímetrosBASIC
BASIC es un lenguaje de programación cuyo acrónimo es Beginners All-purpose Symbolic Instruction Code, que en español significa: código de instrucciones simbólicas de propósito general para principiantes.
Este lenguaje fue inventado en el año de 1964 por Jhon George Kemeny y Thomas Eugene Kurtz. Fue desarrollado originalmente como una herramienta de enseñanza.
Laextensión de los programas en BASIC es .bas

Bueno el programa que realice en BASIC es secillo y lo llame volumen.bas, ya que determina el volumen de 3 figuras geométricas (esfera, cubo y cilindro). De acuerdo a la opción que el usuario eliga, será el volumen que se obtendrá.

Código

DIM vol AS SINGLE
DIM op AS INTEGER
DIM r AS SINGLE
DIM l AS SINGLE
DIM h AS SINGLE

INPUT "Ingrese el numero de opcion 1)Esfera, 2)Cubo, 3)Cilindro: ", op

IF op = 1 THEN
INPUT "Ingresa el radio de la esfera: ", r
vol = 4/3 * 3.141592 * r * r * r
PRINT "El volumen de la esfera es: ", vol
END IF

IF op = 2 THEN
INPUT "Ingresa el lado del cubo: ", l
vol = l*l*l
PRINT "El volumen del cubo es: ", vol
END IF

IF op = 3 THEN
INPUT "Ingresa el radio del cilindro: ", r
INPUT "Ingresa la altura del cilindro: ", h
vol = 3.141592 * r * r * h
PRINT "El volumen del cilindro es: ", vol
END IF

END
Primero declare las variables que utilice, dichas variables se declaran así: DIM variable AS TIPO
Después mediante INPUT le pido al usuario que elija la opción. INPUT imprime y lee un dato al mismo tiempo.
Y luego, de acuerdo a la opción que el usuario eligiera, se entra a las condiciones, es por eso que utilice IF. La sintaxis del IF es:
IF condición THEN
...
END IF

Dentro de cada IF pedi al usuario los datos necesarios para obtener el volumen de la figura que eligió, y dentro del mismo IF, coloque la operación a realizar.

El programa termina con END, mas no es obligatorio escribir esto al termino de un programa.
END es solo para que el programa se note mas claro.

Bien, ahora para compilar este programa escribimos en la terminal (si tenemos instalado BASIC):
fbc volumen.bas
Y para ejecutarlo:
./volumen
Ahora, aquí les coloco las imagenes de las diferentes opciones.

Esfera
Cubo

Cilindro
Bueno estos son los programas que realice como reporte, gracias por su atención.

Referencias
FORTRAN
C

martes, 16 de noviembre de 2010

Lenguaje Funcional R (Problemas de Distribución)

Como ya sabemos R es un lenguaje funcional, es decir, es un lenguaje basado en funciones. Bueno en R hay demasiadas funciones, que son muy útiles y entre ellas encontré las funciones para calcular ciertas distribuciones que se ven en la materia de probabilidad y estadística, como lo son:
  • La Distribución Binomial.
  • La Distribución Hipergeométrica.
  • La Distribución Normal.
Las primeras dos distribuciones de probabilidad, están clasificadas por ser distribuciones discretas, es decir que la variable aleatoria toma valores enteros. Y la distribución normal esta clasificada por ser una distribución continua.

Bueno, la distribución de probabilidad, de una variable aleatoria es una función que asigna a cada suceso sobre dicha variable, la probabilidad de que este suceso ocurra.

Es muy sencillo aplicar las fórmulas de cada una de estas tres distribuciones a un problema, pero para poder entender lo que haré en R, hay que entender primero los datos de las fórmulas de cada Distribución y su solución escrita.

Bien, la Distribución Binomial, solo tiene dos resultados, el éxito y el fracaso. El éxito está representado por p y el fracaso por q. Se debe saber que una probabilidad esta dada de 0 a 1, es decir, una probabilidad no puede ser mayor a 1, ni menor a 0. Además p + q = 1, en donde 1 es la unidad (es la mayor probabilidad).

La fórmula para calcular la probabilidad binomial está dada por:
En donde:
X = es la variable aleatoria que sigue una distribución binomial.

x = es el valor que toma la variable aleatoria.

n = es el tamaño de la muestra.
C = combinaciones.p = probabilidad de éxito.
q = probabilidad de fracaso.


Bueno, ahora resolveré un problema de distribución binomial, mediante una explicación y mediante una función en R.

Problema de Distribución Binomial
El porcentaje de artículos defectuosos fabricados por una máquina es del 20%. En una muestra de 12 artículos seleccionados al azar, fabricados en esa máquina, encontrar o calcular las siguientes probabilidades:
a) de que ninguno sea defectuoso.
b) menos de 3 sean defectuosos.

c) más de 3 pero menos de 7 sean defectuosos.
d) como mínimo, 4 sean defectuosos.


a) De que ninguno sea defectuoso, esto dignifica que haya 0 artículos defectuosos, en este caso x toma el valor de 0 y calculamos esta probabilidad con el uso de la fórmula, es decir, solo sustituiremos los valores siguientes en la fórmula.

p(x = 0) = 0.0687
x = 0
p = 0.20 (esto es del 20%)
q = 0.80

n = 12


En R hay la función que te calcula la probabilidad binomial es pbinom(). Dentro de los () va x, n, p, es decir, (x, n, p).
Bueno para resolver este inciso en R, colocamos en la terminal R (si lo tenemos instalado), y después colocamos:
pbinom(0, 12, 0.20)
Y presionamos enter, y el resultado obtenido es: 0.06871948.
Aquí les muestro la imagen de este inciso.

b) Menos de 3 sean defectuosos, es decir, que solamente 2 sean defectuosos, entonces al utilizar la fórmula tendremos que obtener la probabilidad de x = 0, x = 1 y x =2 y sumando los resultados de cada una de estas probabilidades obtendremos la probabilidad de x = 2.

p(x < 3) = p(x = 0) + p(x = 1) + p(x = 2) = 0.0687 + 0.2061 + 0.2834 = 0.5582
p = 0.20 (esto es del 20%)
q = 0.80

n = 12

En R, es más sencillo realizar este inciso ya que en R la probabilidad de x número trae acumuladas las probabilidades de los números anteriores a el.

Es decir, en este inciso en R, no es necesario sumar las probabilidades de x = 0, x = 1 y x = 2 para obtener la probabilidad de que solamente hayan dos artículos defectuosos, si no que con solo obtener la probabilidad de x = 2, obtenemos la probabilidad de que hayan solamente 2 artículos defectuosos, ya que como les mencione en R la probabilidad de 2 trae acumuladas las probabilidades de 0, 1 y la del mismo 2.

Entonces en la terminal tecleamos:
pbinom(2, 12, 0.20)
Y presionamos enter y el resultado es: 0.5583457

Aquí esta la imagen del inciso.


c) Más de 3 pero menos de 7 sean defectuosos, esto quiere decir que solo 4, 5, ó 6 sean los artículos defectuosos. Entonces para obtener la probabilidad de esto, sumaremos las probabilidades de x = 4, x = 5 y x = 6.

p(3 < x < 7) = p(x = 4) + p(x = 5) + p(x = 6) = 0.1328 + 0.0531 + 0.0155 = 0.2014
p = 0.20 (esto es del 20%)
q = 0.80

n = 12


En R, a la probabilidad de x = 6 se le restará la probabilidad de x = 3, ya que esta contiene acumuladas las probabilidades de x = 0 a x = 3 y solo se quiere la probabilidad de 4 a 6. De la resta resultará la probabilidad de 6, que trae acumuladas las probabilidades de x = 4 a x = 6.
En R escribimos lo siguiente:
pbinom(6, 12, 0.20) - pbinom(3, 12, 0.20)
Presionamos enter y obtenemos: 0.2015279
Aquí les muestro la imagen de este inciso.

d) Como mínimo, 4 sean defectuosos, esto significa que 4 o más sean defectuosos. Entonces sumaremos las probabilidades de x = 0, x = 1, x = 2 y x =3 y la suma de estas probabilidades las restaremos a la unidad, es decir a 1, y el resultado será la probabilidad de que hayan 4 ó más artículos defectuosos.

p(x < = 4) = 1 - [p(x = 0) + p(x = 1) + p(x = 2) + p(x = 3)] = 1- [0.0687 + 0.2061 + 0.2834 + 0.2362] = 0.2056
p = 0.20 (esto es del 20%)
q = 0.80

n = 12

En R, a la unidad, es decir, a 1 se le restará la probabilidad de x = 3, ya que queremos la probabilidad de x = 4 en adelante, entonces el resultado de la resta, será dicha probabilidad.

Escribimos en la terminal:
1 - pbinom(3, 12, 0.20)
Presionamos enter y obtenemos: 0.2054311

Aquí esta la imagen de este inciso en la terminal.


Y aquí se encuentra la imagen con todos los incisos.


Ahora les explicaré sobre la Distribución Poisson.
Las probabilidades de esta distribución ocurren dentro de un intervalo de tiempo o espacio, y además se obtienen mediante la fórmula:
En donde:
X = variable aleatoria que sigue una distribución Poisson.
x = valor que toma la variable aleatoria.
μ = media de la distribución (número promedio de éxitos dentro del intervalo de tiempo o espacio de interés).
e = base de los logaritmos naturales (2.7182).

μ
= λ t
λ
= razón media.
t = intervalo de tiempo o espacio.

Ahora resolveré un problema de distribución de Poisson mediante su fórmula puntual y mediante una función en R.

Problema de Distribución de Poisson
En el estudio de un cableado eléctrico se encontró que tiene en promedio 3 fallas por Km. Determine las siguientes probabilidades:
a) encontrar mas de una falla en los primeros 500 metros.
b) menos de dos fallas en 2 kms
c) mas de 3 fallas en 1 Km
d) de que sean exactamente 3 fallas en 2 kms

a
) Encontrar mas de una falla en los primeros 500 metros (0.5 Kms). Para encontrar esta probabilidad, a la unidad, es decir a 1 se le restará la probabilidad de x = 0, ya que se quiere la probabilidad de 1 en adelante. Calculamos la probabilidad de x = 0 en la fórmula, sustituyendo valores.

p(x < = 1) = 1 - p(x < = 0) = 1 - 0.2231 = 0.7769
μ
= λ t
λ = 3 fallas / Km
μ = 3 fallas /Km * .5 Km = 1.5 fallas

En R, la función para calcular la probabilidad de Poisson es ppois(). Dentro de los () van x,
λ, es decir, (x, λ).
También en la terminal haremos lo mismo, es decir se le restará la probabilidad de x = 0 a la unidad, es decir, a 1.

Escribimos en la terminal:
1 - ppois(0, 1.5)
Y presionamos enter y obtenemos: 0.7768698

Y aquí esta la imagen de este inciso.

b) Menos de 2 fallas en 2 Kms. Esto significa que solo se encuentren 1 ó 0 fallas. Calcularemos la probabilidad de x = 0 y la probabilidad de x = 1 y sumaremos las dos probabilidades, y ese será el resultado.

p(x < 2) = p(x < = 1) = p(x = 0) + p(x = 1) = 0.0024787 + 0.01487 = 0.0173487
μ = λ t
λ = 3 fallas / Km
μ = 3 fallas /Km * 2 Km = 6 fallas

En R, como les mencione, la probabilidad de x número trae acumuladas las probabilidades de todos los número anteriores a x número, entonces para este inciso solo en R solo se calcularé la probabilidad de x = 1, ya que esta trae acumulada la probabilidad de x = 0.
Escrbimos en la terminal:
ppois(1, 6)
Presionamos enter y obtenemos: 0.01735127


Aquí esta la imagen de este inciso en la terminal.

c) Mas de 3 fallas en 1 Km, esto significa que hayan 3 fallas o mas. Entonces, obtendremos mediante la fórmula las probabilidades de x = 0, x = 1, y x = 2, las sumaremos y la suma de estas probabilidades la restaremos a la unidad, 1, ya que solo queremos la probabilidad de 3 en adelante.

p(x < = 3) = 1 - [p(x = 0) + p(x = 1) + p(x = 2)] = 1 - [0.04978 + 0.1493 + 0.2240] = 0.57692
μ = λ t
λ = 3 fallas / Km
μ = 3 fallas /Km * 1 Km = 3 fallas

En R, solo le restaremos a 1 la probabilidad de x = 2. Tecleamos lo siguiente en la terminal:
1 - ppois(2, 3)
Presionamos enter y obtenemos: 0.5768099

Aquí les coloco la imagen de este inciso.

d) De que sean exactamente 3 fallas en 2 Kms, esto significa de que solamente hayan 3 fallas, entonces calcularemos con la fórmula la probabilidad de x = 3.

p(x = 3) = 0.08923
μ = λ t

λ = 3 fallas / Km

μ = 3 fallas /Km * 2 Km = 6 fallas


En R, a la probabilidad de x = 3 tenemos que restarle la probabilidad de x = 2, para obtener solamente la probabilidad de que se encuentren 3 fallas en 2 Km. Escribimos lo siguiente en la terminal:
ppois(3, 6) - ppois(2, 6)
Presionamos enter y el resultado es: 0.08923508

Aquí les muestro la imagen de este inciso.


Y aquí les coloco la imagen con todos los incisos.

Bueno ahora les explicaré sobre la distribución normal.

La Distribución Normal es una de las distribuciones mas importantes, además es una curva en forma de campana (campana de Gauss).
En probabilidad y estadística se resuelven problemas como de encontrar una probabilidad en una cierta area de la gráfica que como les mencione dicha gráfica de la distribución normal es una curva en forma de campana.

Para encontrar la probabilidad en una cierta area de la curva, se necesitan tener los siguientes datos:

x = variable de la distribució normal
μ = media
σ = desviación estándar

Bueno, estos datos se utilizan para obtener z, que es una variable tipificada de x, la cual sigue tambien una distribución normal, pero donde μ = 0 y σ = 1.

Al obtener z mediante la fórmula:
nos vamos a unas tablas de distribución normal, que dependiendo del valor de z será la probabilidad de x. Las tablas traen diferentes probabilidades para diferentes valores de z. Pero la forma de resolver el problema para encontrar la probabilidad en una cierta area dependerá directamente de lo que el problema dicte.

Ahora resolveré un problema de distribución normal mediante la fórmula de z junto con las tablas de distribución normal y también mediante una función en R.

Problema de Distribución Normal
El tiempo de ensamble de un juguete se distribuye en forma normal con una media de 14.5 minutos y una desviación estándar de 2.5 minutos. Cuál es la probabilidad de que este tipo de juguete se pueda ensamblar:
a) en menos de 12 minutos
b) entre 10 y 15 minutos
c) en mas de 8 minutos

a) En menos de 12 minutos. En las tablas de la distribución normal, la probabilidad de x número (al igual que en R), trae acumuladas las probabilidades de los todos los números anteriores a x número. Aquí se nos pide obtener la probabilidad de que el tiempo de ensamble de un juguete sea en menos de 12 minutos, entonces obtendremos el valor de z mediante su fórmula, en donde x será 12 y al obtener el valor de z, checaré la probabilidad para dicho valor de z en las tablas, y en este caso, esa será la probabilidad de que sea en menos de 12 minutos.

p(x < = 12) = p(z < = -1) = 0.1587
μ = 14.5 minutos
σ = 2.5 minutos
z = -1

En R, la función para obtener una probabilidad normal es pnorm(), y dentro de los (), va x, μ, σ, es decir, (x, μ, σ). Entonces en nuestra termninal en este caso teclearemos lo siguiente:
pnorm(12, 14.5, 2.5)
Presionamos enter y el resultado es: 0.1586553

Aquí les muestro la imagen de este inciso en la terminal.


b) Entre 10 y 15 minutos, en este caso obtendremos dos valores de z, uno para x = 10 y otro para x = 15. Después checaré en la tabla el valor de z para x = 10 y el valor de z para x = 15, y a la probabilidad de x = 15 le restaré la, probabilidad de x = 10, ya que solo queremos la probabilidad entre 10 y 15.

p(10 < = x < = 15) = p(-1.8 mayor igual z menor igual 0.2) = 0.5793 - 0.0359 = 0.5434
μ = 14.5 minutos
σ = 2.5 minutos
z = -1.8
p(x = 10) = 0.0359
z = 0.2
p(x = 15) = 0.5793

En R de la misma manera a la probabilidad normal de x = 15, le restaremos la probabilidad normal de x = 10, entonces escribimos lo siguiente en la terminal:
pnorm(15, 14.5, 2.5) - pnorm(10, 14.5, 2.5)
Presionamos enter y el resultado es: 0.5433294

Ahora aquí les muestro la imagen en la terminal de este inciso.

c) En mas de 8 minutos, esto significa que a la unidad, 1, le restaremos la probabilidad de x = 8, ya que lo que resulte será la probabilidad de 8 en adelante.
Entonces obtenemos el valor de z y checaré el valor de z en las tablas de distribución normal para ver cual será la probabilidad y teniendo esta probabilidad, ahora si se la resto a 1.

p(x < = 8) = p(z < = -2.6) = 1 - 0.0047 = 0.9953
μ = 14.5 minutos
σ = 2.5 minutos
z = -2.6
p(x = 8) = .0047

En R, haremos lo mismo, es decir, a la unidad, 1, le restaremos la probabilidad de 8. Entonces, escribimos en la terminal lo siguiente:
1 - pnorm(8, 14.5, 2.5)
Presionamos enter y obtenemos: 0.9953388

Aquí les muestro la imagen de este inciso en la terminal.

Y aquí les muestro la imagen de la terminal con todos los incisos de este problema.


Referencias.
Funciones de Distribución en R
Los problemas los obtuve de la materia que llevo de Probabilidad Estocástica.
La tabla de distribución normal, la pueden ver aquí

Saludos.


lunes, 15 de noviembre de 2010

Lenguajes funcionales (Reporte #4)

Los lenguajes funcionales, son los lenguajes basados en el uso de funciones, entre ellos se encuentran, los lenguajes R, Scheme, Haskell, Miranda, Erlang, Lisp, etc.

Lenguaje Funcional R
R es un lenguaje que tiene muchas funciones para lo que son análisis estadísticos y gráficos
.
Es un buen lenguaje para realizar gráficas, de tipo: histogramas, circulares, de líneas, etc.

El programa que realice en R, es una gráfica con ciertas características, que más adelante les explicare. Este programa se basa en ciertos datos, de un problema de probabilidad y estadíca; además de la gráfica, obtuve las medidas de tendencia central, las cuales son, la media, la mediana y la moda (en este caso, solo obtuve la media y la mediana). Además obtuve también la varianza y la desviación estándard, que son las medidas de dispersión. Esto, como ya lo mencione es de un problema de probabilidad; de alli me base para realizar la gráfica y las diferentes medidas en R.

Problema
Se listan los precios de 19 marcas diferentes de zapatos para caminar. Construya una gráfica para mostrar la distribución de los datos.
90, 70, 70, 70, 75, 70
65, 68, 60, 74, 70, 95
75, 70, 68, 65, 40, 65
70
Bueno, si ya tenemos instalado R, en nuestra terminal escribibimos R, y nos aparecerá un símbolo como este >, lo cual significa que ya podemos comenzar a realizar la gráfica. Colocaremos lo que en la imagen les muestro:

En R, la asignación de un valor a una variable, se hace asi: a <- 5, en donde a es la variable y 5 es el valor que se le asigna a la variable a. Bueno, como vemos en la imagen, escribi Marcas <- 1:19, esto indica que Marcas tiene un rango de 1 a 19, ya que 19 son el número de datos que tenemos. En R, para asignar varios datos a una variable, se hace asi: a <- c(4, 5, 6). Es por esto que después escribi Precios <- c(90, 70, 70, 70, 75, 70, 65, 68, 60, 74, 70, 95, 75, 70, 68, 65, 40, 65, 70). Después escribi plot(Marcas, Precios), esto es para que se realice la gráfica de distribución de Marcas y Precios. Al colocar esto, se muestra una ventana con la gráfica siguiente:

Como vemos, solo se muestra la distribución de los datos de Marcas y Precios; Marcas se encuentra en el eje de las x y Precios en el eje de las y, esto sucede al haber escrito plot(Marcas, Precios), ya que si hubiera escrito plot(Precios, Marcas), entonces Marcas estaría en el eje de las y y Precios en el eje de las x; en si para realizar una gráfica se utiliza así la función: plot(x,y).

Hay una función en R que permite ordenar los datos en orden ascendente y otra función que permite ordenarlos en orden descendente. Dichas funciones son, sort() y rev(sort()) respectivamente.
A continuación les muestro la imagen en donde use estas funciones, solo para que se muestre como quedan los datos de Precios ordenados ascendente y descendentemente.

Después le agregue ciertas características a la gráfica como lo son, las figuras que se muestran, el color del relleno de las figuras, el color del contorno de dichas figuras, el título de la gráfica, el estilo de dicho título, y el ancho del contorno de las figuras. La imagen siguiente, muestra lo que escribi para realizar la gráfica con las características que les mencione.

Como vemos se muestra que escribi sort(Precios), que es como les mencione anteriormente, para ordenar los datos de Precios, en forma ascendente (para verlos asi en la gráfica). Utilice pch = 21, para elegir la el símbolo o figura que quiero que se muestre en la gráfica, en este caso escogí el número 21 del cuadro siguiente:

Después utilice bg = 619, para determinar el color de relleno de los símbolos. El número del color que se desea poner al relleno de los símbolos, se encuentra, escribiendo en la termial (estando dentro de R), colors(), y así se despliegan todos los números de los colores junto con el nombre del color (hay 657 colores). Después escribi col = 644, esto indica el color del contorno de los símbolos, que igualmente el número del color se obtiene al escribir colors() en la terminal. También se puede escribir el nombre del color en vez del número de este, por ejemplo, col = "red". Vemos que después escribi main = "Distribución de precios y marcas", main indica el título que queremos que se muestre en nuestra gráfica, el cual deberá ir entre comillas. Después escribi font.main = 4, font.main controla el estilo del título. Si colocamos el 1 es para que el texto del título se vea normal, el 2 es para que se vea en negritas, el 3 para que se vea en cursiva y el 4 para que el texto del título de vea en negritas y cursiva. En este caso escogí el 4. Y por último escribí lwd = 1, que esto indica la anchura del contorno de los símbolos, en este caso le puse 1. Sí le hubiese puesto 2, simplemente, el ancho del contorno de los símbolos aumenta. Y aquí les muestro como quedó la gráfica, ya con las características anteriores.


Ahora les explicaré como obtuve las medidas de tendencia central y la varianza y la desviación estándard de los datos del problema.

Bueno ahora les mostraré la imagen en donde calculo la media, que la media es el promedio de los datos, es decir la suma de todos los datos sobre el número total de datos.

Como vemos escribi Media <- sum(Precios)/Marcas. Utilice la función sum(), ya que realiza la suma de todos los datos que se encuentren, en este caso en Precios. Después esa suma la dividí entre Marcas, y luego escribi Media, esto es para imprimir lo que resulta de la operación que se le asigno a Media, y de esta manera se obtuvieron varios resultados, siendo el último de ellos, la Media, que es 70. Todos los demás resultados que se obtuvieron, fue porque dividi entre Marcas es decir, se realizaba la suma de los datos de Precios y se iba dividiendo esa suma entre 1, entre 2, entre 3, hasta llegar al 19. Pero otra manera más directa que realice para calcular la Media, fue, como lo vemos en la imagen, Media <- sum(Precios)/19, y asi escribiendo después Media, se imprime directo el resultado de esta, (que es 70), ya que se dividió directamente entre el número total de datos, es decir 19.

La varianza representa la variación que tienen los datos respecto a la media.
Normalmente se calcula asi:

Donde Xi, representa a cada uno de los datos, () representa la media, y n representa el total de datos que se tienen en una muestra.

La desviación estándard es el promedio de la distancia que hay de cada dato con respecto a la media. Normalmente se calcula así: Es decir, la desviación estándar es la raíz cuadrada de la varianza.

Ahora, les coloco la imagen en donde se muestran las funciones que utilice para obtener la varianza y la desviación estándard.


Como vemos, es sencillo calcular la varianza y la desviación estándard, ya que solo se utilizan funciones. Para calcular la varianza se utiliza la función var() y para calcular la desviación estándard se utiliza la función sd(). En este caso escribi var(Precios) y sd(Precios), para que se calcularán la varianza y la desviación estándard de los datos que se asignaron a Precios siendo la varianza igual a 120.7778 y la desviación estándar igual a 10.98989.

La mediana es el dato central que se encuentra en un conjunto de datos ordenados en forma ascendente.
En este caso la mediana es 70, ya que tenemos 19 datos, entonces ordenamos estos datos en forma ascend
ente y nos vamos al dato que se encuentra en el centro, es decir el dato #10. y vemos que este dato es el 70. Si el número total de datos hubiera sido 20, entonces la mediana seria la suma del dato 10 y del dato 11 sobre 2.

Y ya por último les coloco la imagen en donde se muestra la función que se utiliza para calcular la mediana y además también en esta imagen se muestra una fución que hay en R para calcular la media, aunque esta ya la realice anteriormente pero sin el uso de esta función.

Como vemos la función que se utiliza para calcular la mediana, es median() y para calcular la media es mean(). En este caso escribi, median(Precios) y mean(Precios), para obtener la mediana y la media de los datos asignados a Precios, siendo la mediana igual a 70 y la media igual a 70 como lo mencione anteriormente.

Lenguaje Erlang
Erlang es otro lenguaje funcional, que tiene una característica, que se dice que es la mayor fortaleza de este lenguaje, la cual es la concurrencia, que es cuando se llevan a cabo o se ejecutan varios threads (procesos) al mismo tiempo.

Los archivos en Erlang tienen la extensión .erl
Los programas en Erlang contienen funciones junto con su aridad. La aridad es el número de datos de entrada que la función permitirá que el usuario ingrese.
Las funciones se exportan en el programas de la manera siguiente: -export(nombre_función/aridad).

Realice tres programas en Erlang sencillos, uno de ellos calcula la potencia y esta en forma recursiva, el otro realiza las diferentes operaciones básicas (suma, resta, multiplicación y división), con el uso del case, y de acuerdo a la opción que el usuario eliga, será la operación que se realizará y el otro calcula las areas de diferentes figuras geométricas (cuadrado, triángulo, rombo, trapecio, círculo y rectángulo).

El primer programa que les mostraré, lo llame potencia.erl y como ya lo mencione anteriormente calcula potencia en forma recursiva.

Código
-module(potencia).
-export([pot/2]).

pot(N, K) when K == 0 -> 1;
pot(N, K) when K > 0 -> N*pot(N, K-1).
En esta parte:
-module(potencia).
-export([pot/2]).
Se colocan en el programa el módulo y la función que se utilizará. El nombre del módulo, deberá ser el mismo nombre que el del programa, en este caso es potencia. La función que utilice en este programa la llame pot y su aridad es de 2, es decir el usuario solo podrá ingresar dos datos de entrada en esta función.
Al final de colocar el módulo y la funcion o funciones se colocará un punto .

En esta otra parte:
pot(N, K) when K == 0 -> 1;
pot(N, K) when K > 0 -> N*pot(N, K-1).
Vemos que escribi pot(N, K), bueno esta es la función pot que contiene a las variables N y K, siendo N el número al cual se le calculará la potencia y K la potencia.

Las variables en Erlang van en mayúscula.

Sabemos que todo número elevado a la 0 es 1, es por eso que coloque la función when con la condición de que cuando K == 0, enonces el resultado que se imprimirá será 1.
Y ya después coloque nuevamente la función de when con la condición de que cuando K > 0, entonces se calculara la potencia de forma recursiva.
Vemos que al final de la instrucción de la potencia recursiva, se coloca un .
Hay que poner mucha atención en la sintaxis cuando se utilizan las funciones if, when, y case.

Para ejecutar este programa, colocamos primreamente erl en nuestra terminal y después escribimos lo siguiente:
c(potencia).
Donde potencia es el nombre del programa. Y como el programa esta correcto, en la terminal se mostrara: {ok,potencia}. Y ahora si se puede realizar la potencia K de un número N. Esto es de la siguiente manera: se coloca primero el nombre del programa y después : y luego se escribe el nombre de la función, que en este caso es pot y seguido de la función se colocan entre paréntesis N y K y al final un punto . Aquí les muestro la imagen de la ejecución de este programa, comprobando los casos de K == 0 y K >0.


Ahora les colocaré el código del programa que realiza las operaciones básicas con el uso del case, en donde se elige la opción de la operacón a realizar. Ese programa lo llame opc.erl.

Código
-module(opc).
-export([opciones/3]).

opciones(N, A, B) ->
case N of
1 -> A+B;
2 -> A-B;
3 -> A*B;
4 -> A/B;
N when N > 4 -> "Ingresa otra opcion (1-4)"
end.
Ahora, este programa como lo mencione anteriormente, realiza las operaciones básicas, pero utilice el case, para que el usuario eligiera la opción de la operación a realizar.

Igualmente en la parte de:
opciones(N, A, B) ->
case N of
1 -> A+B;
2 -> A-B;
3 -> A*B;
4 -> A/B;
N when N > 4 -> "Ingresa otra opcion (1-4)"
end.
se encuentran el módulo llamado opc y la función que utilice a la cual llame opciones y le puse una aridad de 3.
En opciones(N, A, B), N es el número de opción que el usuario elegirá, A y B son los dos datos que el usuario introducirá, con los cuales se realizará la operación. Y ya en la parte donde se encuentra el case N of, pues sencillamente ya se presentan las opciones junto con su operación a realizar, es decir, si se ingresa el 1 como opción, entonces se realizará una suma, si se ingresa el 2, una resta, si se ingresa el 3, se realiza una multiplicación, si se ingresa un 4, se realiza una divisón. Y si se ingresa un número mayor a 4, entonces en la terminal se imprime que se ingrese otra opción de 1-4. La función case al final termina con end.

Para ejecutar este programa colocamos erl en la terminal y después:
c(opc). 
Aquí les muestro la imagen de la ejecución de este programa, en donde elijo las diferentes opciones y la opción de cuando N > 4.


Y el otro programa que realice lo llame areas.erl. Y es el siguiente:

Código
-module(areas).
-export([cuadrado/1]).
-export([triangulo/2]).
-export([rombo/2]).
-export([trapecio/3]).
-export([circulo/1]).
-export([rectangulo/2]).

cuadrado(L) ->
L*L.

triangulo(B, H) ->
(B*H) / 2.

rombo(DM, D) ->
(DM*D) / 2.

trapecio(BM, B, H) ->
((BM+B)*H) / 2.

circulo(R) ->
3.141592*(R*R).

rectangulo(B, A) ->
B*A.
Pues este programa también es muy sencillo, calculas las áreas de ciertas figuras geométricas.
Como vemos coloque el módulo con su nombre, areas, y además exporte cada una de las funciones por separado, las cuales se pueden exportar juntas, de la siguiente manera:
-export([cuadrado/1, triangulo/2, rombo/2, trapecio/3, circulo/1, rectangulo/2]).
A cada función le di una cierta aridad, según los datos que se necesitan para calcular las diferentes areas.
Y ya después coloque a cada función con su instrucción correspondiente.
Como vemos las areas que calcula son: la del cuadrado, la del triángulo, la del rombo, la del trapecio, la del círculo y la del rectángulo. Las cuales se calculan mediante las fórmulas:

Área del cuadrado = Lado * Lado
Área del triángulo = Base * Altura / 2
Área del rombo = Diámetro mayor * Diámetro menor / 2
Área de l trapecio = ((Base mayor + Base menor ) * Altura) / 2
Área del círculo = 3.141592 * radio al cuadrado
Área del rectángulo = Base por Altura

Al final de cada instrucción se colocará un punto .

Para ejecutar este programa, escribiremos erl en la terminal y después lo siguiente:
c(areas).
Y aquí les muestro la imagen de la ejecución de este programa, donde utilice todas las funciones.


Saludos.