Sie sind auf Seite 1von 109

Historia de matlab

Fue creado por The MathWorks en 1984, surgiendo la primera versión con
la idea de emplear paquetes de subrutinas escritas en Fortran en los cursos
de álgebra lineal y análisis numérico, sin necesidad de escribir programas
en dicho lenguaje. El lenguaje de programación M fue creado en 1970 para
proporcionar un sencillo acceso al software de matrices LINPACK y EISPACK
sin tener que usar Fortran.
En 2004, se estimaba que MATLAB era empleado por más de un millón de
personas en ámbitos académicos y empresariales
Matlab ha evolucionado y crecido con las aportaciones de muchos usuarios.
En entornos universitarios se ha convertido junto con matemática y maple,
en una herramienta instructora básica para cursos de matemática aplicada
así como para cursos avanzados en otras áreas.

En entornos industriales se utiliza para investigar y resolver problemas


prácticos y cálculos de ingeniería. Son aplicaciones típicas el cálculo
numérico, la resolución de problemas con formulación matricial, la
estadística, la optimización, etc. Es de destacar la aplicación en el estudio,
simulación y diseño de los sistemas sistemas dinámicos y de control.

Una herramienta poderosa para la investigación.


El presente documento es una recopilación de información que puede ser útil para aquellos
estudiantes interesados en conocer esta poderosa herramienta de calculo, simulación y
modelado matemático que por demás está el mencionar en esta introducción todos los
elogios de que es merecedor este singular programa de calculo matemático por su amplia
área de aplicación en el estudio científico.
1.- INTRODUCCION AL MATLAB.
MATLAB es un entorno de computación y desarrollo de aplicaciones totalmente integrado
orientado para llevar a cabo proyectos en donde se encuentren implicados elevados cálculos
matemáticos y la visualización gráfica de los mismos. MATLAB integra análisis numérico,
cálculo matricial, proceso de señal y visualización gráfica en un entorno completo donde los
problemas y sus soluciones son expresados del mismo modo en que se escribirian
radicionalmente, sin necesidad de hacer uso de la programación tradicional.
MATLAB dispone también en la actualidad de un amplio abanico de programas de apoyo
especializados, denominados Toolboxes, que extienden significativamente el número de
funciones incorporadas en el programa principal. Estos Toolboxes cubren en la actualidad
prácticamente casi todas las áreas principales en el mundo de la ingeniería y la simulación,
destacando entre ellos el 'toolbox' de proceso de imágenes, señal, control robusto,
estadística, análisis financiero, matemáticas simbólicas, redes neurales, lógica difusa,
identificación de sistemas, simulación de sistemas dinámicos, etc. es un entorno de cálculo
técnico, que se ha convertido en estándar de la industria, con capacidades no superadas en
computación y visualización numérica.
De forma coherente y sin ningún tipo de fisuras, integra los requisitos claves de un sistema
de computación técnico: cálculo numérico, gráficos, herramientas para aplicaciones
especificas y capacidad de ejecución en múltiples plataformas. Esta familia de productos
proporciona al estudiante un medio de carácter único, para resolver los problemas más
complejos y difíciles.
1.1.- ORIGEN
MATLAB nace como una solución a la necesidad de mejores y mas poderosas herramientas
de calculo para resolver problemas de calculo complejos en los que es necesario aprovechas
las amplias capacidades de proceso de datos de grandes computadores.
El nombre MATLAB viene de "matrix laboratory" (laboratorio matricial). MATLAB fue
originalmente escrito para proveer acceso fácil al software matricial desarrollado por los
proyectos LINPACK y EISPACK, que juntos representan el estado del arte e software para
computación matricial. Hoy MATLAB es usado en una variedad de áreas de aplicación
incluyendo procesamiento de señales e imágenes, diseño de sistemas de control, ingeniería
financiera e investigación médica. La arquitectura abierta facilita usar MATLAB y los
productos que lo acompañan para explorar datos y crear herramientas personalizadas que
proveen visiones profundas tempranas y ventajas competitivas.
1.2.- INICIACIÓN AL MATLAB
El Lenguaje de Computación Técnica MATLAB es un ambiente de computación técnica
integrada que combina computación numérica, gráficos y visualización avanzada y un
lenguaje de programación de alto nivel.
Sea cual fuere el objetivo, un algoritmo, análisis, gráficos, informes o simulación, MATLAB
lo lleva allí. El lenguaje flexible e interactivo de MATLAB permite a ingenieros y científicos
expresar sus ideas técnicas con simplicidad. Los poderosos y amplios métodos de cómputo
numérico y graficación permiten la prueba y exploración de ideas alternativas con facilidad,
mientras que el ambiente de desarrollo integrado facilita producir resultados prácticos
fácilmente.
MATLAB es la fundación numérica y gráfica para todos los productos de The MathWorks.
MATLAB combina computación numérica, gráficos 2D y 3D y capacidades de lenguaje en
un único ambiente fácil de usar.
Con su amplio rango de herramientas para modelar sistemas de control, análisis,
simulación y procesamiento de prototipos, MATLAB es el sistema ideal para desarrollar
sistemas avanzados de control. Usted puede modelar su sistema de control usando las cajas
de herramientas para el diseño de controles avanzados de MATLAB - Control System,
Robust Control, µ-Analysis and Synthesis, Model Predictive Control, QTF Control Design y
LMI control. Posteriores análisis y refinamientos pueden ser efectuados estableciendo una
simulación interactiva en Simulink, y luego sintonizar automáticamente los parámetros
usando el Nonlinear Control Design Blockset. Finalmente, usted puede generar código C
para correr en controladores incrustados con Real Time Workshop.
Combinando MATLAB con Signal Processing Toolbox, Wavelet Toolbox y un conjunto de
herramientas complementarias - tales como Image Processing, Neural Network, Fuzzy
Logic, Statistics y otras - usted puede crear un ambiente de análisis personalizado de
señales y desarrollo de algoritmos DSP. Para simulación y desarrollo de prototipos usted
puede agregar Simulink y el DSP Blockset para modelar y simular sus sistemas DSP, y luego
usar Real-Time Workshop para generar código C para su hardware designado.
1.3- CARACTERÍSTICAS DEL ENTORNO
Características de MATLAB :
 Cálculos intensivos desde un punto de vista numérico.
 Gráficos y visualización avanzada.
 Lenguaje de alto nivel basado en vectores, arrays y matrices.
 Colección muy útil de funciones de aplicación.

Las poderosas capacidades de cálculo técnico de MATLAB se ponen a la disposición de los


estudiantes, aunque limita el tamaño de las matrices a 8192 elementos, la edición de
estudiante mantiene toda la potencia de la versión profesional de MATLAB 4.0, en una
forma diseñada para que los estudiantes puedan ejecutarlo en sus propios ordenadores
personales bajo Windows.
Toolbox especiales :
Se incluyen el Toolbox de señales y Sistemas ( un conjunto de herramientas para el
procesamiento de señal y para el análisis de sistemas de cuadro ) y el Toolbox Symbolyc
Math ( herramienta de cálculo simbólico basada en Maple V ).
A continuación presentamos la interfase de usuario de MATLAB 4.0 con el despliegue de
una aplicación con grafica en 3D correspondiente al modelo Z=x^y-y^x su tabla de calculo
y el análisis de la función.
1.4.- SALIDAS O PRESENTACIONES
MATLAB provee acceso inmediato a las características gráficas especializadas requeridas en
ingeniería y ciencias. Potente graficación orientada a objetos gráficos le permite graficar los
resultados de su análisis, incorporar gráficos en sus modelos de sistemas, rápidamente
presentar complejos 3-D objetos, y crear resultados de presentación, entre lo cual se
destaca:
 Representaciones 2-D y 3-D, incluyendo datos triangulados y reticulados
 Representaciones 3-D quiver, ribbon, y stem
 Control de fuentes, letras Griegas, símbolos, subíndices y superíndices
 Selección expandida de símbolos marcadores de curvas
 Gráficos de torta, de barras 3-D y gráficos de barras horizontales
 Gráficos 3-D y sólido modelado
 Representación de imágenes y archivos I/O
 Gráficos comentados
 Leer/Escribir archivos de datos Hierarchical Data Format (HDF)
 Presentación de OpenGL software y hardware
 Animación
 Display de buffer x rápido y exacto
 Soporte de colores verdaderos (24-bit RGB)
 Fuentes múltiples de luz para superficies coloreadas
 Vista basada en cámara y control de perspectiva
 Iluminación Plana, Gouraud y Phong
 Soporte eficiente de imagen de datos de 8-bit
 Control de eje y cámara
 Propiedades de superficie y patch
 Modelos de iluminación
 Control gráfico de objetos
 Impresión y representación de copias
 Formatos gráficos exportables
 Soporte de publicación de escritorio

1.5.- FUNCIONES DE MATLAB


Manipulación y Reducción de Datos
MATLAB tiene un rango completo de funciones para preprocesar datos para análisis,
incluyendo:

• y decimando
• secciones de datos
• y promediando
• y procesando umbrales
• y filtrando
Numerosas operaciones para manipular arreglos multidimensionales, incluyendo
reticulación e interpolación de datos, están también disponibles.
Descriptivos Gráficos Para Explorar y Presentar Sus Datos
Gráficos de propósitos generales y de aplicación específica le permiten visualizar al instante
señales, superficies paramétricas, imágenes y más. Todos los atributos de los gráficos de
MATLAB son personalizables, desde los rótulos de ejes al ángulo de la fuente de luz en las
superficies 3-D . Los gráficos están integrados con las capacidades de análisis, de modo que
usted puede mostrar gráficamente cualquier conjunto de datos sin editar, ecuación o
resultado funcional.
I/O Directo de Datos
Usted puede ingresar y sacar datos de f MATLAB rápidamente. Las funciones están
disponibles para leer y escribir archivos de datos formateados en MATLAB, llamados
archivos MAT. Funciones adicionales ejecutan programas ASCII e I/O binario de bajo nivel
desde los archivos de programas M, C, y Fortran, permitiéndole trabajar con todos los
formatos de datos. MATLAB también incluye soporte incorporado para formatos populares
de archivos estándar.
Computación Simbólica Integrada
Integrando el motor simbólico Maple V® con MATLAB, los Symbolic Math Toolboxes le
permiten mezclar libremente computación simbólica y numérica una sintaxis simple e
intuitiva.
Análisis de Datos Confiable, Rápido y Exacto
Los métodos usados comúnmente para análisis de datos multidimensional generalizados 1-
D, 2-D están incorporados en MATLAB. Interfaces gráficas fáciles de usar, específicas para
aplicaciones, la línea de comando interactiva y herramientas de programación
estructuradas le permiten elegir el mejor camino para sus tareas de análisis.
Análisis de Datos para DSP
MATLAB ofrece muchas herramientas para realizar la funcionalidad indispensable en
procesamiento de señales, tales como Transformadas Rápidas Fourier y Transformadas
Rápidas Inversas de Fourier. La visualización de datos de procesamiento de señales está
soportada por funciones tales como gráficos stem y periodogramas. El lenguaje de
MATLAB, inherentemente orientado a matrices hace que la expresión de coeficientes de
filtros y demoras de buffers sean muy simples de expresar y comprender.
Análisis de Datos en Aplicaciones de Imágenes
MATLAB y la Image Processing Toolbox ofrece un amplio conjunto de herramientas que le
permite fácilmente manipular, procesar y analizar datos de imágenes, interactivamente
mostrar pantallas de imágenes 2-D o 3-D, visualizar datos temporarios cuando es necesario,
y comentar sus resultados para publicaciones técnicas. La orientación basada en matrices
del lenguaje de MATLAB le permite expresar en forma compacta operaciones matemáticas
de forma similar a cómo las expresaría sobre papel. Como resultado, es fácil e intuitivo
efectuar procesamiento de imágenes y operaciones de análisis tales como FFTs, filtrado 2-
D, morfología binaria, manipulación geométrica, conversión de espacios de colores,
compresión, análisis de componentes conectados y más.
Algorithm Development (Desarrollo de Algoritmos) Sea que usted esté usando los
algoritmos del sistema o esté inventando los suyos propios, MATLAB le provee un ambiente
en el que usted puede experimentar. A diferencia de C y C++, MATLAB le permite
desarrollar algoritmos desde cero o trabajar con interfaces complicadas a bibliotecas
externas. Las poderosa fundación de computación, el lenguaje técnico, y cientos de
funciones en cajas de herramientas (toolboxes) convierten a MATLAB en lo más adecuado
para aplicaciones matemáticamente intensivas que requieran análisis de datos,
procesamiento de señales e imágenes, modelado de sistemas o técnicas numéricas
avanzadas.
1.6- EL MATLAB Y LA ESTADÍSTICA
Statistics Toolbox
Combina poderosos algoritmos estadísticos con interfaces gráficas interactivas
Las Statistics Toolbox le da un rango ancho de herramientas para realizar cálculos
estadísticos. Proporciona una única mezcla de facilidad gráfica de uso y programabilidad.
Los despliegues gráficos interactivos le permitieron aplicar métodos estadísticos fácilmente
y de forma consistente, mientras el lenguaje de MATLAB le permite fácilmente crear los
acostumbrados métodos estadísticos y de análisis. Esta combinación le da la libertad para
acceder las funciones bajo-niveladas directamente como funciones de probabilidad y
ANOVA de la línea del orden, o para usar las interfaces interactivas para aprender y
experimentar con el toolbox construir-en visualización y herramientas del análisis.
entonces escribimos:
»A=[1 2 3 4;5 6 7 8;9 10 11 12;13,14,15,16];
(El simbolo "»" denota el prompt de MATLAB y no se escribe al entrar instrucciones). El ";"
al final de la instrucción omite el "eco" o salida a la pantalla. La instrucción
»x=4:-1:1
general el vector fila x=[4,3,2,1]. La instrucción
»C=A(3:4,1:3);
se refiere a la submatriz

de A. También D=A([1,3],3:4) genera

Matrices Especiales
En MATLAB podemos generar matrices especiales con las siguientes instrucciones:
m de entradas aleatorias entre 0 y uno.rand(n,m) - matriz n
eye(n) - matriz identidad n.n
m.zeros(n,m) - matriz cero de tamaño n
m conones(n,m) - matriz n todas las entradas uno.
Combinando estas instrucciones podemos generar matrices bastante complicadas. Por
ejemplo, la instrucción
»E=[eye(2),ones(2,3);zeros(2),[1:3;3:-1:1]]
genera la matriz

La instrucción round(x) redondea "x" al entero más cercano a "x". Podemos combinar
funciones en MATLAB. Por ejemplo, round(10*rand(4)) genera una matriz con entradas
aleatorias entre 0 y 10.
Aritmética de Matrices
Considere las siguientes matrices:

Entonces las operaciones A*B (producto matricial de A con B), A+B (suma de A mas B),
3*A (multiplicación escalar de 3 por A) tienen los siguientes resultados:
»A*B
ans =
16 19 13
10 11 7
»A+B
??? Error using ==> +
Matrix dimensions must agree.
»3*A
ans =
12 15
6 9
Note que MATLAB "anuncia" que A+B no se puede calcular. Las operaciones A'
(transpuesto de A), inv(A) (inversa de A), y A^3 (esto es A*A*A) tienen como resultados:
»A'

ans =
42
53

»inv(A)
ans =
1.5000 -2.5000
-1.0000 2.0000

»A^3

ans =

174 235
94 127
Si precedemos las operaciones matriciales "*", "^" con el punto ".", entonces estas se hacen
termino a termino. Por ejemplo A.*C y A.^2 generan:
» A.*C
ans =
-4 10
4 12
» A.^2
ans =
16 25
4 9
Solución de Sistemas Lineales
Considere le sistema lineal

Definimos la matriz de coeficientes y el lado derecho por las instrucciones:


»A=[1 -2 3;4 1 -2;2 -1 4];
»b=[1 -1 2]';
Note el transpuesto en b para hacerlo un vector columna. Vamos a resolver este sistema por
tres métodos:
 eliminación Gaussiana
 forma echelon reducida o método de Gauss-Jordan
 método de la inversa

En el método de Gauss-Jordan, luego de obtener la forma echelon de la matriz de


coeficientes aumentada, eliminamos también la parte de arriba de la matriz hasta producir
una matriz donde las columnas con unos, solo tienen un uno. Esto se conoce como la forma
echelon reducida (ver texto). Para comparar los tres métodos utilizamos la instrucción flops
de MATLAB que estima el número de operaciones de punto flotante entre dos llamadas
sucesivas a flops. Una llamada de la forma flops(0) inicializa el contador de operaciones a
cero. La sucesión de instrucciones:
» flops(0)
» x=A\b
x=
-0.0417
0.4167
0.6250
» flops
lleva a cabo eliminación Gaussiana en el sistema de arriba y produce como resultado:
ans =
73
esto es, se necesitaron aproximadamente 73 operaciones de punto flotante (sumas, restas,
multiplicaciones ó divisiones) para resolver el sistema con eliminación Gaussiana. Para el
método de Gauss-Jordan tenemos:
» flops(0)
» rref([A b])
ans =
1.0000 0 0 -0.0417
0 1.0000 0 0.4167
0 0 1.0000 0.6250
» flops
ans =
483
el cual requiere 483 operaciones de punto flotante. Finalmente el método de la inversa se
realiza con la siguiente sequencia de instrucciones:
» flops(0)
» x=inv(A)*b
x=
-0.0417
0.4167
0.6250
» flops
ans =
108
el cual toma 108 operaciones. Vemos pues que eliminación Gaussiana es el mejor de los tres
métodos lo cual es cierto en general.
Usando MATLAB podemos estudiar la relación entre la solubilidad del sistema Ax=b y la
nosingularidad de la matriz de coeficientes A. En clase vimos que el sistema Ax=b tiene
solución única para cualquier lado derecho b si y solo si la matriz A es nosingular. ¿Qué
sucede si A es singular? ¿Entonces Ax=b no tiene solución? Si A es singular el sistema Ax=b
puede tener solución para algunos b's pero de seguro hay al menos un b* para el cual Ax=b*
no tiene solución. Vamos a genera una matriz singular con MATLAB:
» A=round(10*rand(6));
» A(:,3)=A(:,1:2)*[4 3]'
A=
2 5 23 9 7 3
0 8 24 8 9 6
7 0 28 5 8 8
7 1 31 1 3 10
9 5 51 7 0 4
4 7 37 4 7 2
(Como usamos la instrucción rand, el resultado de esta y cualquier secuencia de
instrucciones que use esta función de MATLAB, no siempre será el mismo). La primera
instrucción genera una matriz aleatoria con entradas enteras entre 0 y 10, y con la segunda
instrucción remplazamos la tercera columna de A con cuatro veces la primera columna mas
tres veces la segunda columna. ¡La matriz resultante es singular! (Explique esto sin calcular
el determinante). Generamos ahora un lado derecho arbitrario mediante la instrucción:
» b=round(20*(rand(6,1)-0.5))
b=
10
4
5
3
-9
3
1 aleatoria con entradas enteras entre -10 y 10.Esto genera una matriz 6 Resolvemos el
sistema Ax=b calculando la forma echelon reducida de la matriz de coeficientes aumentada
[A b]:
» rref([A b])
ans =
1040000
0130000
0001000
0000100
0000010
0000001

Como la última fila es de la forma el sistema es inconsistente, i.e., no tiene


solución. ¡Recuerde que A es singular! Esto no quiere decir que Ax=b nunca tenga solución.
Si definimos c=A*b, con el b de arriba digamos, el sistema Ax=c tiene solución x=b (¿por
qué?). De hecho si calculamos la forma echelon reducida de [A c] tenemos:
» c=A*b;
» rref([A c])
ans =
1 0 4 0 0 0 30
0 1 3 0 0 0 19
0001003
0 0 0 0 1 0 -9
0000013
0000000
el cual denota un sistema consistente dependiente con soluciones:

donde x3 es arbitrario.
Funciones de Matrices
MATLAB posee una gran cantidad de funciones matriciales. De las más comunes tenenmos:
 min(A), max(A) - dan el mínimo y máximo respectivamente por columnas de A
 sum(A), prod(A) - producen la suma y producto respectivamente por columnas de A
 norm(A,p) - norma p de la matriz A donde p=1,2, ó inf
 eig(A) - vector cuyos componentes son los valores propios de A
 det(A) - el determinante de A
 inv(A) - la matriz inversa de A

3.2.- GRAFICAS
MATLAB provee excelentes funciones para gráficas en dos, tres y cuatro dimensiones.
Veamos un par de ejemplos sencillos. Suponga que queremos trazar la gráfica de la función

Esto lo podemos lograr con las instrucciones:


» x=-5:.1:5;
» y=x.^2.*exp(-x.^2);
» plot(x,y)
La primera instrucción divide el intervalo [-5,5] en subintervalos de largo 0.1, la segunda
instrucción evalúa la función en los puntos de la partición, y finalmente graficamos los
resultados con plot. La instrucción plot tiene opciones para cambiar patrones del trazado,
poner titulos, etc.
Supongamos ahora que queremos dibujar la superficie:

Esto lo hacemos con la secuencia de instrucciones:


» x=-5:.4:5;
» y=x;
» [X,Y]=meshgrid(x,y);
» Z=X.^2.*exp(-Y.^2);
» surf(X,Y,Z)
(Para ver el gráfico faltante haga lick en el menú superior "Bajar Trabajo")
Las primeras dos instrucciones dividen los ejes de "x" y "y" en subintervalos de largo 0.4; la
tercera instrucción genera una rejilla en el conjunto [-5,5] con cuadraditos de lados 0.4
como se ilustra en la siguiente[-5,5] figura:
La cuarta instrucción evalua la función en los puntos de la rejilla, y finalmente trazamos la
superficie con surf.
3.3.- ANÁLISIS DE VOZ
El análisis de voz propiamente no es funcional pues el modelo que corresponde a la
modulación interactiva y las distintas frecuencias que aunque estan sometias a un rango
especifico varian en un numero infinito, por esta razón el estudio se refiera a la acustica en
si como un modo de generar modelos simples los cuales se van acoplando a las necesidades
de la investigación en la cual es requerido, y es así como muchas de estas investigaciones
han aportado soluciones efectivas para el desarrollo de mejores programas de
reconocimiento de voz.
Introducción a modelos físicos
¿Cuál es la causa de que la presión de aire fluyendo a través de un tubo hueco produzca
ondas de presión en el aire del exterior que conocemos como notas? Con modelos físicos se
intenta describir matemáticamente la acústica de los instrumentos tradicionales y
implementar digitalmente los algoritmos para poder reproducir estos fenómenos.
En la actualidad se ha desarrollado suficientamente la tecnología para que se puedan
manipular estos modelos al mismo nivel que los originales acústicos en tiempo real, y por
eso han sido objeto de mucho interés comercial. Pero, por supuesto, la imitación nunca
puede ser mejor que el original, así que todavía la intención principal es descubrir la
naturaleza de los instrumentos.
Al contrario de la síntesis tradicional de muestras, se gobierna un modelo físico por la
interfaz entre el ejecutante y el instrumento.Variables como la presión de aire y la
embocadura para instrumentos de viento y la presión del arco y posición del dedo para los
de cuerdas fijan qué oscilaciones afectan al medio resonante, que como consecuencia emite
ondas sonoras a su entorno. Con ello se ha perdido la generalidad de la síntesis muestreada
y la posibilidad de influir la señal directamente, a cambio de un control del modelo más
amigable al usuario, intuitivo y tradicional.
Los modelos físicos requieren menos capacidad de datos que la síntesis muestreada si hay
algoritmos efectivos, pero los gastos elevados se encuentran al desarrollar estos algoritmos
que es necesario adaptar a medida para cada tipo de instrumento que tiene distintos
fenómenos acústicos.
Así como la síntesis de muestras ha contribuído a clasificar los distintos instrumentos por
su timbre, los modelos físicos han contribuido a refinar la clasificación por sus cualidades
físicas. Los dos grupos principales son instrumentos de cuerdas e instrumentos de viento,
ambos subdivididos en varios grupos.
Para modelar un instrumento se divide en dos partes funcionales: el excitador y el
resonador. El excitador se puede simular como una señal entrada no lineal para el
resonador, el cuál se puede modelar como una función transferencia lineal que produce la
señal salida audible. Los dos se unen con realimentación.
La teoría más aplicada para el resonador de modelos físicos es la denominada ³teoría de
guía de ondas². Se basa en la solución analítica de la ecuación de la propagación de ondas
en el material. La ecuación es adecuada para cualquier guía de ondas unidimensional, tanto
cuerdas como tubos huecos:
Ky² = Eÿ
Para cuerdas:
K = tensión de la cuerda
E = densidad de masa lineal
y = desplazamiento de la cuerda
ÿ = aceleración de la cuerda
y² = curvatura de la cuerda
Además hay que modelar las pérdidas de energía debido a la resistencia del aire, la rigidez,
la fricción interno etc., que hace apagarse al sonido. Se puede implementar todo eso muy
efectivamente mediante componentes digitales como líneas de retardo, unidades de acoplo
y filtros.
El excitador al ser no lineal es más dificil de modelar que el resonador. Además existen
diferentes tipos que implican diferentes conjuntos de ecuaciones, pero hay buenos modelos
para estos también. Para mantener una nota constante el excitador tiene que proprocionar
exactamente la misma energía que desaparece en el resonador; un cambio en la energía
proporcionada da un cambio correspondiente en la potencia sonora. Cada resonador tiene
límites superior e inferior que determinan qué suministro de energía resulta en un sonido
conteniendo la frecuencia fundamental de la nota deseada.
Diferentes opciones para desarrollos posteriores
En principio esta línea de investigación no tenía un fin comercial, sino que era un intento
de entender la acústica de los instrumentos acústicos. Hoy día los algoritmos resultantes
son tan efectivos, la capacidad de cálculo tan elevada y la interfaz al ejercitante tan buena
que también es un método de producir instrumentos musicales comerciales. En esta tarea,
hay ángulos diferentes de acometer los problemas. En un extremo está el físico que analiza
los mecanismos de generación, en el otro está el diseñador de instrumentos que desea
buenos resultados en la calidad del sonido.
Uno de los problemas básicos y hasta ahora no resueltos es el de los pequeños márgenes,
que son tan importantes. Un cambio minúsculo de p.ej. la presión de arco o la embocadura
produce cambios bastante audibles, y aún es un misterio qué separa un violín bueno y uno
excelente. Hay que bajar a un nivel muy detallado que en cualquier otro contexto
electroacústico se podría pasar por alto, lo cual es un gran desafío para el futuro.
Lo más importante será siempre centrarse en los aspectos musicales aunque las
matemáticas sean bastante interesantes de por sí.
¿Por qué?
La ventaja de la acústica musical es la posibilidad de utilizar el excelente oído humano
como mecanismo de control para las teorías deducidas, que también son aplicables para
objetivos no musicales. Por eso los modelos físicos pueden utilizar la realidad como su
hipótesis verificativa.
La finalidad será llegar un día a conocer los fenómenos acústicos de los instrumentos tan
bien que se logre mejorar y/o construir nuevos instrumentos acústicos, y poder modelar
instrumentos ficticios inspirados en los tradicionales pero que no necesariamente se
puedan construir en la realidad.
También hay un gran interés comercial por estos modelos, ya que son buenas copias de los
instrumentos tradicionales, pero mucho más flexibles. Se pueden presentar facilidades
como auriculares, MIDI, salida de jack, secuenciador, varios instrumentos parecidos en el
mismo modelo, y formatos pequeños y ligeros.
1. Introducción
En el siguiente trabajo pretendemos presentar una serie de concepto y definiciones propios
del estudio de los Algoritmos, su análisis y diseño.
En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus
componentes, análisis y diseño. También veremos los diferentes tipos de formas y tamaños
o medidas en que se pueden almacenar y representar los datos y estructuras en un
algoritmo o programa. En ese mismo orden encontraremos las diferentes técnicas para
diseñarlos como son el método de la fuerza bruta, el voraz, divide y vencerás, programación
dinámica, de vuelta atrás, entre otros.
De igual forma podremos ver las definiciones y algunas características, reglas, normas,
tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones.
Finalmente veremos los que es la verificación y derivación de programas, donde daremos
los conceptos básicos de semántica y sus tipos haciendo mayor énfasis en la semántica
axiomática, la recursividad e iteración, los diseños de estos últimos, así como los típicos
ciclos utilizados en algoritmos y programas y los paso a tener en cuenta al momento de
desarrollar un algoritmo iterativo o recursivo.
Justificacion
Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos
Computacionales, que desde su aparición hasta nuestros días es, y seguirá siendo; vital para
el desarrollo de aplicaciones para computadoras y el manejo y dominio de la lógica de
programación para resolver problemas.
Motivación
Como estudiantes de la Facultad de Ciencias y Tecnología " Escuela de Informática y
Computación " de la Universidad Dominicana Organización y Métodos O&M con
aspiraciones de iniciarnos como Ingeniero en Sistemas y Computación. Con el objetivo
inmediato de aprobar con los mejores meritos la asignatura de Algoritmos
Computacionales.
Objetivos
General :
Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los
Algoritmos Computacionales.
Específicos :
Introducir los conceptos propios sobre Algoritmo, su importancia en el mundo de las
aplicaciones para computadoras y el manejo de lógica de programación.
 Proporcionar una idea de su uso.
 Visualizar sus ventajas e importancia.
 Definir sus tipos y variantes.
 Proporcionar conceptos sobre su análisis y diseño.
 Proporcionar concepto sobre las técnicas de diseño.
 Desglosar sus variantes (ordenación, búsqueda, etc. ).

2. Marco Historico
Un algoritmo es un conjunto de operaciones y procedimientos que deben seguirse para
resolver un problema. La palabra algoritmo se deriva del nombre latinizado del gran
Matemático Árabe Mohamed Ibn Al Kow Rizmi, el cual escribió sobre los años 800 y 825 su
obra Quitad Al Mugabala, donde se recogía el sistema de numeración hindú y el concepto
del cero. Fue Fibinacci, el que tradujo la obra al latín y el inicio con la palabra: Algoritmi
Dicit.
El lenguaje algorítmico es aquel por medio al cual se realiza un análisis previo del problema
a resolver y encontrar un método que permita resolverlo. El conjunto de todas las
operaciones a realizar y e orden en que se deben efectuarse, se le denomina algoritmo.
Es un método para resolver un problema mediante una serie de datos precisos, definidos y
finitos.
3. Generalidades
El programador de computadoras es ante que nada una persona que resuelve problemas,
por lo que para llegar a ser un programador eficaz se necesita aprender a resolver
problemas de un modo riguroso y sistemático. A la metodología necesaria para resolver
problemas mediante programas se denomina Metodología de la Programación. El eje
central de esta metodología es el concepto, ya tratado, de algoritmo.
Un algoritmo es un método para resolver un problema. Aunque la popularización del
término ha llegado con el advenimiento de la era informática, algoritmo proviene de
Mohammed al-Khowarizmi, matemático persa que vivió durante el siglo IX y alcanzo gran
reputación por el enunciado de las reglas para sumar, restar, multiplicar y dividir números
decimales; la traducción al latín del apellido de la palabra algorismus derivo posteriormente
en algoritmo. Euclides, el gran matemático griego (del siglo IV antes de Cristo) que invento
un método para encontrar el máximo común divisor de dos números, se considera con Al-
Khowarizmi el otro gran padre de la algoritmia (ciencia que trata de los algoritmos).
El profesor Niklaus Wirth, inventor de Pascal, Modula-2 y Oberon, titulo uno de sus mas
famosos libros, Algoritmos + Estructuras de Datos = Programas, significándonos que solo
se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta
estructura de datos. Esta ecuación será de una de las hipótesis fundamentales consideradas
en esta obra.
La resolución de un problema exige el diseño de un algoritmo que resuelva el problema
propuesto.
Los pasos para la resolución de un problema son:
1. Diseño de algoritmo, que describe la secuencia ordenada de pasos que conducen a la
solución de un problema dado. (Análisis del problema y desarrollo del algoritmo).
2. Expresar el algoritmo como un programa de lenguaje de programación adecuado.
(Fase de codificación.)
3. Ejecución y validación del programa por la computadora.

Para llegar a la realización de un programa es necesario el diseño previo de algoritmo, de


modo que sin algoritmo no puede existir un programa.
Los algoritmos son independientes tanto del lenguaje de programación en que se expresan
como de la computadora que lo ejecuta. En cada problema el algoritmo se puede expresar
en un lenguaje diferente de programación y ejecutarse en una computadora distinta; sin
embargo, el algoritmo será siempre el mismo. Así, por ejemplo, en una analogía con la vida
diaria, una receta de un plato de cocina se puede expresar en español, ingles o francés, pero
cualquiera que sea el lenguaje, los pasos para la elaboración del plato se realizaran sin
importar el idioma del cocinero.
En la ciencia de la computación y en la programación, los algoritmos son más importantes
que los lenguajes de programación o las computadoras. Un lenguaje de programación es tan
solo un medio para expresar un algoritmo y una computadora es solo un procesador para
ejecutarlo. Tanto el lenguaje de programación como la computadora son los medios para
obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso
correspondiente.
Dada la importancia del algoritmo en la ciencia de la computación, un aspecto muy
importante será el diseño de algoritmos. El diseño de la mayoría de los algoritmos requiere
creatividad y conocimientos profundos de la técnica de la programación. En esencia, la
solución de un problema se puede expresar mediante un algoritmo.
Características de los Algoritmos:
Las características fundamentales que debe cumplir todo algoritmo son:
 Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.
 Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el
mismo resultado cada vez.
 Un algoritmo debe ser finito. Si se sigue un algoritmo se debe terminar en algún
momento; o sea, debe tener un numero finito de pasos.

La definición de un algoritmo debe definir tres partes: Entrada, Proceso y Salida. En el


algoritmo de receta de cocina citado anteriormente se tendrá:
Entrada: ingrediente y utensilios empleados.
Proceso: elaboración de la receta en la cocina.
Salida: terminación del plato (por ejemplo, cordero).
Ejemplo de Algoritmo:
Un cliente ejecuta un pedido a una fábrica. Esta examina en su banco de datos la ficha del
cliente; si el cliente es solvente entonces la empresa acepta el pedido; en caso contrario
rechazara el pedido. Redactar el algoritmo correspondiente.
Los pasos del algoritmo son:
1. inicio
2. leer el pedido
3. examinar la ficha del cliente
4. si el cliente es solvente aceptar pedido; en caso contrario, rechazar pedido
5. fin
Diseño del Algoritmo:
En la etapa de análisis del proceso de programación se determina que hace el programa. En
la etapa de diseño se determina como hace el programa la tarea solicitada. Los métodos
mas eficaces para el proceso de diseño se basan en el conocido por Divide y Vencerás, es
decir, la resolución de un problema complejo se realiza dividiendo el problema en sub
problemas y a continuación dividir estos sub problemas en otros de nivel mas bajo, hasta
que pueda ser implementada una solución en la computadora. Este método se conoce
técnicamente como diseño descendente (Top Down) o modular. El proceso de romper el
problema en cada etapa y expresar cada paso en forma más detallada se denomina
refinamiento sucesivo.
Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo
punto de entrada y un solo punto de salida.
Cualquier programa bien diseñado consta de un programa principal (el modulo de nivel
mas alto) que llama a sub programas (módulos de nivel mas bajo) que a su vez pueden
llamar a otros sub programas. Los programas estructurados de esta forma se dice que
tienen un diseño modular y el método de romper el programa en módulos más pequeño se
llama Programación Modular. Los módulos pueden ser planeados, codificados,
comprobados y depurados independientemente (incluso por diferentes programadores) y a
continuación combinarlos entre si. El proceso implica la ejecución de los siguientes pasos
hasta que el programa se termina:
 programar modulo.
 Comprobar el modulo.
 Si es necesario, depurar el modulo.
 Combinar el modulo con los módulos anteriores.

El proceso que convierte los resultados del análisis del problema en un diseño modular con
refinamiento sucesivo que permitan una posterior traducción al lenguaje se denomina
diseño de algoritmo.
El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a
codificar posteriormente.
4. Análisis De Algoritmos
Recursos De Computadores Y Complejidad
Algoritmo: Conjunto de reglas para resolver un problema. Su ejecución requiere unos
recursos.
Un algoritmo es mejor cuantos menos recursos consuma, su facilidad de programarlo,
corto, fácil de entender, robusto, etc.
Criterio empresarial: Maximizar la eficiencia.
Eficiencia: Relación entre los recursos consumidos y los productos conseguidos.
Recursos consumidos:
Tiempo de ejecución.
Memoria principal:
Entradas/salidas a disco.
Comunicaciones, procesadores, etc.
Lo que se consigue:
Resolver un problema de forma exacta, forma aproximada o algunos casos.
Recursos consumidos:
Ejemplo. ¿Cuántos recursos de tiempo y memoria consume el siguiente algoritmo sencillo?
i:= 0
a[n+1]:= x
repetir
i:= i + 1
hasta a[i] = x
Respuesta: Depende.
¿De qué depende? De lo que valga n y x, de lo que haya en a, de los tipos de datos, de la
máquina...
En general los recursos dependen de:
Factores externos.
El ordenador donde lo ejecutemos: 286, Pentium III, Cray,...
El lenguaje de programación y el compilador usado.
La implementación que haga el programador del algoritmo. En particular, de las
estructuras de datos utilizadas.
Tamaño de los datos de entrada.
Ejemplo. Calcular la media de una matriz de NxM.
Contenido de los datos de entrada.
Mejor caso. El contenido favorece una rápida ejecución.
Peor caso. La ejecución más lenta posible.
Caso promedio. Media de todos los posibles contenidos.
Los factores externos no aportan información sobre el algoritmo.
Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo
respecto al tamaño de la entrada y a los posibles casos, de forma aproximada (y
parametrizada).
externos no aportan información sobre el algoritmo.
Normalmente usaremos la notación T(N)=..., pero ¿qué significa T(N)?
Tiempo de ejecución en segundos. T(N) = bN + c.
Suponiendo que b y c son constantes, con los segundos que tardan las operaciones básicas
correspondientes.
Instrucciones ejecutadas por el algoritmo. T(N) = 2N + 4.
¿Tardarán todas lo mismo?
Ejecuciones del bucle principal. T(N) = N+1.
¿Cuánto tiempo, cuántas instrucciones,...?
Sabemos que cada ejecución lleva un tiempo constante, luego se diferencia en una
constante con los anteriores.
Asignación de tiempos, para el conteo de instrucciones. Algunas reglas básicas.
Operaciones básicas (+, -, *, :=,...): Una unidad de tiempo, o alguna constante.
Operaciones de entrada salida: Otra unidad de tiempo, o una constante diferente.
Bucles FOR: Se pueden expresar como una sumatoria, con los límites del FOR.
IF y CASE: Estudiar lo que puede ocurrir. Mejor caso y peor caso según la condición. ¿Se
puede predecir cuándo se cumplirán las condiciones?
Llamadas a procedimientos: Calcular primero los procedimientos que no llaman a otros.
Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir. ¿Existe una cota inferior y
superior del número de ejecuciones? ¿Se puede convertir en un FOR?
El análisis de algoritmos también puede ser a posteriori: implementar el algoritmo y contar
lo que tarda para distintas entradas.
Ejemplo. Programa "cifras.exe":
N= 4, T(4)= 0.1 ms
N= 5, T(5)= 5 ms
N= 6, T(6)= 0.2 s
N= 7, T(7)= 10 s
N= 8, T(8)= 3.5 min
¿Qué conclusiones podemos extraer?
Análisis a priori: Evitamos la implementación, si el algoritmo es poco eficiente. Podemos
hacer previsiones. Podemos comparar con otros algoritmos.
Medidas Asintoticas
Notación asintótica:
El tiempo de ejecución T(n) está dado en base a unas constantes que dependen de factores
externos.
Nos interesa un análisis que sea independiente de esos factores.
Notaciones asintóticas: Indican como crece T, para valores suficientemente grandes
(asintóticamente) sin considerar
constantes.
O(T): Orden de complejidad de T.
W (T): Orden inferior de T, u omega de T.
Q (T): Orden exacto de T.
Orden de complejidad de f(n): O(f)
Dada una función f: N ® R+, llamamos orden de f al conjunto de todas las funciones de N
en R+ acotadas superiormente por un múltiplo real positivo de f, para valores de n
suficientemente grandes.
O(f)= { t: N ® R+ / $ c Î R+, $ n0 Î N, " n ³ n0: t(n) £ c·f(n) }
Nota:
O(f) es un conjunto de funciones, no una función.
"Valores de n sufic. Grandes...": no nos importa lo que pase para valores pequeños.
"Funciones acotadas superiormente por un múltiplo de f...": nos quitamos las constantes.
La definición es aplicable a cualquier función de N en R, no sólo tiempos de ejec.
Propiedades
P1. Si f Î O(g) y g Î O(h) entonces f Î O(h).
Si f Î W (g) y g Î W (h) entonces f Î W (h)
Ej. 2n+1 Î O(n), n Î O(n2) Þ 2n+1 Î O(n2)
P2. Si f Î O(g) entonces O(f) Í O(g).
¿Cómo es la relación para los W ?
P3. Dadas f y g de N en R+, se cumple:
i) O(f) = O(g) Û f Î O(g) y g Î O(f)
ii) O(f) Í O(g) Û f Î O(g)
¿La relación de orden entre O(..) es completa? Dadas f y g, ¿se cumple O(f)Í O(g) ó O(g)Í
O(f)?
P4. Dadas f y g, de N en R+, O(f+g) = O(max(f, g)).
W (f+g) = W (max(f+g))
¿Y para los Q (f+g)?
¿Es cierto que O(f - g) = O(max(f, -g))?
P5. Dadas f y g de N en R+, se cumple:
i) limn¥ ® f(n) Î R+ Þ O(f)=O(g), W (f)=W (g), Q (f)=Q (g)
g(n)
ii) limn¥ ® f(n) = 0 Þ O(f) Í O(g), W (g) Í W (f)
g(n)
P5. Ej. ¿Qué relación hay entre O(log2 n) y O(log10 n)?
P6. Dadas f y g de N en R+, O(f)=O(g) Û Q (f)=Q (g) Û f Î Q (g) Û W (f)=W (g)
P7. Dadas f y g de N en R+, se cumple:
i) limn¥ ® f(n) Î R+ Þ O(f) = O(g)
g(n)
ii) limn¥ ® f(n) = 0 Þ O(f) Ì O(g)
g(n)
iii) limn¥ ® f(n) = +¥ Þ O(f) É O(g)
g(n)
Notación con varios parámetros:
En general, el tiempo y la memoria consumidos pueden depender de muchos parámetros.
f: Nm ® R+ (f: Nx...m..xN ® R+)
Ej. Memoria en una tabla hash. M(B,n, l, k) = kB+l+n+2kn
Orden de complejidad de f(n1, n2, ..., nm): O(f)
Dada una función f: Nm ® R+, llamamos orden de f al conjunto de todas las funciones de
Nm en R+ acotadas superiormente por un múltiplo real positivo de f, para valores de (n1,
..., nm) suficientemente grandes.
O(f)= { t: Nm ® R+ / $ c Î R+, $ n1, n2, .., nm Î N, " k1 ³ n1 ,
k2 ³ n2 ,..," km ³ nm : t(k1, k2, ..., km) £ c·f(k1, k2, ..., km) }
De la misma forma, podemos extender los conceptos de W (f) y Q (f), para funciones con
varios parámetros.
Las propiedades se siguen cumpliendo ® Demostrarlo.
Ejemplo. T(N) = T(N, a, b) = a·N + b
El tiempo depende del tamaño del problema N, y del tiempo de inicialización b y de
ejecución de un paso a.
Podemos suponerlos constantes T(N), o variables T(N,a,b).
¿Qué relación hay entre los siguientes órdenes?
O(n+m), O(nm) O(n2), O(n+2m)
Notaciones condicionales:
En algunos casos interesa estudiar el tiempo sólo para ciertos tamaños de entrada.
Ejemplo. Algoritmo de búsqueda binaria: Si N es potencia de 2 el estudio se simplifica.
Orden condicionado de f(n): O(f | P)
Dada una función f: N ® R+, y P: N ® B, llamamos orden de f según P (o condicionado a P)
al conjunto:
O(f | P)= { t: N ® R+ / $ c Î R+, $ n0 Î N, " n ³ n0:
P(n) Þ t(n) £ c·f(n) }
De igual forma, tenemos W (f | P) y Q (f | P).
O(f) = O(f | true). Para cualquier f y g, f Î O(g | false).
¿O(f) « O(f | P)?
Ordenes De Complejidad
Uso de los órdenes de complejidad:
Dado un tiempo t(n), encontrar la función f más simple tal que t Î O(f), y que más se
aproxime asintóticamente.
Ejemplo. t(n) = 2n2/5 + 3p /2; t(n) Î O(n2).
•Relación de orden entre O(..) = Relación de inclusión entre conjuntos.
–O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f), t Î O(g)
•Se cumple que:
O(c) = O(d), siendo c y d constantes positivas.
O(c) Ì O(n)
O(cn + b) = O(dn + e)
O(p) = O(q), si p y q son polinomios del mismo grado.
O(p) Ì O(q), si p es un polinomio de menor grado que q.
Orden inferior u omega de f(n): W (f):
Dada una función f: N ® R+, llamamos omega de f al conjunto de todas las funciones de N
en R+ acotadas inferiormente por un múltiplo real positivo de f, para valores de n
suficientemente grandes.
W (f)= { t: N ® R+ / $ c Î R+, $ n0 Î N, " n ³ n0: t(n) ³ c·f(n) }
La notación omega se usa para establecer cotas inferiores del tiempo de ejecución.
Relación de orden: igual que antes.
Orden exacto de f(n): Q (f):
Dada una función f: N ® R+, llamamos orden exacto de f al conjunto de todas las funciones
de N en R+ que crecen igual que f, asintóticamente y salvo constantes.
Q (f) = O(f) Ç W (f)
= { t: N ® R+ / $ c, d Î R+, $ n0 Î N, " n ³ n0: c·f(n) ³ t(n) ³ d·f(n) }
Notación o pequeña de f(n): o(f):
Dada una función f: N ® R+, llamamos o pequeña de f al conjunto de todas las funciones de
N en R+ que crecen igual que f asintóticamente:
o(f)= { t: N ® R+ / lim t(n)/f(n) = 1}n¥ ®
Esta notación conserva las constantes multiplicativas para el término de mayor orden.
Ejemplo. t(n) = amnm + am-1nm-1 + ... +a1n + a0
t(n) Î o(amnm) ¹ o(nm)
¿o(amnm) Í O(amnm)? ¿o(t) Í O(t)?
Costa de complejidad con frecuencia
Algunas relaciones entre órdenes frecuentes:
O(1) Ì O(log n) Ì O(n) Ì O(n·log n) Ì O(n·(log n)2) Ì O(n1.001...) Ì O(n2) Ì O(n3) Ì ... Ì O(2n)
Ì O(n!) Ì O(nn)
¿Qué pasa con las omegas? ¿Y con los órdenes exactos?
El orden de un polinomio anxn+...+a1x+a0 es O(xn).
nnn
å 1 = n Î O(n); å i = n(n+1)/2 Î O(n2); å im Î O(nm+1)
i=1 i=1 i=1
Si hacemos una operación para n, otra para n/2, n/4, ..., aparecerá un orden logarítmico
O(log2 n). Los logaritmos son del mismo orden, independientemente de la base.
5. Técnica de diseño de algoritmos
Diseño de Algoritmos:
Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar
algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación
.Es necesario en este momento mencionar algo sobre como hacerlo. El acto de diseñar un
algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo
automatizada.
Todo problema algorítmico es un reto para su diseñador, algunos resultan inmediatos de
resolver, otros son bastante complejos. La investigación en esta área ha permitido descubrir
un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la
realización de muchos algoritmos.
No obstante, y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de
estos esquemas que realizar un diseño desde cero, idear un algoritmo continua siendo una
labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene
un papel fundamental.
El diseño de un algoritmo que resuelva un problema es, en general, una tarea difícil. Una
forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de
algoritmos, se decir, a esquemas muy generales que pueden adaptarse a un problema
particular al detallar las partes generales del esquema.
Muchos problemas pueden resolverse buscando una solución fácil y directa pero, a la vez
bastante ineficiente. Este método, llamado de fuerza bruta, puede ser muy directo, pero con
un poco de análisis puede encontrarse algoritmos más eficientes. El esquema mas sencillo
quizás sea el llamado divide y vencerás, basado en la descomposición de un problema en
subproblemas. Otros esquemas requieren un análisis minucioso del problema de forma que
la solución se vaya construyendo en etapas. Si puede preverse que decisión conviene en
cada etapa para producir cierto tipo de mejor resultado, tenemos una solución voraz, si la
decisión en una etapa, solo puede tomarse tras considerar varias soluciones de otras etapas
mas simples, la solución es dinámica. Aun así, hay problemas cuya solución no puede
hallarse sino mediante un proceso de búsqueda, a pesar de lo complejas que son las
operaciones de búsqueda, su uso adecuado mediante el esquema de búsqueda con retroceso
(o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. Por
ultimo, conviene conocer otros métodos de diseño de algoritmos que también resultan de
utilidad práctica.
Nos estamos refiriendo a métodos basados en la mejora de la eficiencia (por ejemplo, el uso
de parámetros de acumulación al resolver problemas utilizando divide y vencerás, y el
empleo de tablas como estructura auxiliar para la resolución eficiente de problemas donde
se aplica programación dinámica), y a métodos basados en transformaciones del dominio
para encontrar una solución mas fácilmente a un problema en un dominio transformado,
siendo dicha solución finalmente adaptada al dominio original.
Consideraciones generales
Si el hábil programador dispone de un recetario de algoritmos de donde poder seleccionar
el más adecuado para cada problema, su tarea se simplifica.
Supongamos que disponemos de una especificación precisa, completa y consistente del
problema a resolver y queremos obtener un algoritmo en el que, dados uno datos de
entrada valido, se produzca cierto resultado. Si no nos importa la eficiencia del algoritmo,
podríamos utilizar un algoritmo general llamado algoritmo del museo británico. Se
programa un computador de manera que parta de un conjunto de axioma matemáticos y los
que use para reducir aleatoriamente teoremas validos.
Aprender los principios básicos del diseño de algoritmos podemos preguntarnos por un
método aceptable. El mas entendido, y quizás el mejor, es organizar el diseño sobre un
esquema de algoritmo o una técnica de diseño que haya demostrado su utilidad para otros
problemas. Este método de trabajo es practicable, puesto que existe un número reducido de
esquema y técnicas de diseño.
El conocimiento de técnicas de diseño es solo un primer paso para el diseñador, que debe
completarse con otros
conocimientos y, sobre todo, con la experiencia.
Método de fuerza bruta
Comenzamos el estudio de esquemas algorítmicos con un método sencillo, pero que debe
evitarse siempre que se pueda, dad su ineficacia; la fuerza bruta. En realidad, no es un
esquema algorítmico, si no mas bien calificativo
Para una forma de diseñar algoritmos: tomar una solución directa, poco reflexionada. En
principio, esto no es malo, pero dado que no se ha analizado apenas el problema, es muy
probable que no se hayan aprovechado propiedades deducibles del problema y que la
solución sea terriblemente ineficiente.
Una solución por fuerza bruta también puede resultar adecuada como primera
aproximación a la solución final, porque su desarrollo puede permitir profundizar más
sobre el problema y conocer propiedades que sean utilizadas para obtener otra versión más
eficiente.
Por ejemplos:
Algunos algoritmos de búsqueda de un elemento en un vector. Uno de ellos realizaba una
búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con
cualquier vector. Otro algoritmo realizaba un búsqueda dicotomica o binaria, con
complejidad logarítmica, y solo se podía usar cuando el vector estuviese ordenado. El
algoritmo primero responde a un razonamiento más sencillo, por lo que uno puede sentirse
tentado a usar siempre. Esta es la solución de fuerza bruta: una solución directa, pero poco
reflexionada. Lo más razonable es comprobar si el vector esta ordenado y, en caso positivo,
aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria.
Técnicas de los Parámetros Acumuladores y de Tabulacion
La recurcion es un mecanismo que permite obtener, en combinación con otras
contrucciones, una solución funcional a muchos problemas. Muchos algoritmos recursivos
resultan eficientes, pero no todos: hay algunos fácilmente formulables, pero muy
ineficientes. En estos casos, dichos algoritmos pueden servir como una primera
aproximación al algoritmo definitivo, pero debe mejorar su rendimiento para que sea
práctico.
Veremos dos parámetros para la mejora de eficiencia de algoritmos recursivos: el uso de
parámetros acumuladores y el uso de tablas. Cada una se ilustra con un ejemplo distinto.
Parámetros Acumuladores
Veamos primero una solución ineficiente que intentaremos mejorar.
Ejemplo: Números de Fibonacci
Los números de fibonacci suele especificarse como:
Fib(0)=1
Fib(1)1
Fib(n+2)=fib(n)+fib(n+1)
Esta especificación de los números de fibonacci tienen una formulación recursiva inmediata
en estilo funcional.
Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores,
cuya idea básica se expone a continuación. La función principal usa una función auxiliar
que tiene los parámetros de aquellas más algunos adicionales. La función principal
simplemente realiza una llamada a esta función auxiliar en los que los parámetros de
aquellas se modifican y los parámetros nuevos toman un valor inicial adecuado .
Los parámetros adicionales tienen como misión ir acumulando resultados principales
durante el proceso recursivo.
Tabulacion
No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los
parámetros acumuladores.
Otra técnica útil es el uso de tablas.
La intención es que la primera vez que se realiza un cálculo, se almacena en una tabla,
donde puede consultarse otras veces que se necesite. Esta técnica también se suele emplear
con la programación dinámica.
Ejemplo:
Sea el problema de la competición. Hay dos participantes (deportistas o equipos, no
importa que), A,B, que juegan una competición que es ganada por el primero que venza en
n partidos, siendo ( n ) mayor que( 0 ).
Por sencillez , se supone que ambos participantes tienen cualidades y preparación similar .
De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. De todas
formas, la modificación para incorporar probabilidades diferentes es evidente y no
complica el problema.
Divide y vencerás:
Consiste en descomponer un problema en un subproblema, resolver independientemente
los subproblemas para luego combinar sus soluciones y obtener la solución del problema
original. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de
matrices, la ordenación de vectores, la búsqueda en estructuras ordenadas,etc.
Ejemplo. Búsqueda de una palabra en un diccionario
Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de
una palabra en un diccionario de acuerdo con el siguiente criterio.
Se abre el diccionario por la pagina centrar(quedando dividido en dos mitades) y se
comprueba si la palabra aparece allí o si es léxico gráficamente anterior o posterior. Si no ha
encontrado y es anterior se procede a buscarla en la primera mitad., si es posterior, se
buscara en la segunda mitad. El procedimiento se repite sucesivamente hasta encontrar la
palabra o decidir que no aparece.
Método voraz:
Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones
candidatas .Para ello, se va procedimiento paso a paso realizándose la mejor elección
(usando una función objetivo que respeta un conjunto de restricciones ) de entre las
posibles. Puede emplearse en problemas de optimización, como el conocido de la mochila,
en la búsqueda de caminos mínimos sobre grafos, la planificación en el orden de la
ejecución de unos programas en un computador,etc.
Ejemplo. Dar un cambio utilizando el menor número de monedas
Considérese ahora el problema de la devolución del cambio al realizar una compra (por
ejemplo, en una maquina expendedora de tabaco). Suponiendo que se disponga de cantidad
suficiente de ciertos tipos diferentes de monedas de curso legal, se trata de dar como
cambio la menor cantidad posible usando estos tipos de monedas. La estrategia voraz
aplicada comienza devolviendo, cuando se pueda, la moneda de mayor valor ( es decir,
mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar), continua
aplicándose el mismo criterio para la segunda moneda mas valiosa, y así sucesivamente. El
proceso finaliza cuando se ha devuelto todo el cambio.
Consideraciones y Criterios para Diseñar Algoritmos
Algunas consideraciones estilísticas pueden contribuir a mejor la calidad de los algoritmos
(y programas ) mediante la reducción del numero de errores que aparecen al desarrollar
los. También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y
entender para otras personas.
Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación.
Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse
fácilmente en caso de necesidad. Generalmente, estas normas de estilo se dirigen hacia
aspectos como la forma de construir los nombres de variables o tipo de datos que
aparezcan., la tipografía seguida ala hora de escribir nombres de variables, subprogramas,
palabras claves, etc. El modo de encolumnar las distintas partes de un algoritmo para
facilitar su lectura y comprensión, y la normas sobre como y donde deben de introducirse
los comentarios.
Estilo y calidad de los programas van fuertemente unidos. Ante la pregunta ¿Cuáles son las
característica de un buen algoritmo?, las siguientes respuestas reflejan, cierta medida, los
factores que identifican la calidad en ellos .
1. Corrección, el algoritmo debe funcionar.
2. Nunca se debe olvidar que la característica más simple e importante de un algoritmo
es que funcione. Pude aparecer obvio, pero resulta difícil de asegurar en algoritmos
complejos.
3. Eficiencia, el algoritmo no debe desaprovechar recursos. La eficiencia de un algoritmo
se mide por los recursos que este consume. En particular, se habla de la memoria y
del tiempo de ejecución . A pesar de que con la reducción de los costes del hardware
es posible diseñar computadores más rápidos y con más memoria, no hay que
desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes.
4. Claridad, el algoritmo debe estar bien documentación. La documentación ayuda a
comprender el funcionamiento de los algoritmos. Ciertos detalles o algunas partes
especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están
adecuadamente comentadas.

En realidad, y de acuerdo con los puntos de vista anteriores, la calidad de un algoritmo


tiene muchas facetas y todas ellas importantes. Resumiendo, lo ideal es que nuestro
algoritmo resulte correcto, eficiente, claro, fiable y fácil de mantener.
Algoritmos voraces
Esquema voraz
Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que
satisfaga ciertas restricciones y que optimice alguna medida. Se supone que un problema de
esta clase tiene al menos una solución. Puede haber varias soluciones optimas, en cuyo caso
no importa cual se elija. Por ejemplo, sea el problema de encontrar un subconjunto de los
arcos de un grafo. Otro ejemplo se da cuando, dados unos ficheros almacenados en una
cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio.
A menudo, el problema incluye restricciones adicionales que limitan el número posible de
soluciones.
Normalmente, estos problemas no se intentan resolver "de golpe ", encontrando de una sola
vez la solución completa y óptima. Es más frecuente que el subconjunto de la solución se
vaya formando paso a paso, analizando durante cada etapa que elemento conviene añadir a
la solución parcial ya existente. La dificultad principal para resolver esta clase de problemas
estriba en el análisis necesario para poder formular un algoritmo que halle la solución en
varios pasos.
Un algoritmo voraz sigue el esquema anterior, pero con la fortuna de que cada vez que
añade un elemento a la solución se tiene la certeza de haber realizado la mejor elección
posible. Esta característica hace que aunque el análisis del problema sea arduo, la solución
voraz siempre resulte sencilla. La única complicación es comprobar que se siguen
satisfaciendo las restricciones del problema.
Por lo que se ha descrito del esquema voraz, éste es un proceso repetitivo sencillo que trata
sucesivamente los diferentes elementos del problema. Para facilitar la descripción de este
proceso, puede llamarse candidato al elemento tratado en cada paso. Inicialmente, el
conjunto de candidatos que forman la solución está vacío. En cada paso se intenta añadir el
mejor de los candidatos restantes a dicha solución parcial. Si este conjunto ampliado sigue
siendo válido, es decir, si satisface las restricciones del problema y, por tanto, permite
formar una solución del problema, el candidato se incorpora definitivamente. Al contrario,
si dicho conjunto no es válido, se desecha el candidato. Si el algoritmo voraz se ha diseñado
correctamente, la primera solución encontrada es óptima. Por tanto, la dificultad principal
al diseñar un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de
selección que garantice la optimalidad de la solución.
Según esta descripción, el problema parte de:
 Una función objetivo que da el valor de una solución. Obviamente, ésta es la función por
optimizar.
 Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solución
final del problema.
A su vez, la solución consta de:
 Un conjunto de candidatos
 Una función de selección que en cada momento determine que candidato de los aún no
usados parece ser el mejor.
 Una función que determine si cierto conjunto de candidatos es válido; es decir, si
permite formar alguna solución del problema.

Obsérvese que las funciones de validez y completitud no se preocupan de la optimalidad del


la solución, pero si la función de selección es la adecuada, cada solución válida y completa
es optima.
Podemos representar el esquema voraz de la siguiente forma funcional:
FUNCTION Voraz ( candidatos: ( 1..n ) : ( 1..n) ->
FUNCTION VorazAcumulador ( candidatos : (1..n),
Solución : (1..n) : (1..n) ->
Cadidatos = ( ) v EsSolución ( solución)->
Value siguiente -> seleccionar ( candidatos )
IN
EsVálida (solución v ( siguiente)) =>
VorazAcumulador (candidatos – (solución), solución v (siguiente))
VorazAcumulador (candidatos – (siguiente), solución)
VorazAcumulador (candidatos, ( ) )
Puede verse por qué estos algoritmos se llaman " voraces " : en cada paso toman el mejor
trozo de la solución; es decir, el mejor candidato. Además, nunca cambian de opinión: una
vez que un candidato es aceptado o rechazado en la solución, la decisión, es definitiva.
La función objetivo no suele aparecer en el algoritmo final, sino que se utiliza durante el
análisis del problema y es determinante en la elección de la función de selección. De todas
formas, debe recordarse que puede haber varios criterios alternativos de selección y que de
su correcta elección depende que la solución calculada por el algoritmo sea optima.
Como ejercicio, el lector puede intentar encontrar una solución voraz del problema del
calendario. Es fácil encontrar una solución si en cada etapa se genera el subcalendario
correspondiente a un equipo; es decir, la tabla de competición se va completando por filas.
Como fila primera se toma la secuencia de los índices de los participantes en cualquier
orden. Cada fila resultante puede tener una complejidad de o (n2). Además, este algoritmo
tiene la ventaja de valer para las situaciones en que el número de participantes no es una
potencia de dos.
Desglose en monedas
Como primer ejemplo introductorio sencillo al que puede aplicarse la técnica voraz, se
considera el problema de un cambio o desglose en monedas. Hay que desglosar una
cantidad en un conjunto de monedas tratando de cumplir alguna condición; en este caso,
utilizar el menor número de monedas. Para ello, se parte de un conjunto de tipos de
monedas válidas, de las que se supone que hay cantidad suficiente para realizar el desglose,
y de un importe. Se trata de indicar la cantidad (menor) de monedas de los tipos
considerados, tales que sumados sus valores equivalgan al importe.
Para simplificar, suponemos que manejamos dinero español y, en particular, podemos
utilizar sólo monedas de 500, 100, 50, 25, 5 y 1 pesetas para el desglose. Estos valores se
definen por medio de un tipo enumerado MONEDAS. Asimismo, se declaran los tipos
VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la
cantidad de cada tipo de moneda que se devolverá en el desglose. Su declaración es la
siguiente:
TYPE
Monedas -> M500 I M100 I M50 I M25 I M5 I M1,
Valores -> Integer M500…M1
Cantidades -> Integer M500….M1
Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. Los
elementos de la técnica voraz están presentes en este problema de la siguiente forma:
 El conjunto de candidatos está constituido por cada una de las monedas de los
diferentes tipos que se pueden usar para realizar el desglose del importe dado.
 Una solución viene dad por un conjunto de monedas devuelto tras el desglose, y cuyo
valor total es igual al importe a desglosar.
 La condición de factibilidad de la solución siendo construida establece en el desglose
debe ser menor o igual que el importe a desglosar.
 La función de selección establece que hay que elegir, mientras sea posible, la moneda de
mayor valor de entre las candidatas.
 La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el
desglose.

Con esta información se puede comprobar que en este problema están presentes los
distintos elementos de la técnica voraz. Además, cuando un candidato (moneda) se
incorpora al conjunto solución, éste no será nunca excluido de él.
Divide Y Vencerás
La técnica divide y vencerás consiste en descomponer el problema en un conjunto de
subproblemas más pequeños. Después se resuelven estos subproblemas y se combinan las
soluciones para obtener la solución para el problema original.
Esquema de Divide y vencerás.
La técnica de divide y vencerás es quizás una de las utilizadas debido a su sencillez: si un
problema es demasiado grande para resolverlo de una vez, se descompone en varias partes
más fáciles de resolver. Mas formalmente, dado un problema al resolver planteando en
términos de una entrada de tamaño n, la técnica de divide y vencerás parte la entrada en k
subproblemas, 1<k<=n. Estos subproblemas se resuelven independientemente y después se
combinan sus soluciones parciales para obtener la solución del problema original. Este
esquema de partición de problemas se denomina esquema de divide y vencerás solo en el
caso en que los problemas sean de la misma clase del problema original. Esta restricción
permite una formulación y resolución recursiva de los subproblemas. Por supuesto, deben
existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente; en caso
contrario, el proceso recursivo nunca terminaría.
El caso más frecuente es cuando el número de subproblemas es dos. Veamos el esquema de
divide y vencerás para dos subproblemas; es fácil su generalización a k subproblemas
2<k<=n. Su formación funcional es como sigue, considerado el problema como de tipo dato
y la solución, de tipo resultado:
TYPEVAR
Dato, resultado
FUNCTION DivideYVenceras (problema : dato) : resultado ->
EsPequeño (problema) }=>
ResolverDirectamente (problema)
|
VALUE subproblemas -> Partir (problema)
IN subproblemas == (subproblema1, subproblema2) =>
Combinar (DivideYVenceras (subproblema1) ,
DivideYVenceras (subproblema2))
Se puede hacer una formulación imperativa similar. Sin embargo, escribiremos una
formulación más restrictiva pero bastante usual, en la que se utiliza un vector de tamaño N.
TYPEVAR
dato, resultado
PROCEDURE DivideYVenceras (IN problema : dato1..n,
OUT solución : resultado) ->
PROCEDURE DyVAux (IN problema : dato1..n,
IN inferior, superior : 1..N,
OUT solución : resultado) ->
VAR
medio: 1..N
subsolucion1, subsolucion2 : resultado
IF EsPequeño (inferior, superior) THEN
ResolverDirectamente (problema, inferior, superior, olución)
ELSE
Medio := Partir (inferior, superior);
DyVAux (problema, inferior, medio, subsolucion1);
DyVAux (problema, medio+1, superior, subsolucion2);
Combinar (subsolucion1, subsolucion2, solución)
DyVAux (problema, 1, N, solución)
El esquema general se adapta a un problema concreto al sustituir los metasimbolos
EsPequeño, ResolverDirectamente, Partir y Combinar por funciones o procedimientos
concretos.
Si el tamaño de los dos subproblemas es el mismo (o casi), el tiempo de cómputo de la
función DivideYVecneras se describe con la siguiente relación de recurrencia:
g(n),si n es pequeño
T(n) = 2 T(n/2) + f(n), en caso contrario
donde T(n) es la función de tiempo de DivideYVenceras para entradas de tamaño n, g(n) es
el tiempo que tarda la función ResolverDirectamente en resolver problemas de pequeño
tamaño (normalmente una constante) y f(n) es el tiempo necesario para partir el problema
y combinar las subsoluciones. La eficiencia final del algoritmo depende de la función f(n)
concreta que aparezca durante el análisis. Nótese que, es general, para que esta técnica
resulte eficiente todos los subproblemas deben ser de tamaño parecido.
Elaboración de un Calendario Deportivo:
Sea un campeonato deportivo; para nuestros propósitos resulta indiferente el deporte
objeto de la competición, así que hablaremos de participantes en vez de deportistas o
equipos. El problema consiste en elaborar un calendario de competición de forma que cada
participante compita exactamente una vez con cada uno de los demás participantes. Por
concreción, y sin perdida de generalidad, puede suponerse que las competiciones se
celebran en días sucesivos y que cada participante compite una vez por día.
Para simplificar el problema, se supone que el numero de participantes es una potencia de
dos; es decir, hay n = 2k participantes para algún entero positivo k. Se supone también que
cada participante tiene asignado un número comprendido entre 1 y N. Se necesitan elaborar
n-1 competiciones por participantes. Por tanto, la solución del problema puede
representarse en una tabla de dimensión nx(n-1). El elemento (i,j)–esimo de la tabla, 1<=
i<=n, 1<=j<n, contiene el numero del participante contra el que el participante i-esimo
compite el día j-esimo.
Obsérvese que los números de participantes incluidos en la fila i de la tabla son distintos
porque el participante i-esimo solo debe competir una vez con cada participante restante. A
su vez, la columna j también contiene números distintos, porque el día j-esimo cada
participante solo puede competir con otro participante.
Se dispone de una solución inmediata aplicando fuerza bruta. Primero se obtiene para cada
participante i, 1<=i<=n, el conjunto P(i) de todas las permutaciones posibles del resto de
los participantes con los que debe competir, es decir, el conjunto de permutaciones de los
números {1..n}-{i} ahora se completan las filas de la tabla de todas las formas posibles,
incluyendo en cada fila i algún ejemplo de P(i). Solo sirve como solución aquellas
combinaciones de fila que cumplan las restricciones enunciadas en el párrafo anterior sobre
las columnas de la tabla (las restricciones sobre las filas están garantizadas por el modo de
generar los conjuntos P(i)). Si hay varios calendarios validos, se elige uno cualquiera.
El método de fuerza bruta resulta sencillo, pero es terriblemente ineficiente. Cada conjunto
P(i) consta de (n-1)! Elementos. Dado que el numero de participantes de n, resultan nx(n-
1)!=n! formas de rellenar la tabla.
Sin embargo la aplicación de la técnica de divide y vencerás produce una solución mas
sencillas aun pero muy eficientes. La siguiente figura describe visualmente parte de la
elaboración de la tabla.

días

1 1 2 3 1 2 3 4 5 6 7

participantes 1 2 1 2 3 4 1 2 3 4 5 6 7 8

2 1 2 1 4 3 2 1 4 3 8 5 6 7

3 4 1 2 3 4 1 2 7 8 5 6

4 3 2 1 4 3 2 1 6 7 8 5

5 6 7 8 1 2 3 4

6 5 8 7 4 1 2 3

7 8 5 6 3 4 1 2

8 7 6 5 2 3 4 1

Se distinguen dos casos. El caso básico se da cuando solo hay dos participantes. La solución
es directa porque se celebra una sola competición entre ambos. El caso recursivo, cuando
hay más de dos participantes, es más complejo. Si el numero de participantes es 2k , para
k>1, puede decirse que el "tamaño" del problema es 2k (sabemos que el calendario tendrá
un tamaño de 2k x(2k-1 -1) posiciones). El problema puede reducirse a dos sub problemas
de tamaño 2k-1 si se elaboran independientemente dos subcalendarios de tamaño 2k x(2k-1
-1): uno para los participantes, de numeración comprendida entre 1 y 2k-1 y otro para los
participantes comprendidos entre 2k-1 +1 y 2k . Sin embargo, la unión de estos
subcalendarios no forma un calendario completo para el campeonato de 2k participantes,
ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1), faltando 2k x2k-1
celdas para completar el calendario total. En efecto, faltan por elaborar las competiciones
cruzadas entre los participantes de numeración inferior y los de numeración superior.
Por fortuna, el resto del calendario se puede construir fácilmente. Completemos primero la
parte de los participantes de numeración inferior. El subcalendario del primer participante
es sencillo porque basta con que compita en días sucesivos con los participantes de
numeración, superior en orden creciente de numeración; es decir, sucesivamente con los
participantes 2k-1 +1,….,2n . El siguiente participante toma esta secuencia y realiza una
fácil permutación de la misma que le garantiza el respeto de las restricciones de la solución;
por ejemplo, rotando dicha secuencia a la derecha. Este proceso se repite para el resto de
los participantes de numeración inferior. El calendario de los participantes de numeración
superior se completa de forma similar con los números de los participantes de numeración
inferior.
El algoritmo descrito se expresa a continuación.
PROCEDURE Calendario ( INOUT tabla : (1..N)1..N,1..N-1) ->
PROCEDURE FormaTabla (IN inf : 1..N,
IN sup :1..N,
OUT tabla : (1..N) 1..N,1..N-1) ->
VAR
medio : 1..N
IF inf = sup-1 THEN
tablainf.1 : = sup;
tablasup.1 := inf
ELSE
medio := (inf + sup) Div 2;
FormarTabla (inf, medio, tabla);
FormarTabla (medio+1, sup, tabla);
CompletarTabla (inf, medio, medio,sup-1, medio+1, tabla);
CompletarTabla (medio+1, sup, medio, sup-1, inf, tabla)
Este sistema de ecuaciones defina una función de tiempo del orden de O(n2), que es mucho
mas eficiente que la solución de fuerza bruta.
Veamos otra estrategia, también de orden de complejidad cuadrática, donde se aplica divide
y vencerás para resolver el problema y que se aprovecha de la simetría de la solución. La
idea consiste en añadir inicialmente a la tabla una columna "ficticia" de índice j=0, que
almacena los índices de las filas. Después se genera, mediante divide y vencerás, la mitad
izquierda de la tabla. Finalmente se completa la mitad derecha de la tabla (correspondiente
al cruce de los dos grupos de equipos cuyos subcalendarios se han generado por divide y
vencerás). En esta última etapa, los valores de las casillas (k,l), siendo 1<=k<=n y
0<=l<=(n/2)-1, de acuerdo con las siguientes expresiones de los índices:
i = (k + n/2) Mod (n+1)
j = (1 + n/2) Mod n
De esta forma se rellenan las casillas aun vacías, es decir, los componentes tablai,j a partir
de las casillas tablak,l ya completadas.
Ordenación de un Vector por Mezcla:
La ordenación de un vector es un problema que se presta fácilmente a la aplicación de la
técnica de divide y vencerás. El caso básico corresponde a un subvector de un solo
elemento, que obviamente ya esta ordenado. Para el caso general, sea vi..s un vector de
índice inferior i e índice superior s. La partición puede hacerse por la mitad si se toma un
índice m=[(i+s)/2] y dos subvectores vi..m y vm+1..s . la combinación de los dos
subvectores ya ordenados es fácil. basta con mezclar los dos subvectores, mediante
comparaciones de sus elementos sucesivos, para obtener un único vector ordenado. Este
proceso de mezcla es realizado por un procedimiento auxiliar. El algoritmo resultante es:
PROCEDURE Ordenar (INOUT v : INTEGER1..N) ->
(* ordenación por mezcla *)
PROCEDURE OrdenarAux (INOUT Vector : INTEGER1..N,1..N,
IN inf, sup : 1..N) ->
VAR
Medio : 1..N
IF inf < sup THEN
medio := (inf+sup) Div 2;
OrdenarAux (vector, inf, medio);
OrdenarAux (vector, medio+1, sup);
Mezclar (vector, inf, medio, sup)
OrdenarAux (v, 1, N)
El procedimiento para realizar la mezcla de los subvectores ordenados es:
PROCEDURE Mezclar ( IN inf : INTEGER,
IN medio: INTEGER,
IN sup : INTEGER,
INOUT vector : INTEGER1..N) ->
VAR
vectorAux : INTEGER1..N,
i1, i2, j : INTEGER,
índice : INTEGER
i1 := inf;
i2 := medio + 1;
j := inf;
WHILE (i1<=medio) ^ (i2<=sup) DO
IF vectori1 << vectori2 THEN
vectorAuxj :=vectori1;
i1 :=i1 + 1
ELSE
vectorAuxj ;= vectori2;
i2 := i2 + 1
j := j +
FOR índice IN i1..medio DO
vectorAuxj := vectorindice;
J := j + 1
FOR índice IN i2..sup DO
vectorAuxj := vectorindice ;
J := j + 1
FOR índice In inf..sup DO
vectorindice := vectorAuxindice
El algoritmo resultante es sencillo conceptualmente.
Es fácil analizar la complejidad del algoritmo para un vector de longitud n. La operación de
mezcla es proporcional a n, de forma que las ecuaciones de recurrencia de la función de
tiempo son:
T(n) = a, n=1, a=cte
2T(n/2) + bn, n>1, b=cte
Si n es una potencia de 2; es decir, n =2k para algún k, las ecuaciones anteriores se
resuelven por sustituciones sucesivas, resultando:
T(n) = 2T(n/2) + bn=…=2K T(n/2K) + kbn = an + bn log2 n
El algoritmo de ordenación por mezcla es óptimo en tiempo de ejecución. Los únicos
inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de
almacenamiento (para dos copias del vector) y que, además de mezclar, necesita copiar el
vector auxiliar completo en el principal. Puede diseñarse un algoritmo de mezcla más
complejo que mejore ambos aspectos, pero mantenga la complejidad asintótica calculada.
Multiplicación de Matrices:
Sean dos matrices, A y B, de dimensión nxn. La matriz producto C=AxB también es una
matriz de nxn cuyo elemento (i,j)-esimo se forma multiplicando cada elemento de la final i-
esima de A por el elemento correspondiente de la columna j-esima de B y sumando los
productos parciales.
El cálculo de cada elemento Cij requiere n multiplicaciones. La matriz C tiene n2 elementos,
así que el tiempo total del algoritmo de multiplicación es de orden O(n3).
El algoritmo anterior, que podemos llamar algoritmo convencional de multiplicación de
matrices, proviene directamente de la definición matemática del producto de matrices. Sin
embargo, la técnica de divide y vencerás sugiere un algoritmo distinto.
Supongamos, por sencillez, que n es una potencia de dos; es decir, que existe un entero no
negativo k tal que n=2k. (Si n no es un potencia de dos, pueden añadirse las filas y
columnas de ceros necesarias para formar una dimensión que sea potencia de dos.) las
submatrices A y B pueden partirse en cuatro submatrices de dimensión (n/2)x(n/2). Si el
producto AxB tiene la forma:
A11 A12 B11 B12 C11 C12
A21 A22 B21 B22 C21 C22
Entonces:
C11 = A11*B11 + A12*B21
C12 = A11*B12 + A12*B22
C21 = A21*B11 + A22*B21
C22 = A21*B12 + A22*B22
Para n=2, los elementos Cij se calculan mediante algunas multiplicaciones y sumas de
números, pero para n>2 las submatrices Cij se calculan mediante multiplicaciones
(recursivas) y sumas de submatrices de dimensión (n/2)x(n/2). Dos submatrices de
(n/2)x(n/2) pueden sumarse en un tiempo bn2, siendo b alguna constante.
La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3), de forma que no
se ha conseguido ningún ahorro sustancial de tiempo. Sin embargo, interesa encontrar
algoritmos mas eficientes, porque la multiplicación esta relacionada con otras operaciones
sobre matrices mas usuales, como inversión de una matriz o hallar su determinante. La
existencia de un algoritmo eficiente para la multiplicación (en realidad, para cualquier
operación de las anteriores) significaría la existencia de un algoritmo similar para las
demás.
Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de
matrices, aunque fuera a costa de un mayor numero de sumas de matrices, dado que la
complejidad respectiva de estas operaciones es O(n3)n y o(n2). El algoritmo de Strassen
calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de
matrices.
Programación Dinámica
Principios de programación dinámica
Se ha visto que la técnica voraz se aplica a problemas cuya solución puede formularse como
el resultado de una secuencia de decisiones. El método es eficiente porque una vez que se
toma una decisión en un paso, no se reconsidera en el futuro, conduciendo de forma directa
a la solución. Sin embargo, no todos los problemas pueden resolverse de esta manera,
asegurando que la secuencia de decisiones es la mejor de las posibles.
La programación dinámica (también llamada planificación dinámica) es una técnica de
programación que también permite resolver problemas mediante una secuencia de
decisiones, pero de una manera menos directa que en el caso voraz. Esta vez se necesita
producir varias secuencias de decisiones. Solamente al final se sabe cuál es la mejor de
todas.
No es fácil establecer una definición de la programación dinámica; una característica es que
el programa "aprende "dinámicamente de las decisiones que toma. Además, todo problema
resoluble con esta técnica debe de satisfacer el principio de optimalidad. Este principio
establece que "una secuencia óptima de decisiones que resuelve un problema debe cumplir
la propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto
al subproblema que resuelva ".
Usando una técnica de fuerza bruta, el número de secuencias de decisión es exponencial
sobre el número de decisiones, porque si hay d opciones para cada una de las n decisiones,
resultará un total de d secuencias posibles de decisión. En la programación dinámica todos
los subproblemas se resuelven de acuerdo con criterio de tamaño creciente y los resultados
de subproblemas más pequeños se almacenan en algún tipo de estructura de datos
(normalmente tablas) para facilitar la solución de los problemas más grandes. De esta
forma se reduce al número total de subsecuencias generadas, evitándose una explosión
combinatoria en la producción de las secuencias y consiguiéndose soluciones más eficientes
en cuanto a tiempo de ejecución.
Podemos formalizar algo más la idea básica. Supongamos que tenemos un problema que
satisface el principio de optimalidad, tal que Eo es el estado inicial del problema y deben
tomarse n decisiones d, 1<i<n. Sea
D = { v1…..vn} el conjunto de valores de decisión posibles para la decisión d1. sea,
asimismo, Eli el estado del problema tras la elección del valor vli 1<i<n1 y Sli una secuencia
óptima de decisiones respecto al estao Eli. Entonces, una secuencia óptima de decisiones
respecto a E0 es la mejor secuencias de decisión { Vli Sli }, 1<i<N1.
El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial
E0 sin embargo, puede generalizarse la formulación del problema a cualquier subsecuencia
de decisiones dk…..,dl, 1<k<n, partiendo como estado inicial de Ek-1. si este subproblema
de simboliza como problema (k,l), entonces el problema completo es problema ( l,n ). Tiene
sentido centrarse en un subproblema del problema inicial porque éste satisface el principio
de optimalidad pero, además, tiene la ventaja ( quizás paradójica al tratar de un problema
más pequeño ) de que proporciona una visión más general del problema en cuestión. (
Obsérvese que vamos a usar la técnica de resolución de problemas por generalización para
después poder realizar una particularización de la solución obtenida.)
Una solución dinámica para problema ( k,1 ) debe expresarse en términos de los valores de
decisión existente para decisiones d1 y el subproblema problema ( k+1,1 ) resultante de
aplicar cada valor de decisión. La expresión inicial de la ecuación de recurrencia, hay un
caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones, que es
problema ( n,n ).
En resumen, la aplicación de la técnica de programación dinámica a un problema significa
comprobar primero el principio de optimalidad y desarrollar después unas ecuaciones
recurrentes del estilo de (1) y (2). La ecuación general relaciona la secuencia óptima en una
etapa i con la decisión tomada en la etapa i y la subsecuencia óptima en la etapa posterior
i+1. la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna
decisión Xi, 1<i<n, a tomar.
La ecuación de recurrencia puede formularse de dos formas: delantera o trasera. Sea
X1…..Xn la secuencia de decisiones necesaria para resolver el problema. La formulación
delantera expresa la decisión de Xl , 1<i<n, a partir de la secuencia de decisiones
Xi+1……Xn ( es la clase de formulación adoptada hasta ahora ). La formulación trasera
expresa la decisión de Xi, 1<i<n , a partir de la recurrentes con formulación trasera es igual
que e la formulación delantera, sólo que en orden contrario. La elección de una formulación
delantera o trasera depende del problema considerado o, sencillamente, del gusto del
programador.
Algoritmos De Vuelta Atrás
Existen un alto número de problemas que pueden formularse como la búsqueda de la mejor
solución o del conjunto de todas las soluciones que satisfacen ciertas condiciones. Además,
cada solución es el resultado de una secuencia de decisiones. Por supuesto, debe existir una
función de criterios que debe ser satisfecha por cada secuencia solución u optimizada por
dichas secuencias solución si solo queremos la mejor. En algunos problemas de
optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz.
Otros problemas satisfacen el principio de optimalidad, pudiéndose aplicar la técnica de
programación dinámica. Sin embargo, todavía hay otros problemas peores que no queda
mas remedio que realizar una búsqueda de la solución.
Esquema de Algoritmos de Vuelta Atrás:
Sea (x1,...,xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado. Sea
G(x1...xi) el conjunto de todos los valores posibles de xi+1 tales que (x1,...,xi+1) es un
camino hasta el estado del problema. Supongamos que existe algún predicado acotador A
tal que A(x1,...,xi+1) es falso si el camino (xi,...,xi+1) no puede extenderse para alcanzar un
nodo de respuesta. Por lo tanto, los candidatos para la posición i+1 del vector desolucion
x1..n son aquellos valores generados por G que satisfacen A. Supongamos que también
existe algún predicado R que determina si un camino (x1,...,xi+1) termina en un nodo de
respuesta.
El Algoritmo de Vuelta Atrás se especifica de la forma siguiente:
PROCEDURE Retroceso (IN k : INTEGER, INOUT solucion : elemento1...n) ->
VAR
nodo : elemento
FOR noso IN G(solucion, 1, k-1) DO
Solucion k := nodo;
IF R(solucion, 1, k) THEN
IF R(solucion, 1,k) THEN
<< guardar ‘solucion’ >>;
Retroceso (k+1, solucion)
La llamada inicial del algoritmo es Retroceso(1, solucion). El procedimiento no hace
ninguna llamada recursiva cuando k = N+1 o cuando ningún nodo generado por G satisface
el elemento posible que satisfacen A se añade una solución particular, se comprueba si se ha
encontrado una solucion. Después simplemente se llama recursivamente al algoritmo para
generar los estados descendientes. Se sale del bucle FOR cuando no quedan mas valores
para solución terminando la llamada actual al algoritmo.
Ramificación (Bifurcacion) Y Acotación
Los métodos de Ramificación y Acotación constituyen un a variante de las técnicas de
retroceso para problemas donde se trata de encontrar el valor máximo o mínimo de cierta
función objeto (esto suele suceder en los problemas de programación lineal entera).
La técnica de ramificación y acotacotacion aplica de la siguiente manera:
Supóngase que al recorrer un árbol y alcanza una hoja se tiene una solucion con k colores, y
que al seguir avanzando en el árbol (mediante la aplicación de varios pasos de retrocesos)
se alcanza un nodo que requiere k+1 colores. En este punto podemos retroceder (y no seguir
avanzando por mas ramas), pues tenemos ya una solucion mayor. Así, k sirve de cota
inferior al retroceso. Este mismo proceso se repite en el resto de nodos del árbol, evitando
así la exploración de gran parte de al estructura.
Algoritmos Heuristicos
Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar
la solución de forma eficiente: problemas NP-completos.
La solución exacta puede requerir un orden factorial o exponencial: el problema de la
explosión combinatoria.
Se hace necesario utilizar algoritmos heurísticos:
Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución
(puede que la óptima) pero también puede que no produzca ninguna solución o dar una
solución no muy buena. Normalmente, se basa en un conocimiento intuitivo del
programador sobre un determinado problema.
La estructura de algoritmo voraz se puede utilizar para construir procedimientos
heurísticos: hablamos de heurísticas voraces.
Objetivo: obtener buenas soluciones en un tiempo de ejecución corto.
El problema del viajante
Problema: Dado un grafo no dirigido, completo y ponderado G = (V, A), encontrar un ciclo
simple de costo mínimo que pase por todos los nodos.
Es un problema NP, pero necesitamos una solución eficiente.
Problema de optimización, donde la solución está formada por un grupo de elementos en
cierto orden: podemos aplicar el esquema voraz.
Posibilidades:
1. Los nodos son los candidatos. Empezar en un nodo cualquiera. En cada paso moverse
al nodo no visitado más próximo al último nodo seleccionado.
2. Las aristas son los candidatos. Hacer igual que en el algoritmo de Kruskal, pero
garantizando que se forme un ciclo.

Heurística voraz 1
– Una solución será un cierto orden en el conjunto de nodos (c1, c2, ..., cn), el orden de
visita de los nodos.
Inicialización: seleccionar un nodo cualquiera.
Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al
primero) de la secuencia actual (c1, c2, ..., ca).
Acabamos cuando tengamos n nodos.
Ejemplo.
Empezando en el nodo 1.
Solución: (1, 4, 5, 3, 2)
Coste: 30+15+25+10+45=125
Empezando en el nodo 3.
Solución: (5, 4, 3, 2, 1)
Coste: 15+20+10+45+50=140
Heurística voraz 2
– Una solución será un conjunto de aristas (a1, a2, ..., an-1) que formen un ciclo
hamiltoniano, sin importar el orden.
Empezar con un grafo sin aristas.
Selección: seleccionar la arista candidata de menor coste.
Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto
para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2.
•Ejemplo.
Solución: ((2, 3), (4, 5), (3, 4), (1, 2), (1, 5))
Coste = 10+15+20+45+50 = 140
Conclusiones:
Ninguno de los dos algoritmos garantiza una solución óptima. Sin embargo, normalmente
ambos dan soluciones buenas, próximas a la óptima.
Posibles mejoras: buscar heurísticas mejores; repetir la heurística 1 con varios orígenes; ó
bien, a partir de la solución del algoritmo intentar hacer modificaciones locales para
mejorar esa solución.
Algoritmos De Aproximación
Dado un problema NP completo, es probable que no sepamos resolverlo de manera precisa
y completa utilizando un algoritmo polimico en tiempo. Para este tipo de problemas, los
algoritmos que no conducen a una solución óptima se llaman algoritmos de aproximación.
Sin embargo, resulta parcialmente interesante que estos garanticen una cota en el margen
de imprecisión.
A continuación se ilustra este tipo de tratamiento de problemas al problema de
recubrimiento de un grafico:
Dado un grafo G=(V,A), se trata de encontrar un conjunto con el menor numero de vértices
tal que toda arista sea incidente por lo menos de un vértice de V.
Este problema se puede resolver a través de otro aproximado, como es calcular el ajuste
maximizal del grafo G. Se trata de calcular un subconjunto A’ de aristas tal que dos aristas
cualquiera de A’ no tengan ningún vértice común y toda arista de A-A’ comparta algún
vértice común con una arista de A’. Este nuevo problema garantiza conseguir un
recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. El
procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando
aristas de G, de una en una y en cualquier orden e ir eliminando las incidentes al conjunto
que se esta construyendo hasta recubrir todo en grafo.
Para poder aplicar el nuevo problema aproximado, seria necesario demostrar que el
conjunto de todos los vértices inciden a las aristas de un ajuste maximal M para un grafo G
es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de
tamaño mínimo. Esto es evidente, ya que por la definición de ajuste maximal, los vértices
incidentes a las aristas de M son un recubrimiento de G. también por la propia definición,
ningún vértice perteneciente a M puede recubrir a mas de una arista en M. En
consecuencia, por lo menos la mitad de los vértices de M deben pertenecer a un
recubrimiento.
. Algoritmos de búsqueda y ordenación
En muchas situaciones de programación es necesario repetir ciertos procedimientos hasta
alcanzar un punto en que no se puede o no se desea continuar. Esta repetición de tareas
puede llevarse a cabo básicamente de dos maneras diferentes: la iteración y la recursión.
Como se supone que en cada repetición se procesa un estado diferente de cosas -sin lo cual
el proceso tendería al infinito-, ambos métodos presentan también alguna forma de control
de fin de tarea.
La idea básica en un algoritmo iterativo es que la repetición de la tarea se controla desde
afuera. Se ejecuta un conjunto de acciones en forma completa, se verifica la condición de
salida y si es necesario se vuelve a ejecutar el conjunto de acciones en forma completa. El
orden en que se ejecuta y evalúa determina que el algoritmo sea de evaluación previa
(primero se evalúa la condición de salida y luego se ejecutan las acciones) o de evaluación
posterior (primero se ejecutan las acciones y luego se evalúa el resultado). En ambos casos,
sin embargo, el control de las repeticiones es exterior al grupo principal de acciones.
En un algoritmo recursivo, en cambio, la tarea se controla desde adentro. Se comienza a
ejecutar un conjunto de acciones, pero antes de finalizar se evalúa si se ha llegado a la
condición de salida; si no es así, se continúa ordenando una nueva ejecución del mismo
conjunto de acciones. Finalmente se concluye con la tarea iniciada. Dicho en otros
términos, el procedimiento se llama repetidas veces a sí mismo, y el control de esas
llamadas forma parte del grupo principal de acciones.
Por otra parte, si bien hay problemas que se resuelven más directamente en forma iterativa
y otros que son más naturalmente recursivos, ambas técnicas son compatibles e
intercambiables, por lo que todo algoritmo recursivo puede transformarse en iterativo y
viceversa.
Algoritmos De Búsqueda
Cuando se trata de buscar un valor en un arreglo ordenado de datos, el algoritmo de
búsqueda binaria es el más frecuentemente utilizado. La idea central de este algoritmo es
comparar el elemento ubicado en el lugar central del arreglo con el valor buscado. Si el
elemento central es igual al valor buscado la búsqueda finaliza con éxito. Si no es así, puede
ocurrir o bien que el elemento central sea mayor que el buscado -en cuyo caso el elemento
coincidente debe estar en la mitad inferior del arreglo- o bien que sea menor -y el elemento
coincidente se encuentra en la mitad superior. En ambos casos se prosigue la búsqueda en
la mitad que corresponde, si es que quedan elementos en esa dirección, o bien se finaliza la
búsqueda sin éxito, en caso contrario. Existe naturalmente una solución recursiva, ya que si
el valor buscado no es hallado en la posición del centro se repite el mismo procedimiento
con una de las mitades del arreglo, y así hasta que se encuentre el valor o no queden más
"mitades". Compárese esto con el problema de las bolillas dentro de las cajas, en el cual la
"bolilla blanca" sería el valor buscado y la "caja interior" sería la mitad que se debe seguir
examinando.
En ocasiones es necesario determinar no sólo si el valor buscado se halla en el arreglo, sino
además saber en qué posición está (o debería estar, si es que no existe). Por ejemplo, si se
desea insertar un nuevo valor en un arreglo ordenado, una solución eficaz es "buscar" el
valor en el arreglo (aunque se sepa de antemano que no se encuentra) para determinar la
posición correcta en la que debe ser insertado. En esos casos se debe informar por algún
medio (generalmente un puntero pasado como parámetro o una variable global) cuál es la
posición lógica del elemento buscado dentro del arreglo.
Ejemplo de un Algoritmo de Búsqueda
A modo de ejemplo se presenta una versión de la función
int busbin (int *vec, unsigned tam, int val, unsigned *ord);
Ésta realiza una búsqueda binaria del elemento val en el vector de enteros apuntado por vec
de tam elementos y deja en la memoria apuntada por ord la posición lógica que tiene (o
debería tener) el elemento buscado. Retorna 1 si el elemento es hallado o 0 en caso
contrario. Para calcular el elemento mitad del vector se desplaza tam un bit a la derecha, lo
que equivale a dividirlo en dos, pero resulta mucho más rápido para el procesador que la
operación de división.
int busbin (int *vec, unsigned tam, int val, unsigned *ord)
{if (!(vec && tam && ord)) return 0;
unsigned mitad = tam >> 1; // Divide tam en 2 desplazando un bit a la// derecha. Es más
rápido que tam / 2.
if (vec [mitad] == valor) { *ord += mitad; return 1; }
if (vec [mitad] < valor)
{ mitad++; *ord += mitad; vec += mitad; tam -= mitad; }
else tam = mitad;
return tam? busbin (vec, tam, va, ord): 0;}
Algoritmos De Ordenacion
Se presentan aquí dos métodos muy utilizados para obtener el ordenamiento de un
conjunto de datos: el algoritmo de ordenamiento por inserción y el algoritmo conocido
como quick sort (ordenamiento rápido). Estos dos algoritmos son ilustrativos, además,
porque el algoritmo de ordenamiento por inserción es esencialmente iterativo, mientras
que el algoritmo de quick sort es esencialmente recursivo.
A continuación se comentan las características de ambos algoritmos para ordenar en forma
ascendente los valores dentro de un vector en memoria. Siguiendo este ejemplo, para
obtener ordenamientos descendentes basta cambiar el sentido de las comparaciones por
desigualdad, y para otro tipo de soporte de datos (archivos en disco, por ejemplo) los
cambios se referirán principalmente al modo de leer y escribir los datos.
Ordenación por Inserción:
La idea central de este algoritmo es recorrer secuencialmente y hacia delante el conjunto de
datos comparando cada elemento con el anterior. Si el elemento actual es igual o mayor que
el anterior entonces ese par de datos se encuentra en la secuencia correcta, por lo que no
hay que modificar nada. Si, en cambio, el actual es menor que el anterior, significa que el
actual está fuera de secuencia, por lo que debe ser insertado en el lugar correcto entre los
valores que han quedado atrás. Una vez resuelta esta cuestión, se repite el proceso con el
elemento siguiente del conjunto hasta que no haya más elementos.
Dos características surgen directamente de esta descripción:
1. Si hay que comparar cada valor con el anterior, entonces se debe comenzar el proceso
por el segundo elemento, ya que es el primero en tener uno anterior.
2. Si se van reinsertando correctamente "hacia atrás" los valores a medida que se avanza
(o si se avanza sin reinsertar porque no es necesario), entonces los elementos
anteriores al actual ya están ordenados.

La tarea de reinsertar un elemento "hacia atrás" cuando se descubre que está fuera de
secuencia es accesoria y puede ser realizada por una función auxiliar. Esta función auxiliar
se puede implementar de varias maneras, pero todas ellas deben partir de la certeza de que
ese subconjunto de elementos ya está ordenado. A continuación se presentan una
implementación de la función principal
int *ordins (int *vec, unsigned tam);
y dos implementaciones alternativas de la función auxiliar
void insertar (int *ult, unsigned tam);
La función ordins () ordena por inserción el vector de enteros apuntado por vec de tamaño
tam y retorna vec, mientras que ambas versiones de insertar (), ubican el valor contenido en
el elemento apuntado por ult entre los tam elementos ordenados que han quedado atrás.
Ambas funciones auxiliares son estáticas -esto es, de uso "privado" dentro del módulo
donde están insertas- ya que la tarea que realizan es subsidiaria y dependiente de la función
ordins ().
int *ordenar (int *vec, unsigned tam)
{int *ant = vec, *act = vec + 1;unsigned i;for (i = 1; i < tam; i++, ant++, act++)
if (*act < *ant) insertar (act, i);return vec;}
La primera versión de insertar () es típicamente iterativa y efectúa una especie de rotación
de los valores de los elementos. Primeramente resguarda en la variable local auxiliar aux el
valor del ítem a reinsertar -que se encuentra en *ult- y a continuación procede a mover una
posición hacia delante cada uno de los elementos anteriores a aux retrocediendo en el
vector hasta que no hay más elementos o encuentra uno que no es mayor que aux.
Finalmente reinserta el valor de aux en el lugar donde se encontraba el último elemento
removido.
static void insertar (int *ult, unsigned tam)
{int *ant = ult - 1; // ant apunta siempre al ítem anterior a ult.
int aux = *ult; // aux contiene el valor a reinsertar.
do *(ult--) = *(ant--); // Evaluación posterior porque ya se sabe que el
while (--tam && aux < *ant); // primer ítem anterior a ult es mayor que *ult.
*ult = aux; // Restituye el valor de aux en la última} // posición vacante.
La segunda versión de insertar () recurre a su vez a la función auxiliar de búsqueda binaria
busbin (), con el fin de determinar la posición que debe ocupar el elemento *ult entre los
anteriores a ult. Para ello inicializa las variables globales estáticas valor y orden, que son
utilizadas por busbin () para conocer el elemento buscado e informar su posición.
Obsérvese que para que esta versión de insertar () pueda acceder a otras funciones y
variables globales estáticas, debe estar incluida a su vez en el mismo módulo de código que
ellas. Luego de obtener a través de busbin () el lugar que debe ocupar el nuevo ítem, calcula
la cantidad de elementos a desplazar y -como la primera versión- mueve una posición hacia
delante cada uno de los elementos anteriores a ult retrocediendo en el vector hasta llegar a
la posición correcta. Ya no necesita comparar y contar puesto que, al conocer la cantidad de
elementos a desplazar, sólo necesita contar. Finalmente reinserta el valor de aux en el lugar
donde estaba el último elemento removido.
static void insertar (int *ult, unsigned tam)
{unsigned _ord = 0; // _ord contendrá la posición correcta de *ult.
int *ant = ult - 1; // ant apunta al ítem anterior a ult.
valor = *ult; // Inicializa las variables globales estáticas
orden = &_ord; // que utilizará busbin ().
if (--tam) // Si hay más de un elemento llama a busbin ()
busbin (ant - tam, tam); // con la dirección inicial del vector.
tam -= _ord; // Descuenta de tam la posición del nuevo ítem.
do *(ult--) = *(ant--); // Desplaza la cantidad necesaria de elementos
while (tam--); // hacia delante y restituye el valor de valor
*ult = valor; // en la última posición vacante.}
La ventaja de la primera versión es que es autónoma, ya que no depende de otras funciones
ni variables globales estáticas, por lo que puede ser incluida en cualquier módulo de código.
Presenta sin embargo el inconveniente de que tiene que comparar una y otra vez cada
elemento del arreglo para encontrar su posición correcta. En vectores de gran tamaño esto
puede resentir en forma notable la eficiencia. La segunda versión, en cambio, soluciona el
problema de las comparaciones sucesivas utilizando un algoritmo de búsqueda más
eficiente, aunque esto la obliga a convivir en el mismo módulo con otras funciones y
variables globales estáticas de las cuales depende.
Algoritmo de Quick Sort:
La idea central de este algoritmo es la siguiente: si se toma un conjunto de elementos
desordenados y se ubica uno cualquiera de ellos -llamado pivote- en una posición tal que
todos los que estén antes sean menores o iguales y todos los que estén después sean
mayores, entonces esa posición particular sería la correcta para ese elemento si el conjunto
estuviera ordenado. Asimismo se verifica que el conjunto ha quedado dividido en dos
partes: en la primera están todos los elementos menores o iguales al pivote y en la segunda
todos los mayores. Esto permite aplicar recursivamente el mismo procedimiento en ambas
partes del conjunto hasta que éste quede completamente ordenado. La tarea de dividir el
conjunto de datos en dos grupos en torno al pivote es accesoria y puede ser realizada por
una función auxiliar. Esta función auxiliar se puede implementar de varias maneras, pero
todas ellas deben informar de algún modo en qué posición ha quedado ubicado el pivote.
Al igual que busbin (), la función qsort () es recursiva, y cada llamada provocará que la
función se llame "internamente" a sí misma varias veces. Los valores de los parámetros vec
y tam seguramente variarán entre una llamada y otra, ya que son los que definen la parte
del arreglo que se ordenará cada vez. Sin embargo, tanto los controles de que los
parámetros sean legales como el retorno de la función con la dirección original del vector
deben hacerse sólo una vez.
Para evitar tener que hacer estos controles redundantes en cada llamada recursiva, la tarea
se divide entre dos funciones. La primera está declarada públicamente como
int *qsort (int *vec, unsigned tam);
No es recursiva y sólo realiza las tareas que deben ser ejecutadas una sola vez: verifica que
vec y tam sean legales y llama a la segunda función, que es la que completa la tarea. Si vec o
tam son ilegales la función retorna vec sin hacer nada más. La segunda función, definida
como
void _qsort (int *vec, unsigned tam);
Es estática (por lo tanto inaccesible desde fuera del módulo), y es la que realmente lleva a
cabo la tarea recursiva de ordenamiento. Recibe los parámetros vec y tam, que varían entre
una llamada y otra, pero que tienen siempre valores legales.
A continuación se presentan dos pequeños módulos de librería con una versión optimizada
de la función: el módulo qsort.h contiene simplemente la declaración, mientras que el
módulo qsort.cpp incluye la implementación de la función principal
int *qsort (int *vec, unsigned tam);
y una implementación de las dos funciones auxiliares
int dividir (int *vec, unsigned tam);
void _qsort (int *vec, unsigned tam);
La función qsort () verifica la validez de los parámetros vec y tam y llama a _qsort () antes
de retornar vec. La función _qsort () ordena por el algoritmo de quick sort el vector de
enteros apuntado por vec de tamaño tam, llamando a su vez a la función dividir (). Ésta
divide los tam elementos del vector apuntado por vec en dos grupos alrededor de un pivote
y retorna la cantidad de elementos del primer grupo -que incluye al pivote. Ambas
funciones auxiliares son estáticas -esto es, de uso "privado" dentro del módulo donde están
insertas- ya que la tarea que realizan es subsidiaria y dependiente de la función qsort ().
7. Verificación y derivación de programas
Conceptos Basicos
La definición del significado de un elemento del lenguaje se puede realizar de distintas
formas, cada una de las cuales define una semántica diferente del lenguaje. En esta lección
se van a introducir los conceptos más importantes de algunas de estas formas semánticas, y
se van a tratar más extensamente los conceptos de corrección, verificación y prueba, ya
mencionados en la lección.
Semántica:
Ahondando en la situación de la introducción anterior sobre la definición del lenguaje
pascal, se puede conjeturar que la manera informar de definir el significado de las
construcciones del lenguaje es insatisfactoria. El motivo es la falta de precisión con la que se
define el significado de dichos conceptos, lo cual deja abierta como posibilidad que dicho
significado dependa de la maquina donde se utilice el lenguaje. Otro problema importante
es la ambigüedad del lenguaje natural, que permite que distintos implementadotes o
programadores entiendan de modo distintos una definición. Acerca de este tema, el
lenguaje pascal vuelve a servirnos de ejemplos. Hasta hace no mucho tiempo existía una
gran variedad de versiones del mismo, cada una realizada específicamente.
Dependiendo del objetivo prioritario que se presenta cubrir al dar el significado de un
lenguaje podemos encontrar diversas aproximaciones. Entre todas ellas, las más
frecuentemente utilizadas son la sematica operacional, la sematica declarativa y la sematica
axiomatica. Veamos a continuación una peque son la sematica operacional, la sematica
declarativa y la sematica axiomatica. Veamos a continuación una pequeña introducción a
cada una de estas aproximaciones.
Semántica operacional:
La semántica operacional define el significado de un lenguaje de programación en términos
de los cambios de estado que producen las instrucciones primitivas del lenguaje. Estos
cambios no se reflejan directamente en la maquina real, sino en una maquina (virtual)
abstracta asociada que sirve como instrumento de conexión con aquella. Expresado de otra
forma, podemos decir que la semántica operacional define el significado de un programa en
términos del efecto producido por la ejecución paso a paso del mismo, de tal modo que la
especificación de las instrucciones del lenguaje mediante instrucciones primitivas de la
maquina abstracta es, precisamente, la definición semántica del mismo.
A pesar de la aparente simplicidad de este formalismo, este tipo de semántica no describe
con igual claridad todo tipo de lenguaje de programación. El motivo es que el mecanismo
que emplean los distintos lenguajes de programación para realizar un cómputo no siempre
puede expresarse de una manera clara, comprensible y concisa.
Semántica denotacional:
La semántica denotacional define unas aplicaciones (funciones) de valoración semántica
que asignan a cada construcción denotada tal objeto matemático que modela su significado.
Se dice que la construcción denota tal objeto o que este objeto es la denotación de dicha
construcción. En otras palabras, la semántica denotacional indica que función matemática
se obtiene a la salida ante unas entradas del programa, sin preocuparse de la ejecución paso
a paso del programa. Existe una variante de esta semántica que es la semántica algebraica,
en la que se utiliza conceptos algebraicos a la hora de modelar el significado de las
construcciones.
El primer paso a realizar en la definición de la semántica denotacional de un determinado
lenguaje es el establecimiento de un dominio semantico al que pertenecerán los resultados
obtenidos de la evaluación de las construcciones del lenguaje. Esta evaluación es
proporcionada por un conjunto de funciones de significado cuyo dominio esta constituido
por el conjunto de construcciones del lenguaje y cuyo rango (o imajen) viene dado por el
dominio semantico.
Este tipo de semántica dotan de significado a los elementos del lenguaje de una manera
mas formal y abstracta, pero sin embargo también necesitan un mayor conocimiento de
conceptos matemáticos, que no tienen por que ser básicos ni elementales.
Recursividad:
Una función recursiva es una función que se define en términos de si misma., es decir, en su
cuerpo aparece alguna aplicación suya. La recursividad es un mecanismo que se usa cuando
hay que repetir cierto tratamiento o cálculo pero el número de repeticiones es variable. De
hecho ya se han visto definiciones recursivas, el tipo suma permite definir tipos de datos
recursivos, como el tipo de lista. La definición del tipo lista permite repetir la adición de
elementos a una lista. el numero de adicciones es variable y determina el numero final de
elementos de lista.
Iteración:
Una instrucción iterativa engloba una secuencia de instrucciones que se escribe una sola
vez, pero permite que se ejecute varias veces. Una instrucción iterativa también se llama
Bucle. Las instrucciones englobadas suelen denominarse cuerpo del bucle; cada ejecución
del cuerpo de un bucle se llama iteración del mismo. Hay varios formatos de bucles que
vemos a continuación.
Una instrucción LOOP tiene el siguiente formato:
LOOP
<Instrucción>
Su efecto es ejecutar eternamente la instrucción englobada. Sin embargo, puede terminarse
la ejecución del bucle si se ejecuta una instrucción especial, formada por la palabra clave
EXIT. Obsérvese que la instrucción EXIT debe ir incluida dentro de una instrucción
condicional; en caso contrario, el bucle LOOP terminaría su ejecución al llegar a ella,
realizando una iteración como mucho. Pero esto no tiene mucho sentido, porque si se
hubiera querido realizar una sola ejecución de dichas instrucciones, no se hubieran incluido
en una instrucción iterativa.
La instrucción EXIT no puede usarse en ninguna de las dos clases de bucles que se exponen
a continuación.
Una instrucción WHILE tiene el siguiente formato:
WHILE <condición>DO
<Instrucción>
La ejecución de una instrucción WHILE comienza evaluando la condición booleana. Si es
cierta, se ejecuta la secuencia de instrucciones y se comienza de nuevo. Si la condición es
falsa, la ejecución del WHILE termina y el algoritmo continúa por la instrucción siguiente al
bucle.
La instrucción FOR tiene el siguiente formato:
FOR <variable> IN <subrango>BY<expresión entera>DO
<Instrucción>
La instrucción FOR usa una variable, llamada variable de índice, que toma distintos valores
en las sucesivas ejecuciones del cuerpo. La variable de índice debe ser entera, enumerada o
subrango. Los valores que toma la variable de índice se indica mediante un subrango del
mismo tipo y un incremento. El subrango se expresa de la manera usual: un valor inicial y
un valor final separados por dos puntos. El incremento viene dado por una expresión
entera; puede suprimirse, en cuyo caso se supone que es igual a uno.
Al comenzar la ejecución del bucle, la variable índice toma el valor inicial del subrango y se
evalúa la expresión entera para determinar el incremento.
Veamos el resto del comportamiento del bucle cuando el tipo de la variable índice es un
subrango entero. Tras cada iteración, el valor del índice se actualiza, sumándose a su valor
el incremento. Si el incremento es positivo, solo se realiza la siguiente iteración si el valor de
la variable índice es menor o igual que el valor final del subrango; por el contrario, si el
incremento es negativo, solo se itera de nuevo cuando su valor es mayor o igual que el valor
del final del subrango.
Si la variable es enumerada o de un subrango enumerado, el comportamiento del bucle es
parecido. Un valor es menor que otro si tiene un ordinal menor. El incremento de un valor
enumerado produce otro valor cuyo ordinal es mayor que el inicial en la cantidad expresada
por el incremento.
Semantica Axiomatica
La semántica axiomatica asociada a cada construcción del lenguaje un axioma lógico que
relaciona el estado del computo (valores que tienen las variables utilizadas) antes y después
de ejecutar esta construcción. Existen distintas semánticas, axiomatica, de la que la mas
conocida es la introducida por el sistema formal de hoare y que es utilizada para definir el
significado de lenguaje imperativos (por ejemplo, pascal).
El método axiomatico expresa la semántica de un lenguaje de programación asociado al
lenguaje una teoría matemática o sistema formal que permita demostrar propiedades de los
programas escritos en ese lenguaje. Esta aproximación formal contrasta con el método
denotacional mostrando anteriormente, que asocia a cada construcción del lenguaje una
denotación (significado) en un intento de encontrar un modelo matemático (colección
abstracta de objetos matemáticos) del lenguaje.
Un sistema formal puede entenderse como un metalenguaje que pose su propia sintaxis y
semántica. Desde el punto de vista sintáctico, es necesario definir una gramática en la que
se reflejen las contrucciones validas del sistema formal, normalmente se suele emplear la
sintaxis sde la lógica de predicado de primer orden ampliada com. expresiones aritméticas y
de teoría de conjuntos. Una vez fijada la sintaxis a emplear, un sistema formal se define
mediante un conjunto de axiomas (propiedades ciertas escritas en forma de sentencias
logicas) que expresen las propiedades de las construcciones básicas y un conjuntos de
reglas de inferencias (forma de deducir una propiedades de otras) que permitan deducir las
propiedades de construcciones mas complejas.
Las definiciones de sistemas formales para lenguajes funcionales suele hacerse
fundamentalmente para demostrar propiedades que tiene que ver con el tipo de una
expresión y de las subexpresiones que la componen.
Diseño De Algoritmos Recursivos
Las definiciones recursivas pueden resultar sorprendentes a primera vista.Incluso puede
dar lugar a funciones que nunca terminen (inútiles como algoritmos), Sin embargo, usadas
juiciosamente son un instrumento potentisimo de diseño de algoritmos.
En primer lugar, hay que identificar el proceso repetitivo por realizar. En segundo lugar,
hay que considerar que una función recursiva solo es útil si su evaluación termina.
Clasificación
Según el número de llamadas recursivas realizadas, se distinguen tres clases:
Recursividad lineal: El cuerpo de la función contiene una llamada recursiva. Son las
funciones recursivas. Son las funciones recursivas más sencillas. Todas las funciones
especificadas en este capitulo son recursivas lineales.
Un caso importante de recursividad lineal aparece cuando la expresión más externa del
caso recursivo de la función es la misma llamada recursiva. Esta clase de recursividad se
llama recursividad de cola.
Recursividad no lineal.
El cuerpo de la función contiene varias llamadas recursivas. Lo mas frecuente que contenga
dos llamadas recursivas, en cuyo caso se habla de recursividad binaria.
Recursividad mutua: Es un caso curioso de recurcion, una función no contienen ninguna
llamada recursiva, pero durante la evaluación de su aplicación surgen llamadas recursivas.
Auque a primera vista parezca imposible obtenérsete comportamiento, la recursividad
puede conseguirse indirectamente si hay dos funciones que se llaman entre si.
Otra clasificación basada en el formato de los parámetros de las llamadas recursivas.
Recursividad estructural: Las sucesivas llamadas recursivas sobre un dato se hacen
siguiendo la estructura recursiva del mismo. En el caso de los elementos enteros, una
recurcion estructurar significa que el valor se vaya decrementando en uno.
Recurcion bien fundada: Aunque hablando con propiedad, cualquier recursividad esta bien
fundada, suele utilizarse este término para aquellas recursividades que no son
estructurales. Un ejemplo de función recursiva bien es invertir Entero, donde el parámetro
entero se divide entre diez.
La primera clasificación dada es útil para decidir si es conveniente usar una definición
recursiva o iterativa en los algoritmos imperactivo.
La segunda clasificación es útil para decidir el principio de inducción necesaria para
necesaria para verificar el algoritmo.
Diseño De Algoritmos Iterativos
Cada clase de bucle resulta útil en situaciones diferentes. El bucle FOR se utiliza cuando se
conoce el número de iteraciones que se quiere realizar. El bucle WHILE es usado en las
otras situaciones en que no se conoce el número de iteraciones. El bucle LOOP es útil
cuando puede haber varias condiciones de salida del bucle, situadas en diferentes partes del
cuerpo, o cuando la condición de salida no esta al comienzo del bucle.
Sin embargo, conocer la instrucción iterativa que mas conviene para un algoritmo es solo el
comienzo de la construcción de la instrucción. Es conveniente tener algunas guías para el
diseño de algoritmos iterativos.
El diseño de un algoritmo iterativo se hace sobre una base distinta de la de uno recursivo.
En los algoritmos imperativos se tiene disponible toda la información del problema en las
variables. Por esta razón, es útil partir los datos del problema en dos:
 La parte que representa el problema aun no resuelto.
 La parte que representa el problema ya resuelto; es decir, el resultado ya calculado.

Una vez que se han distinguido estas dos partes, el bucle se construye a partir de tres
decisiones hechas sobre dicha partición:
a. Fijar la situación inicial. El problema a resolver se encuentra en los parámetros de
entrada o de entrada/salida; si estos datos quieren modificarse durante el algoritmo,
deben copiarse en variables auxiliares. también hay que dar un valor inicial a las
variables que representan la solución vacía.
b. Formar el cuerpo del bucle. Para ello puede usarse un razonamiento parecido al
recursivo. Se supone, por generalidad, que la iteración se encuentra en un estado
intermedio. Debe entonces determinarse que hacer en una iteración para avanzar en
la resolución del problema.
c. Determinar la condición de terminación. Corresponde a la situación en que se ha
hallado la solución completa. Esta parte esta totalmente relacionada con la elección de
la instrucción iterativa. Según la forma de la iteración, se elige un bucle FOR, WHILE
o LOOP, como se describió antes.

Normalmente, la terminación del bucle puede especificarse de forma sencilla, incluso en


casos relativamente complicados. Por ejemplo, cuando se tiene un bucle WHILE con una
condición compuesta es posible que pueda usarse la técnica del centinela para obtener una
especificación más sencilla.
Algo con lo que hay que tener especial cuidado es la terminación de los bucles. Esta es fácil
de determinar en un algoritmo recursivo porque basta con tomar una medida de los
parámetros y comprobar que disminuye en cada llamada recursiva, de forma que se acerca
al tamaño de los casos básicos. En una solución iterativa se razona igual, pero la tarea es
algo mas complicada porque el control del proceso repetitivo no tiene parámetros, sino que
se hace a partir de la información contenida en las variables.
8. Análisis Foda
Introducción:
El análisis FODA es una herramienta que permite conformar un cuadro de la situación
actual de la empresa u organización, permitiendo de esta manera obtener un diagnóstico
preciso que permita en función de ello tomar decisiones acordes con los objetivos y políticas
formulados.
El término FODA es una sigla conformada por las primeras letras de las palabras
Fortalezas, Oportunidades, Debilidades y Amenazas (en inglés SWOT: Strenghts,
Weaknesses, Oportunities, Threats). De entre estas cuatro variables, tanto fortalezas como
debilidades son internas de la organización, por lo que es posible actuar directamente sobre
ellas. En cambio las oportunidades y las amenazas son externas, por lo que en general
resulta muy difícil poder modificarlas.
 Fortalezas: son las capacidades especiales con que cuenta la empresa, y por los que
cuenta con una posición privilegiada frente a la competencia. Recursos que se controlan,
capacidades y habilidades que se poseen, actividades que se desarrollan positivamente,
etc.
 Oportunidades: son aquellos factores que resultan positivos, favorables, explotables, que
se deben descubrir en el entorno en el que actúa la empresa, y que permiten obtener
ventajas competitivas.
 Debilidades: son aquellos factores que provocan una posición desfavorable frente a la
competencia. recursos de los que se carece, habilidades que no se poseen, actividades
que no se desarrollan positivamente, etc.
 Amenazas: son aquellas situaciones que provienen del entorno y que pueden llegar a
atentar incluso contra la permanencia de la organización.

Análisis:
El Análisis FODA es un concepto muy simple y claro, pero detrás de su simpleza residen
conceptos fundamentales de la Administración. Intentaré desguazar el FODA para exponer
sus partes fundamentales.
Tenemos un objetivo: convertir los datos del universo (según lo percibimos) en
información, procesada y lista para la toma de decisiones (estratégicas en este caso). En
términos de sistemas, tenemos un conjunto inicial de datos (universo a analizar), un
proceso (análisis FODA) y un producto, que es la información para la toma de decisiones (el
informe FODA que resulta del análisis FODA).
Sostengo que casi cualquier persona puede hacer un análisis FODA. Digo casi porque esa
persona tiene que tener la capacidad de distinguir en un sistema:
1. Lo relevante de lo irrelevante
2. Lo externo de lo interno
3. Lo bueno de lo malo

Parece fácil, ¿verdad?


Pongámoslo en otras palabras: el FODA nos va a ayudar a analizar nuestra empresa
siempre y cuando podamos responder tres preguntas: Lo que estoy analizando, ¿es
relevante? ¿Está fuera o dentro de la empresa? ¿Es bueno o malo para mi empresa?
Estas tres preguntas no son otra cosa que los tres subprocesos que se ven en el proceso
central del dibujo de arriba. Pasemos a explicar:
La relevancia es el primer proceso y funciona como filtro: no todo merece ser elevado a
componente del análisis estratégico. Es sentido común ya que en todos los órdenes de la
vida es fundamental distinguir lo relevante de lo irrelevante. En FODA este filtro reduce
nuestro universo de análisis disminuyendo nuestra necesidad de procesamiento (que no es
poca cosa).
Ejemplos: dudosamente sea una ventaja comparativa el sistema de limpieza de baños de
una petroquímica, o el color de los monitores, o si el papel que se usa es carta o A4. Parece
tonto, pero es increíble la cantidad de veces que a los seres humanos nos cuesta distinguir
lo principal de lo accesorio, ya sea en una discusión, una decisión o donde sea.
Claro que la relevancia de algo depende de dónde estemos parados, y este concepto de
relatividad es importante. La higiene de los baños puede ser clave en un Hospital o un
Hotel. El orden en el que se hacen los pasos al efectuar una compraventa no es tan
importante como los pasos que toman los bomberos para apagar un incendio. La disciplina
y la autoridad formal son dejadas de lado en muchas empresas de la "Nueva Economía"...
pero a un ejército en batalla eso puede costarle la vida. Es por eso que quien hace un
análisis FODA debe conocer el negocio (ni más ni menos que saber de lo que está
hablando).
Filtrados los datos sólo nos queda clasificarlos. Aplicando el sentido común, podemos
construir una matriz con dos dimensiones (dentro/fuera, bueno/malo):
Positivas Negativas

Exterior Oportunidades Amenazas

Interior Fortalezas Debilidades

Quien haya inventado el Análisis FODA eligió para cada intersección una palabra: así la
intersección de "bueno" y "exterior" es una oportunidad, mientras que las cuestiones
"positivas" del "interior" de nuestra empresa son una fortaleza, y así sucesivamente.
Distinguir entre el adentro y el afuera de la empresa a veces no es tan fácil como parece. Es
fácil decir que desde el punto de vista de la Ferrari, M. Schumager es una fortaleza
(interna), y que si M. Hakkinen se queda sin empleo en su escudería, será una Oportunidad
(externa) para la Ferrari. Pero el control de un recurso escaso (petróleo) o un proveedor
exclusivo están físicamente fuera de mi empresa... y sin embargo son Fortalezas. La clave
está en adoptar una visión de sistemas y saber distinguir los límites del mismo. Para esto
hay que tener en cuenta, no la disposición física de los factores, sino el control que yo tenga
sobre ellos. Recordando una vieja definición de límite: lo que me afecta y controlo, es
interno al sistema. Lo que me afecta pero está fuera de mi control, es ambiente (externo).
Sólo nos queda la dimensión positivo/negativo, que aparentemente no debería ofrecer
dificultad, pero hay que tener cuidado. El competitivo ambiente de los negocios está lleno
de maniobras, engaños, etc. En la Segunda Guerra Mundial, el Eje estaba feliz de que el
desembarco de los Aliados fuera en Calais, porque tenía muchas fortalezas en ese caso. Pero
el día D fue en Normandía y por eso hoy el mundo es lo que es.
Las circunstancias pueden cambiar de un día para el otro también en el interior de la
empresa: la Fortaleza de tener a ese joven y sagaz empleado puede convertirse en grave
Debilidad si se marcha (y peor si se va con la competencia). Y la Debilidad de tener a un
empleado próximo a jubilarse y a quien le cuesta adaptarse a las nuevas tecnologías puede
revelarse como Fortaleza demasiado tarde... cuando se retira y nos damos cuenta de que
dependíamos de él porque era el único que sabía "dónde estaba todo" y "cómo se hacen las
cosas".
La sagacidad del empresario debe convertir las Amenazas en Oportunidades y las
Debilidades en Fortalezas. Ejemplos: Asociarnos con nuestra competencia de toda la vida
para enfrentar a un enemigo más pesado; pasar a un empleado desestructurado y
extrovertido de una tarea organizativa que hace mal, a la línea de fuego de atención al
público. Las posibilidades son muchas.
Y esos son los tres pasos necesarios para analizar la situación actual de la organización
mediante el Análisis FODA.
El Análisis FODA de este trabajo:
Fortaleza:
Los conceptos que se nos encomendaron investigar, están desarrollados de forma amplia y
lógica.
Tiene un contenido y una presentación al nivel de los que significa ser estudiante
universitario de un 7mo cuatrimestre de Ing. En Sistemas.
Continuidad y constancia de la estructura, calidad y cantidad de contenido que los demás
trabajos entregados, a demás de mejoras considerables, lo cual nos garantiza obtener
calificaciones similares o superiores a las ya obtenidazas de referidos trabajos.
Oportunidades:
Debido a las mejoras realizadas al mismo y una mejor coordinación y participación de los
integrantes del grupo este se concluirá en menor tiempo y así podremos completar el
procedimiento correcto de entrega de trabajos de esta materia.
Debilidades:
A causa de la dificultad para conseguir la información solicitada algunos de los conceptos
relacionados con los problemas, tipos, etc. No se encuentran en nuestro trabajo.
Amenazas:
Que las debilites de nuestro trabajo influyan considerablemente en la evaluación del mismo
provocando que las expectativas y el esfuerzo realizados por los que participamos en el
mismo no lleguen a cumplirse.
9. Conclusión
Luego de realizar este trabajo hemos visto como los algoritmos son una de las herramientas
más complejas y aplicables en el área de la informática y el mundo de los computadores.
Pudimos comprobar que mientras más potente, completo y eficiente es el computador o la
aplicación que corre sobre el mismo mas grande, complejo y exacto es el algoritmo que
utiliza.
Las técnicas de desarrollo de algoritmos nos permiten encontrar la mejor solucion a los
problemas que se nos presentan y deben ser solucionados por el computador, estas técnicas
están orientadas para utilizarse en cada uno de los niveles de complejidad y variedad o
alternativas para las cuales se aplican los algoritmos.
Un algoritmo es el conjunto de operaciones y procedimientos que deben seguirse para
resolver un problema, es por ellos que debemos estudiarlos y conocerlos.
10. Bibliografía
Correa Uribe, Guillermo. "Desarrollo de Algoritmos y sus aplicaciones", Editora MacGraw -
Hill Inc. USA, III Edición. Abril/1992, Colombia. pp. 251.
Gálvez, Javier. Gonzáles, Juan. "Algorítmica, Análisis y Diseño de Algoritmos", Editora RA-
MA (Addison-Wesley Iberiamericana), II Edición. Septiembre/1993, USA. pp 502.
Matías, Cristian "Manual de Informática Educativa", Editora Taller. 2da. Edición.
Julio/1999. Sto. Dgo. R.D. pp 260.
Sean, James A. "Análisis y Diseño de Sistemas de Información", Editora MacGraw - Hill
Inc. USA, 2 ta. Edición. Diciembre/1998, México. pp 941.
World Wide Wed:
www.altavista.com
www.elrincondelvago.com
www.aulaclick.com
ANALISIS DE ALGORITMOS: IMPORTANCIA Y CLASIFICACION
IMPORTANCIA

Un problema es resuelto algorítmicamente, si se puede escribir un programa que


pueda producir la respuesta correcta de forma que para cualquier posible entrada,
el programa puede ser ejecutado el tiempo (finito) suficiente para resolverlo y
cuenta además con el espacio requerido para resolverlo.

A principios del siglo XX, hubo una gran actividad para formalizar y estudiar el
concepto de algoritmo. Los algoritmos se consideraron desde entonces como un
conjunto de instrucciones simples, las cuales pueden ser interpretadas fácilmente,
de modo que al seguirlas se resuelva un problema ó se calcule el valor de una
función.
Dentro de los investigadores de principios del siglo XX, destaca Allan Turing, por
dos razones:

1) El desarrollo de la Máquina de Turing y su relación con los algoritmos. Dicha


relación establece que todo algoritmo puede ser conceptualizado como una
máquina, que ejecuta sus instrucciones.

2) La demostración de que no se puede resolver el problema denominado "Halting


Problem". Este problema consiste en determinar si existe ó no un algoritmo que
determine si un programa arbitrario de computadora, eventualmente termina para
una entrada cualquiera del programa. De acuerdo con Turing no existe ningún
programa de computadora que resuelva este problema.
Estos dos aspectos llevaron al desarrollo de la Teoría de la Computabilidad (TC).
Esta área está ahora conformada por Teoría de la Computación, Análisis de
Algoritmos, Teoría de la Información y Lógica Computacional.

Se hace notar que el hecho de que exista un procedimiento para resolver un


problema, puede o no ser suficiente para que este sea resuelto realmente en una
computadora. Se podría, por ejemplo pensar en un procedimiento para que una
máquina juegue ajedréz perfecto, tomando en cuenta lo siguiente:

1) Existe solo un número finito de formas de arreglar las piezas de ajedrez sobre el
tablero.
2) Bajo ciertas reglas, el juego termina después de un número finito de
movimientos.
3) Considerar para cada posible movimiento de la computadora, todas las posibles
respuestas del oponente y, para cada una de estas, las posibles respuestas de la
computadora y, así sucesivamente, hasta que cada secuencia alcance el final.
Entonces, conociendo el último resultado de cada movimiento, todo lo que se
tendría que hacer es escoger el mejor movimiento inicial.

Sin embargo, hay un inconveniente serio en el procedimiento anterior, el número


de posibles arreglos de piezas es alrededor de 10 50, de modo que un buen
programa podría tardar varios miles de años!!.

Como consecuencia, no obstante que existe un procedimiento para el juego


perfecto de ajedrez, no existe aún un algoritmo, no obstante que alguien podría
escribir un programa siguiendo dicho procedimiento

Como el anterior, hay muchos problemas, para las cuales se puede escribir un
procedimiento y por tanto podríamos decir que pueden ser resueltas; es decir que
se pueden escribir programas para dichas aplicaciones y que por tanto podríamos
pensar que existen algoritmos para ellos. Sin embargo, los requerimientos de
tiempo y espacio de almacenamiento son tan grandes que ésos programas no son
de importancia práctica. Estos aspectos se estudian en un área denominada
Complejidad Computacional y, a la cual le dedicaremos una sesión mas adelante.

La Complejidad Computacional cubre varios aspectos; una de ellas trata con


aspectos formales, que tratan sobre las bases matemáticas para probar la
computabilidad de funciones computables. Esto es de interés para saber si en
teoría, para un problema existe o no un algoritmo. Otro aspecto tiene que ver con
la eficiencia de los algoritmos desde el punto de vista de tiempo y espacio. En este
último aspecto, se centra el Análisis de Algoritmos. El análisis de algoritmos estudia
de esta forma en dos aspectos:

1) El análisis de problemas específicos.


2) El análisis de algoritmos específicos.

Dicho estudio permite determinar métodos adecuados de diseño para problemas


prácticos. El análisis de algoritmos permite entonces determinar, para un problema
en particular, si un algoritmo determinado cumple o no con los requerimientos
mínimos de tiempo y espacio. Esto lleva en consecuencia a una mejor toma de
decisiones en la solución de problemas.

CLASIFICACION DE PROBLEMAS

Antes de dar una clasificación de problemas, conviene empezar a describir la


palabra problema.
Podremos pensar en problema de diferentes maneras una de ellas es la siguiente
[Gary & Johnson]

"Un problema será una cuestión general que debe ser contestada. Usualmente, un
problema posee varios parámetros, variables libres (cuyos valores son dejados sin
especificar)".

De acuerdo con [Gary & Johnson], un problema queda descrito cuando se


proporciona:

1) Una descripción general de todos sus parámetros y


2) Una descripción de cuales propiedades son requeridas para que la respuesta (o
solución) sea satisfactoria

Una instancia de un problema se obtiene especificando valores particulares para


todos los parámetros del problema.

Consideremos por ejemplo el problema SAT (ver paginas 37 y 38 del libro de texto)
[JFRAUSTO]. Este problema consiste en determinar valores de verdad que
satisfagan una formula lógica del tipo normal conjuntiva. De esta manera la
siguiente son instancias del problema SAT:

~X1 & (X2 V X3)


(X1 v ~X2) & (X1 v ~X3 v X4) & (X2 v ~X4)

Otro ejemplo, es el Problema del Agente viajero, que se describe a continuación. Se


trata de recorrer N ciudades, partiendo de una ciudad origen, pasar por todas las
otras ciudades una sola vez y regresa a la ciudad destino con un recorrido total
mínimo. Una instancia de ese problema sería recorrer todas las ciudades del Estado
de California, partiendo desde la ciudad de los Ángeles.

Si las ciudades se numeran digamos como C= {c1,c2, c3,..,} con distancias d =


{d12, d13 ...} entonces una solución del problema del agente viajero, sería una
secuencia de elementos de C, Los diferentes posibles casos del problema del agente
viajero, se conocen como instancias.

Así por ejemplo, una instancia del problema del agente viajero, con 5 ciudades es la
siguiente:

PROBLEMA AGENTE VIAJERO 1: Se tienen las siguientes ciudades


c1: Cuernavaca (ciudad origen)
c2: Cuautla
c3: Jojutla
c4: Tequesquitengo
c5: Ciudad de México
donde las distancias entre las diferentes ciudades se conoce.
¿Cuál es el recorrido más corto que se puede tener si se parte de la ciudad de
Cuernavaca, si se desea visitar todas las ciudades y regresar a Cuernavaca?

Una posible solución es la siguiente:


C'= {c1,c3,c4,c5,c2,c1}; con un recorrido total de 260 KM.

Otra solución para esa instancia pudiera ser C''= {c1,c3,c4,c5,c1,c2} con un
recorrido total de 240 km,

Por otra parte, como ya hemos establecido, podemos pensar en los algoritmos
como procedimientos paso a paso, que resuelven problemas. Por esta razón, es
lógico pensar, que no todos los problemas tienen algoritmos efiecientes para todas
sus intancias.

Se dice que un algoritmo resuelve un problem P sí este algoritmo puede ser


aplicado a cualquier instancia I de P y se garantiza que siempre obtiene una
solución para ella.

Hacemos notar que cuando decimos que se tiene un algoritmo para un problema
cuando es capaz de encontrar una solución para él; esto no significa que realmente
lo resuelve!!. Así por ejemplo C' y C'' son soluciones que pudieron ser encontradas
por un algoritmo, aun cuando ninguna de ellas sea el recorrido mínimo.

Para cada algoritmo se puede, en principio construir las funciones del tiempo
requerido por el algoritmo, en términos de la longitud de la entrada. De esta
manera se puede obtener una función del tamaño del problema, contra el tiempo
requerido para resolverlo. Esta función es conocida como complejidad temporal del
algoritmo.

Dado que cada instancia de un problema pudiera tener diferentes parámetros que
pudieran cambiar, con frecuencia se toma como medida del tiempo requerido para
medir la complejidad de un algoritmo, el del peor caso. Esto también puede, desde
luego, ser realizado para el caso de la cantidad de memoria requerida (complejidad
espacial).

El caso más estudiado se refiere a la complejidad temporal. a continuación se


presenta una clasificación de algoritmos en términos de su complejidad temporal
que estudiaremos en este curso:
lineal: f(n) = n
Cuadrada: f(n) = n2
Cúbica: f(n) = n3
exponencial f(n) = 2 n, 3 n, 4 n, 2.71 n

Para un problema dado, los algoritmos que son una función polinomial del tamaño
de la entrada (por ejemplo: n, n2 ,n3,..), mientras que aquellos que no lo son se
llaman no-polinomiales.

Una función de complejidad temporal para un algoritmo, expresa la cantidad de


tiempo que el algoritmo requiere para resolver un problema particular. Dicha
función establece, para cada posible longitud de la entrada, la cantidad de tiempo
más grande posible, que el algoritmo necesita para resolver cada instancia del
problema de un tamaño dado (es decir n).

Un algoritmo pueden además ser:


- Deterministico, sí en cada paso del algoritmo, es posible predecir la salida para
una entrada dada.
- No determinísticos, sí existe uno ó más pasos en el algoritmo, para el cual es
posible predecir cual será la salida.

Por esa razón se tienen los siguiente tipos de problemas:

I) Polinomial: Existe al menos un algoritmo polinomial determinístico que lo


resuelve.
II) No -Polinomiales: Solo existen algoritmos polinomiales del tipo no deterministico
que los resuelven.
1. Introducción
Los matemáticos hindúes, árabes y europeos fueron los primeros que desarrollaron técnicas
de cálculo escrito. El matemático árabe Al'Khwarizmi , alrededor del año 830 DC, escribe
un libro de Aritmética, traducido al latín como Algoritmi de numero Indorum, donde
introduce el sistema numérico indio (sólo conocido por los árabes unos 50 años antes) y los
métodos para calcular con él. De esta versión latina proviene la palabra Algoritmo.
Por algoritmo se entiende "una lista de instrucciones donde se especifica una sucesión de
operaciones necesarias para resolver cualquier problema de un tipo dado". Los algoritmos
son modos de resolución de problemas, cabe aclarar que no sólo son aplicables a la
actividad intelectual, sino también a todo tipo de problemas relacionados con actividades
cotidianas. El algoritmo es de carácter general y puede aplicarse a cualquier operación
matemática o a cualquier problema. La formulación de algoritmos fue uno de los más
grandes adelantos dentro de la ciencia matemática ya que a partir de ello se pudieron
resolver infinidad de problemas.
Landa, matemático ruso, quien ha investigado mucho al respecto nos dice que "la ciencia
matemática, en el proceso de su desarrollo, ha tratado de encontrar los algoritmos óptimos
más generales para resolver los problemas que permitan la solución uniforme de clases más
amplias de problemas de una manera, es decir, empleando siempre el mismo sistema de
operación. Los algoritmos, para llegar a ser tales deben reunir ciertas características. Una
de ellas es que los pasos que deben seguirse deben estar estrictamente descritos, cada
acción debe ser precisa, y debe ser general, es decir, que pueda ser aplicable a todos los
elementos de una misma clase. Por ejemplo en el caso del algoritmo de una multiplicación,
no sólo se realizará el procedimiento de resolución parte para la multiplicación de 4 x 4,
sino que el mismo algoritmo podrá aplicarse a cualquier multiplicación. La última de estas
características será la resolución, en otras palabras, esto quiere decir que el algoritmo
deberá llegar a un resultado específico.
Es de gran importancia aclarar que los algoritmos en si mismos no resuelven problemas, se
resuelven gracias al producto de ejercer las operaciones dictadas por el algoritmo, se puede
decir que es por el planteamiento mismo. La realización de algoritmos es natural e innata
en el hombre y en la mayoría de los casos es de tipo inconsciente, en otras palabras, las
personas suelen resolver problemas sin tener que recurrir a la aplicación de cierto
algoritmo. No obstante al encontrarse con problemas de un grado de dificultad mayor es
necesario detenerse a analizar y pensar en la solución de éste .
En el presente trabajo se enfocan diversos puntos que son de gran importancia como lo son
Algoritmo del cual hemos comentado anteriormente . Flujograma el cual no es más que la
representación gráfica de un algoritmo y el cual es necesario para la realización de un buen
programa , haciendo que el hombre organice sus ideas y conozca a fondo el problema a
solucionar con todas las posibles variantes o alternativas utilizando esta técnica. También
se hablará de ciertos puntos referentes a Estructura de Datos, Variables , Constantes y se
reflejaran ejemplos para su mejor compresión.
2. Algoritmo: Definición
Es un Método para resolver un problema mediante una serie de pasos precisos , definidos y
finitos. Un algoritmo es una serie de operaciones detalladas ,en otras palabras un algoritmo
es un conjunto de reglas para resolver una cierta clase de problemas y se puede formular de
muchas formas con el cuidado de que no exista ambigüedad.
Características
 Preciso (debe indicar el orden de realización en cada paso y no puede tener ambiguedad
).
 Definido (si se sigue dos veces, obtiene el mismo resultado cada vez)
 Finito (tiene fin; un número determinado de pasos ).
 Debe ser Sencillo , Legible.
 Modular.
 Eficiente y Efectivo.
 Se ha de desarrollar en el menor tiempo posible.
 Correcto.
 Todo Algoritmo debe tener cero ó mas entradas.
 Debe tener al menos una salida y ésta debe ser tangible.

3. Constantes: Definición
Una constante es un dato cuyo valor no puede cambiar durante la ejecución del programa.
Recibe un valor en el momento de la compilación y este permanece inalterado durante todo
el programa. Las constantes se declaran en una sección que comienza con la palabra
reservada const . Después de declarar una constante se puede usar en el cuerpo principal
del programa.
Tienen varios usos: ser miembro en una expresión, en una comparación, asignar su valor a
una variable, etc.
En el siguiente ejemplo se contemplan varios casos:

const

Min = 0;

Max = 100;
Sep = 10;

var

i : integer;

begin

i := Min;

while i < Max do begin

writeln(i);

i := i + Sep

end

end.

En este ejemplo se declaran tres constantes (Min, Max y Sep). En la primera línea del
cuerpo del programa se asigna una constante a una variable. En la siguiente, se usa una
constante en una comparación. Y en la cuarta, la constante Sep interviene en una expresión
que se asigna a una variable. El resultado de ejecutar este programa sería una impresión en
pantalla de los números: 0, 10, 20, 30, 40, 50, 60, 70, 80 y 90.
Se puede hacer una división de las constantes en tres clases:
 Constantes literales(sin nombre)
 Constantes declaradas (con nombre)
 Constantes expresión
 Constantes literales

Son valores de cualquier tipo que se utilizan directamente, no se declaran ya que no tienen
nombre. En el siguiente ejemplo tienes un par de constantes literales (el 3, el 4, y el 3.1416):

VolumenEsfera := 4/3 * 3.1416 * Radio * Radio * Radio;

 Constantes declaradas
También llamadas constantes con nombre, son las que se declaran en la sección Const
asignándoles un valor directamente.

Por ejemplo:

const

Pi = 3.141592; (* valor real *)


Min = 0; (* entero *)
Max = 99; (* entero *)
Saludo = 'Hola'; (* cadena caract. *)

 Constantes expresión
También se declaran en la sección Const pero a estas no se les asigna un valor
directamente, sino que se les asigna una expresión. Esta expresión se evalúa en tiempo
de compilación y el resultado se le asigna a la constante.
Ejemplo:

const

Min = 0;
Max = 100;
Intervalo = 10;
N = (Max - Min) div Intervalo;
Centro = (Max - Min) div 2;

4. Variables: Definición
Una variable es un nombre asociado a un elemento de datos que está situado en posiciones
contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un
programa. Toda variable pertenece a un tipo de dato concreto. En la declaración de una
variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales,
booleanas, etc. Por otro lado, distinguimos tres partes fundamentales en la vida de una
variable:
Declaración de variables
Esta es la primera fase en la vida de cualquier variable. La forma de declarar variables es
muy sencilla. Esta sección debe comenzar con la palabra reservada var, seguida de una lista
de parejas lista_de_variables=tipo_al_que_pertenecen. Cada par debe ir seguido por un
punto y coma.
La lista_de_variables es uno o más nombres de variables separados por comas:

var listaVar1:tipo1;...;listaVarn:tipon;

Una variable no representa más que una porción de memoria en donde guardamos un dato
que dependerá del tipo al que pertenezca la variable. A diferencia de una constante, el valor
de una variable puede cambiar durante la ejecución de un programa. Otra diferencia, es que
a una variable no basta con declararla, sino que también es necesario iniciarla. Esto se
refiere a darle un valor inicial, y es importante ya que si no lo hacemos, igual nos
encontramos con errores cuando ejecutemos el programa.
Ejemplo de declaración de variables:

...
var

I, J, K : Integer; (* valores enteros *)

Contador : Integer;

Radio : Real; (* valor real *)

Letra : Char; (* un caracter *)

...

En este ejemplo se declaran seis variables. Las cuatro primeras son de tipo entero. La
quinta es de tipo real, o sea, un número con parte decimal. Y la sexta es un carácter, que no
es lo mismo que una cadena de un carácter (String[1]).
Iniciación de variables
Esto no es más que darle un valor inicial a una variable. Así como lo primero que se hace
con una variable es declararla, lo siguiente tiene que ser iniciarla. Esto se hace para evitar
posibles errores en tiempo de ejecución, pues una variable tiene un valor indeterminado
después de declararla. Principalmente, existen dos maneras de otorgar valores iniciales a
variables:
 Mediante una sentencia de asignación
 Mediante uno de los procedimientos de entrada de datos (read o readln)

Veamos un ejemplo que reúne los dos casos:

begin

...

i:=1;

readln(n);

while i < n do begin

(* cuerpo del bucle *)

i := i + 1

end;

...

end.

Utilización de variables
Una vez declarada e iniciada una variable, es el momento de utilizarla. Esta es la parte que
presenta un mayor abanico de posibilidades. A continuación se presentan unas cuantas:
 Incrementar su valor:

i := i + 1
 Controlar un bucle:

for i:=1 to 10 do ...


 Chequear una condición:

if i<10 then ...


 Participar en una expresión:

n := (Max - Min) div I


Tipos de datos.
El tipo de un dato es el conjunto de valores que puede tomar durante el programa. Si se le
intenta dar un valor fuera del conjunto se producirá un error. El tipo de dato le indica al
compilador del lenguaje de programación dos cosas: el número de bytes requeridos para
guardar el dato, y la manera en que se manipulara y operara el dato.
La asignación de tipos a los datos tiene dos objetivos principales:
 Por un lado, detectar errores en las operaciones
 Por el otro, determinar cómo ejecutar estas operaciones

Cada lenguaje de programación tiene sus propios tipos de datos, algunos de estos son
comunes a todos, entre los tipos de datos comunes están :
 Entero,
 Real,
 Carácter,
 Lógico,
 Fecha / hora y Cadena.

El tipo integer (entero)


El tipo de datos entero es un tipo simple, y dentro de estos, es ordinal. Al declarar una
variable de tipo entero, se está creando una variable numérica que puede tomar valores
positivos o negativos, y sin parte decimal. Este tipo de variables, puede utilizarse en
asignaciones, comparaciones, expresiones aritméticas, etc. Algunos de los papeles más
comunes que desarrollan son:
 Controlar un bucle .
 Usarlas como contador, incrementando su valor cuando sucede algo .
 Realizar operaciones enteras, es decir, sin parte decimal
 Y muchas más...

A continuación se muestra un ejemplo en el que aparecen dos variables enteras. Como se


puede ver, en el ejemplo se muestran las dos maneras de declarar una variable de tipo
entero:

type

tContador = integer;

var

i : tContador;

n : integer;

begin

n := 10; (* asignamos valor al maximo *)

i := 1; (* asignamos valor al contador *)

while (i <= n) do begin

writeln('El valor de i es ',i);

i := i + 1

end

end.

El tipo boolean (lógico)


El tipo de datos lógico es el que permite usar variables que disponen sólo de dos posibles
valores: cierto ó falso. Debido a esto, su utilidad salta a la vista, y no es otra que variables de
chequeo. Nos sirven para mantener el estado de un objeto mediante dos valores:
si/no
cierto/falso
funciona/no funciona
on/off
etc.
Para aclararlo, se muestra el siguiente ejemplo:

type

tLogico = boolean;

var

llueve : tLogico; (* si llueve o no *)

paraguas : boolean; (* si encuentro o no el paraguas *)

begin

(* aqui se determinarian los valores de "llueve" y "paraguas" *)

if llueve and (not paraguas) then

writeln('Me quedo en casita')

else

writeln('Me voy a dar un paseo')

end.

El tipo real
El tipo de datos real es el que se corresponde con los números reales. Este es un tipo
importante para los cálculos. Por ejemplo en los estadísticos, ya que se caracterizan por
tratar fundamentalmente con valores decimales. A continuación se muestra un ejemplo en
el que se utiliza el tipo real. En el se puede ver las dos formas de declarar una variable real,
y también el uso de una constante real.

const

pi = 3.1416;

type

tArea = real;

var

A : tArea; (* area *)

R : real; (* radio *)

begin

R := 4.50;

A := pi * R * R; (* calculamos el area *)

writeln('El area para un radio de ',R:4:2,' es ',A:8:4)

end.
Los tipos char y string (carácter y cadena)
Con el tipo carácter se pueden tener objetos que representen una letra, un número, etc. Es
decir, se usan variables o constantes que representen un valor alfanumérico. Pero , cada
variable sólo podrá almacenar un carácter. Sin embargo, con las cadenas de caracteres
(strings) se puede contener en una sóla variable más de un carácter. Por ejemplo, se puede
tener en una variable tu nombre.
Veamos a continuación cómo se usan ambos tipos en el siguiente ejemplo:

type

tNombre = string[10]; (* puede almacenar 10 caracteres *)

var

nombre : tNombre; (* variable para almacenar el nombre *)

letra_NIF : char; (* caracter para contener la letra del NIF *)

begin

nombre := 'Beni';

letra_NIF := 'L';

writeln('Mi nombre es ',nombre,' y mi letra es ',letra_NIF)

end.

Estructura de Datos :Repetitivas y Secuencial


 Estructuras Repetitivas

Las estructuras repetitivas o iterativas son aquellas en las que las acciones se ejecutan un
número determinado de veces y dependen de un valor predefinido o el cumplimiento de
una determinada acción.
Características
 Las estructuras repetitivas permiten representar aquellas acciones que pueden
descomponerse en otras sub-acciones primitivas.
 Es una estructura con una entrada y una salida en la cual se repite una acción un
número determinado o indeterminado de veces
 En una Estructura Repetitiva Mientras (While) se repite una acción mientras se cumpla
la condición que controla el bucle. La característica principal de esta estructura es lque
la condición es evaluada siempre antes de cada repetición.
 La estructura repetitiva Desde(FOR) permite que las instrucciones las cuales contiene en
su ámbito, se ejecuten un número de veces determinado.

Entre las estructuras repetitivas se encuentran:

Mientras (while)

Repetir (repeat)
Estructura Mientras (while)
La estructura repetitiva while, es aquélla en que el cuerpo del bucle se repite mientras se
cumple una determinada condición, su representación gráfica es:

Pseudocódigo en español Pseudocódigo en inglés


Mientras condición hacer while condición do
Acción S1 <Acciones>
Acción S2 :
: End_while
acción Sn
Fin_mientras

Diagrama N-S

1er. Ejemplo:
Contar los números enteros positivos introducidos por teclado. Se consideran dos variables
enteras NUMERO y CONTADOR (contará el número de enteros positivos). Se supone que
se leen números positivos y se detiene el bucle cuando se lee un número negativo o cero.
Pseudocódigo
Inicio
contador 0
Leer (numero)
Mientras numero > 0 hacer
contador contador+1
Leer (numero)
Fin_Mientras
Escribir('El número de enteros positivos es : ', contador)
Fin

Diagrama de Flujo – 1er. Ejemplo

2do. Ejemplo
Se presenta algoritmo para el cálculo de la sumatoria de los n primeros términos de la
siguiente serie:
1*2*3 + 2*3*4 + 3*4*5 + 4*5*6
//WHILE_
#include <iostream.h>
#include <conio.h>
main(){
int i=0, n;
float termino, suma=0;

clrscr(); cout << "Digite el valor de N: "; cin >> n; cout << "\n";
while( i<n ){
i = i + 1;
termino = i * (i+1) * (i+2);
suma = suma + termino;
cout << i << " * " << i+1 << " * " << i+2 << " = " << termino << endl;
}
cout << "\nSumatoria = " << suma;
}

Estructura Repetir (repeat)


Esta estructura se ejecuta hasta que se cumpla una condición determinada que se
comprueba hasta el final del bucle. Se ejecuta al menos una vez. El bucle repetir-Hasta_que
se repite mientras el valor de la expresión booleana de la condición sea falsa, justo la
opuesta de la sentencia mientras.
Pseudocódigo en Español
Pseudocódigo en Inglés
Repetir
Repeat
<acciones> <acciones>
: :
Hasta que <condición>
Until <condición>
Diagrama de Flujo de Repetir
1 er .Ejemplo :
Preguntar un nombre y repetirse en pantalla tantas veces como se desee. (preguntar
cantidad de repeticiones), indicando el número de repetición.
Declaración de variables
Cadena : nom
entero : x, n
Inicio
escribir(‘Nombre : ‘)
leer(nom)
escribir(‘Cuántas veces quieres repetirlo ? : ‘)
leer(n)
para x 1 hasta n hacer
escribir(x’.- ‘, nom)
Fin
2do. Ejemplo
Construir un programa que sume todos los números que introduce el usuario hasta que
introduzca el número cero.
/* declaraciones */
float numero, suma_acumulada;
/*instrucciones*/
comienzo
/* inicialización */
suma_acumulada := 0;
leer (numero);
mientras numero > 0 repetir
comienzo
suma_acumulada := suma_acumulada + numero;
leer (numero);
fin mientras;
mostrar ("La suma acumulada es: ", suma_acumulada);
fin;
Estructura Desde/Para (for)
Esta sentencia incluye una expresión que especifica el valor inicial de un índice, otra
expresión que determina cuando se continúa o no el bucle y una tercera expresión que
permite que el índice se modifique al final de cada pasada.
La forma general de esta sentencia es:
for (expresión 1; expresión 2; expresión 3) sentencia
en donde
expresión 1 (expresión de asignación), inicializa algún parámetro (llamado índice) que
controla la repetición del bucle;
expresión 2 (expresión lógica), representa una condición que debe ser satisfecha para que
se continúe la ejecución del bucle;
expresión 3 (expresión monaria o expresión de asignación), modifica el valor del parámetro
inicialmente asignado por la expresión
La ejecución de la sentencia for sucede de la siguiente forma:
1. Se inicializan los parámetros.

2. Se evalúa la expresión lógica.


2.1. Si el resultado es distinto de cero (verdadero), se ejecuta la sentencia, se evalúa la
expresión que da lugar a la progresión de la condición y se vuelve al punto 2.
2.2. Si el resultado de 2, es cero (falso), la ejecución de la sentencia for se da por finalizada
y se continúa en la siguiente sentencia del programa.
En muchas ocasiones se conoce de antemano el número de veces que se desean ejecutar las
acciones de un bucle. En estos casos en el que el número de iteraciones es fija, se debe usar
la estructura desde o para.
La estructura Desde ejecuta las acciones del cuerpo del bucle un número específico de veces
y de modo automático controla el número de iteraciones o pasos a través del cuerpo del
bucle.
Pseudocódigo en Español
Pseudocódigo en Inglés
Desde variable(v)= vi Hasta vf hacer For variable (v)= vi To vf Do
<acciones> <acciones>
:
Fin_desde
Donde:
v: Variable índice
vi, vf: Valores inicial y final de la variable
Diagrama de Flujo de la estructura Desde/Para
1er.Ejemplo
Cuenta del 1 al 50 varias veces, con variantes de la instrucción FOR.
//FOR_
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
main(){
int i=1;

clrscr();
for( ; i<=50; i++)
cout << setw(5) << i;
cout << "\n\n";

for(i=1; i<=50; i++)


cout << setw(5) << i;
cout << "\n\n";

i = 0;
for( ; i<50; ) {
i++;
cout << setw(5) << i;
}
cout << "\n\n";

for(i=1 ; i<=50; ) {
cout << setw(5) << i;
i++;
}
cout << "\n\n";

i = 0;
for( ; ; ) {
i ++;
if (i > 50)
break;
else
cout << setw(5) << i;
}

getch();}
2do. Ejemplo
Expansión binomial:
n n-i i
(a+b)_ = S ( n! / (i!×(n-i)!))×a × b
i=0
El siguiente algoritmo muestra en pantalla los coeficientes de la expansión binomial para
un N dado por teclado:
//FOR_5.CPP
#include <iostream.h>
#include <conio.h>

float factorial(int numero){


int i;
float f=1;

for(i=1; i<=numero; i++)


f = f * i;
return f;
}

main(){
int n, i, a, b, coeficiente;

clrscr();
cout<<"Digite exponente(n) para calcular coeficientes del binomial (a+b)_: ";
cin >> n;
cout <<"\n";
for(i=0; i<=n; i++) {
coeficiente = factorial(n) / (factorial(i)*factorial(n-i));
cout << coeficiente << " ";
}
getch();
return 0;
}


o Estructura Secuencial
 Es aquélla en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se
suceden de tal modo que la salida de una es la entrada de la siguiente y así
sucesivamente hasta el fin del proceso.

Características
 La estructura secuencial tiene una entrada y una salida.
 Un programa puede contener simplemente una secuencia de instrucciones.
 Es aquella que ejecuta las acciones sucesivamente unas a continuación de otras sin
posibilidad de omitir ninguna y naturalmente, sin bifurcaciones.
 Su representación gráfica es la siguiente:
Estructura Secuencial

....
Pseudocódigo De Una Estructura Secuencial
Inicio
:
:
acciones
:
fin
1er. Ejemplo :
Calcular el salario neto de un trabajador en función del número de horas trabajadas,
precio de la hora de trabajo y considerando unos descuentos fijos al sueldo bruto en
concepto de impuestos (20 por 100).
Pseudocódigo
Inicio
{cálculo salario neto}
leer nombre, horas, precio_hora
salario_bruto horas * precio
impuestos 0.20 * salario_bruto
salario_neto salario_bruto_impuestos
escribir nombre, salario_bruto, salario_neto_bruto, salario_neto
Fin

Diagrama de flujo – 1er. Ejemplo


2do. Ejemplo
Suponga que un curso estaba compuesto de tres estudiantes. Cada uno de los estudiantes
cursó dos asignaturas. Se deben leer inicialmente los nombres de los tres estudiantes, los
nombres de las dos asignaturas y luego: las calificaciones definitivas de cada una de las dos
asignaturas para cada uno de los tres estudiantes. Calcular:
1. la nota promedio de cada uno de los tres estudiantes.
2. 2. la nota promedio de cada una de las asignaturas.

INICIO
CARACTER Asignatura1[10], Asignatura2[10],
Estudiante1[15], Estudiante2[15], Estudiante3[15];
REAL Est1Asig1, Est1Asig2,
Est2Asig1, Est2Asig2,
Est3Asig1, Est3Asig2,
PromedioAsignatura1, PromedioAsignatura2,
PromedioEstudiante1,PromedioEstudiante2, PromedioEstudiante3;
Escribir("Digite Nombre asignatura 1: ")
Leer(Asignatura1)
Escribir("Digite Nombre asignatura 2: ")
Leer(Asignatura2)
Escribir("Digite Nombre estudiante 1: ")
Leer(Estudiante1)
Escribir("Digite Nombre estudiante 2: ")
Leer(Estudiante2)
Escribir("Digite Nombre estudiante 3: ")
Leer(Estudiante3)
//A continuación se pedirá digitar las 3 * 2 = 6 calificaciones
Escribir("Digite Calificaciones de ", Estudiante1, ":")
Escribir("En la asignatura de ", Asignatura1, ": ")
Leer(Est1Asig1)
Escribir("En la asignatura de ", Asignatura2, ": ")
Leer(Est1Asig2)

Escribir("Digite Calificaciones de ", Estudiante2 ": ")


Escribir("En la asignatura de ", Asignatura1, ": ")
Leer(Est2Asig1)
Escribir("En la asignatura de ", Asignatura2, ": ")
Leer(Est2Asig2)

Escribir("Digite Calificaciones de ", Estudiante3, ": ")


Escribir("En la asignatura de ", Asignatura1, ": ")
Leer(Est3Asig1)
Escribir("En la asignatura de ", Asignatura2, ": ")
Leer(Est3Asig2)

//A continuación los cálculos necesarios

PromedioEstudiante1 = (Est1Asig1 + Est1Asig2) / 2


PromedioEstudiante2 = (Est2Asig1 + Est2Asig2) / 2
PromedioEstudiante3 = (Est3Asig1 + Est3Asig2) / 2

PromedioAsignatura1 = (Est1Asig1 + Est2Asig1 + Est3Asig1) / 3


PromedioAsignatura2 = (Est1Asig2 + Est2Asig2 + Est3Asig2) / 3

Escribir("Promedio estudiantes en ", Asignatura1, "=", PromedioAsignatura1)


Escribir("Promedio estudiantes en ", Asignatura2, "=", PromedioAsignatura2)

Escribir("Promedio ", Estudiante1, " = ", PromedioEstudiante1)


Escribir("Promedio ", Estudiante2, " = ", PromedioEstudiante2)
Escribir("Promedio ", Estudiante3, " = ", PromedioEstudiante3)

FIN.

3er. Ejemplo
En unas elecciones se presentan tres candidatos. a continuación se presenta algoritmo para
calcular estadísticas elementales de la elección. Se tienen en cuenta los votos en blanco y la
población electoral total.
A
INICIO
Constante REAL TotalCensoElectoral = 50000
CARACTER Candidato1[15], Candidato2[15], Candidato3[15]
REAL VotosCandidato1, VotosCandidato2, VotosCandidato3, VotosEnBlanco,
TotalVotosEleccion,
PorcentajeCandidato1,PorcentajeCandidato2, PorcentajeCandidato3,
PorcentajeVotosEnBlanco,
PorcentajeCiudadanosResponsables,
PorcentajeCiudadanosInconcientes;

Escribir("Digite Nombre candidato 1: ")


Leer(Candidato1)
Escribir("Digite Nombre candidato 2: ")
Leer(Candidato2)
Escribir("Digite Nombre candidato 3: ")
Leer(Candidato3)

Escribir("Digite votación de ", Candidato1, ": ")


Leer(VotosCandidato1)
Escribir("Digite votación de ", Candidato2, ": ")
Leer(VotosCandidato2)
Escribir("Digite votación de ", Candidato3, ": ")
Leer(VotosCandidato3)
Escribir("Digite votación en blanco ")
Leer(VotosEnBlanco)

//A continuación los cálculos necesarios


TotalVotosEleccion = VotosCandidato1 + VotosCandidato2 +
VotosCandidato3 + VotosEnBlanco

PorcentajeCandidato1 = ( VotosCandidato1 / TotalVotosEleccion ) * 100


PorcentajeCandidato2 = ( VotosCandidato2 / TotalVotosEleccion ) * 100
PorcentajeCandidato3 = ( VotosCandidato3 / TotalVotosEleccion ) * 100
PorcentajeVotosEnBlanco = ( VotosEnBlanco / TotalVotosEleccion ) * 100

PorcentajeCiudadanosResponsables=(TotalVotosEleccion/TotalCensoElectoral)*100
PorcentajeCiudadanosInconcientes = 100 - PorcentajeCiudadanosResponsables

Escribir("Porcentaje ", Candidato1, " = ", PorcentajeCandidato1)


Escribir("Porcentaje ", Candidato2, " = ", PorcentajeCandidato2)
Escribir("Porcentaje ", Candidato3, " = ", PorcentajeCandidato3)
Escribir("Porcentaje de votos en blanco = ", PorcentajeVotosEnBlanco)

Escribir("Si votaron = ", PorcentajeCiudadanosResponsables, "%")


Escribir("NO votaron = ", PorcentajeCiudadanosInconcientes, "%")
FIN.
5. Flujograma: Definición
Es un esquema para representar gráficamente un algoritmo .Se basan en la utilización de
diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo
porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia
de operación.
Para hacer comprensible los Diagramas a todas las personas , los Símbolos se sometieron a
una normalización , o lo que es en realidad se hicieron símbolos casi universales, ya que , en
un principio cada usuario podría tener sus propios símbolos para representar sus procesos
en forma de Diagrama de Flujo. Esto trajo como consecuencia que solo el que conocía sus
símbolos, los podía interpretar.
La simbología utilizada para la elaboración de diagramas de flujo es variable y debe
ajustarse a un patrón definido previamente.
A continuación se mostrara las simbologías mas utilizadas :
Simbologia utilizada en los diagramas de flujo

Símbolo función
Ejemplo de un Algoritmo sencillo con su respectivo Flujograma
Considere un Algoritmo para leer dos números A y B luego sumarlos y por último imprimir
o mostrar el resultado de la suma.
Algoritmo : Representación Grafica :
Inicio
Leer A
Leer B
C=A+B
Mostrar C
Fin
6. Bibliografía
 Rivas , Dolores y Salas Régulo. 1985

Introducción a la Computación
Tercera Edición - Esprosistemas.
 http : //www.ulpgc.es/otros/tutoriales/mtutor/indice.html
 http : //www.monografías.com
 http : //www.edu.aytolacoruna.es/aula/programación/flujo.htm
 http : //www.etsi2.ugr.es/alumnos/mlii/alkhwarizmi/.htm
 http : //www.etsi2.ugr.es/alumnos/mlii/algoritmo/.htm
 Colección Practica del Estudiante(Cole) , 1983

DEFINICION E HISTORIA DE ALGORITMO


DEFINICION DE ALGORITMO
Podemos en contar varias definiciones entre ellas las siguientes
1. Algoritmo (del latín, dixit algurithmus): es una lista bien definida, ordenada y finita de
operaciones que permite hallar la solución a un problema. Esto quiere decir que tiene
un estado inicial y una entrada, a través de pasos sucesivos y bien definidos la cual
tiene final.
2. Antiguamente algoritmo significaba descripción de un cálculo, como por ejemplo de
la nueva división después de introducir las fracciones decimales, en la a dualidad es
todo descripción de un cálculo en general con un esquema de procesos que se repite.
3. Se define también como el conjunto de procesos finito que deben seguir para
realizar una tarea :
Proceso 1. Debe ser el mismo conjunto de datos para que siempre se llegue a un
mismo conjunto de resultados.
Proceso 2. Las instrucciones han de ser precisos, sin ambigüedad.
Proceso 3. El conjunto debe ser finito.

HISTORIA DEL ALGORITMO


Estos bienes surgieron a mediados del siglo IX por el matemático distinguido y
astrónomo Mohammed Ibn Musa -aljarizm: pero podemos ver que Al_yebr-mugabata
es otro que desarrollo formulas para posibilitar que con un número limitado de
procesos fuese posible resolver ecuaciones de primer y segundo grado.
La historia del algoritmo nace por necesidad de hacer cálculos matemáticos atraves,
de ella se fundamenta el paso inicial de entender acabadamente cualquier problema
planteada.
Pero también tengamos en cuenta que los algoritmos están en el corazón mismos de
los ordenadores y que los leguajes de computación solo son un medio de expresarlos.
Conforme transcurre el tiempo se crea las simbologías de los algoritmos:
Se utiliza un rectángulo redondeado para el inicio y finalización de las algoritmos, los
rombos son utilizados para las decisiones y los rectángulos para las acciones a tomar.
Las flechas nos indican el flujo teniendo en cuenta que las decisiones no crecerán
verticalmente y las decisiones por si crecerán ala derecha. Si bien estos no son los
únicos símbolos.

El algoritmo tiene la virtud de brindarnos a todos la oportunidad de seleccionar aquello


que se considera priotario decimos que no es poco y la capacidad contenida como
ordenador del pensamiento da comienzo en el primer paso, el cual implica plantear el
problema .
No podemos señalar que el algoritmo no es una noción de las centrales en matemática
principalmente en al área correspondiente de la matemática computacional.
En la teoría de los algoritmos podemos mencionar que los algoritmos empezara hadar
inicio aproximadamente a lo alargo de la historia en el siglo 19 aunque ya se tenía
cierto conocimiento.
En la teoría de los algoritmos a objetos no constructivos se hace necesario nombrar a
esto como objetos constructivos, por lo que la teoría de la numeración prácticamente
se convierte en un interesante apartado de la teoría de algoritmos.

Introducción (1-2)
"Hablar de computación, es hablar de un tema apasionante en todos los sentidos, nos hace
soñar sobre el futuro, nos hace discutir sobre las tecnologías apropiadas y sus costos, las
políticas para desarrollar una industria, institución y un país. Pero fundamentalmente
hablar de computación o informática es hablar de la necesidad de recursos humanos
capacitados, de los cambios en la forma de trabajar y los nuevos empleos, de las nuevas
posibilidades de desarrollo individual y hasta de aprendizaje con la inserción de la
computadora; hablar de computación es hablar de educación.
Hoy, la educación en la Argentina está pasando por un momento "de excepcionales
expectativas", a partir de la sanción de la Ley Federal de Educación (y su consecuente
implementación) y todo el replanteo estructural y metodológico que ello supone y que hay
que tratar de aprovechar rápidamente para no caer en el desengaño y el escepticismo, como
ya ha sucedido en otras ocasiones.
Específicamente, en cuanto a informática educativa se refiere, el avance -
independientemente del estrictamente tecnológico- se ha dado en cuatro aspecto, que se
señalan a continuación:
la aceptación generalizada de las herramientas informáticas como una necesidad para
adecuar a nuestros alumnos al ritmo que marca la sociedad;
el enfoque, ya casi consensuado de las computadoras como instrumentos que permiten la
integración curricular y no como objetos de estudio en sí mismos;
la producción nacional y la importación de software educativo en español en casi todas las
áreas y niveles de la currícula escolar en un número impensado dos o tres años atrás;
la proliferación de cursos de posgrado en informática educativa, posibilitando la
jerarquización de los profesionales de esta área, elevando de esta forma el nivel académico
de las clases.
Sin embargo, aún con estos logros, sigue existiendo una real dicotomía, entre lo que
muchos chicos hacen en sus casa y lo que les brindan en el colegio. La función de un
verdadero directivo no sólo es estar a la altura de lo que un alumno puede hacer, sino
también estar un paso adelante, en síntesis: prever.
Se debe tener la convicción de que la escuela deber ser un espacio movilizador de la
capacidad intelectual, de la creatividad y del sentido innovador de sus conocimientos
generados en ella al medio social en el que se halla inserta.
Promover la utilización de la computadora en la escuela, como herramienta tecnológica con
una finalidad esencialmente pedagógica, orientadora del "saber saber" y del "saber hacer",
con el objeto de contribuir con el mejoramiento de la calidad de la Educación, que permita a
la persona, mediante comprensión de los códigos de las nuevas tecnologías, entender el
mundo en que vive, adaptarse activamente a la sociedad y conscientes de que el
conocimiento aquí y ahora, es dinamizador del crecimiento y herramienta fundamental
para el cambio y la transformación social."
Citas
(1) Fuente consultada: Rivera Porto, Eduardo. La computadora en la educación.
www.horizonte.com.ar. Ed. Publicaciones Portorriqueñas. San Juan. 1993.
(2) Web del Centro de Informática Educativa (CIE) de la Universidad Nacional de San Luis.
www.unsl.edu.ar/cie. San Luis. 2000.

Capítulo I
I.1 Breve Historia de la Informática (3)
El origen de las máquinas de calcular está dado por el ábaco chino, éste era una tablilla
dividida en columnas en la cual la primera, contando desde la derecha, correspondía a las
unidades, la siguiente a la de las decenas, y así sucesivamente. A través de sus movimientos
se podía realizar operaciones de adición y sustracción.
Otro de los hechos importantes en la evolución de la informática lo situamos en el siglo
XVII, donde el científico francés Blas Pascal inventó una máquina calculadora. Ésta sólo
servía para hacer sumas y restas, pero este dispositivo sirvió como base para que el alemán
Leibnitz, en el siglo XVIII, desarrollara una máquina que, además de realizar operaciones
de adición y sustracción, podía efectuar operaciones de producto y cociente. Ya en el siglo
XIX se comercializaron las primeras máquinas de calcular. En este siglo el matemático
inglés Babbage desarrolló lo que se llamó "Máquina Analítica", la cual podía realizar
cualquier operación matemática. Además disponía de una memoria que podía almacenar
1000 números de 50 cifras y hasta podía usar funciones auxiliares, sinembargo seguía
teniendo la limitación de ser mecánica.
Recién en el primer tercio del siglo XX, con el desarrollo de la electrónica, se empiezan a
solucionar los problemas técnicos que acarreaban estas máquinas, reemplazándose los
sistemas de engranaje y varillas por impulsos eléctricos, estableciéndose que cuando hay un
paso de corriente eléctrica será representado con un *1* y cuando no haya un paso de
corriente eléctrica se representaría con un *0*.
Con el desarrollo de la segunda guerra mundial se construye el primer ordenador, el cual
fue llamado Mark I y su funcionamiento se basaba en interruptores mecánicos.
En 1944 se construyó el primer ordenador con fines prácticos que se denominó Eniac.
En 1951 son desarrollados el Univac I y el Univac II (se puede decir que es el punto de
partida en el surgimiento de los verdaderos ordenadores, que serán de acceso común a la
gente).
I.1.1 Generaciones
1° Generación: se desarrolla entre 1940 y 1952. Es la época de los ordenadores que
funcionaban a válvulas y el uso era exclusivo para el ámbito científico/militar. Para poder
programarlos había que modificar directamente los valores de los circuitos de las máquinas.

2° Generación: va desde 1952 a 1964. Ésta surge cuando se sustituye la válvula por el transistor. En esta
generación aparecen los primeros ordenadores comerciales, los cuales ya tenían una programación
previa que serían los sistemas operativos. Éstos interpretaban instrucciones en lenguaje de programación
(Cobol, Fortran), de esta manera, el programador escribía sus programas en esos lenguajes y el
ordenador era capaz de traducirlo al lenguaje máquina.

3° Generación: se dio entre 1964 y 1971. Es la generación en la cual se comienzan a utilizar los circuitos
integrados; esto permitió por un lado abaratar costos y por el otro aumentar la capacidad de
procesamiento reduciendo el tamaño físico de las máquinas. Por otra parte, esta generación es
importante porque se da un notable mejoramiento en los lenguajes de programación y, además, surgen
los programas utilitarios.

4° Generación: se desarrolla entre los años 1971 y 1981. Esta fase de evolución se caracterizó por la
integración de los componentes electrónicos, y esto dio lugar a la aparición del microprocesador, que es
la integración de todos los elementos básicos del ordenador en un sólo circuito integrado.

5° Generación: va desde 1981 hasta nuestros días (aunque ciertos expertos consideran finalizada esta
generación con la aparición de los procesadores Pentium, consideraremos que aun no ha finalizado) Esta
quinta generación se caracteriza por el surgimiento de la PC, tal como se la conoce actualmente.

I.2 La Informática en la Educación (4)


Informática no puede ser una asignatura más, sino la herramienta que pueda ser útil a
todas las materias, a todos los docentes y a la escuela misma, en cuanto institución que
necesita una organización y poder comunicarse con la comunidad en que se encuentra.
Entre las aplicaciones más destacadas que ofrecen las nuevas tecnologías se encuentra la
multimedia que se inserta rápidamente en el proceso de la educación y ello es así, porque
refleja cabalmente la manera en que el alumno piensa, aprende y recuerda, permitiendo
explorar fácilmente palabras, imágenes, sonidos, animaciones y videos, intercalando pausas
para estudiar, analizar, reflexionar e interpretar en profundidad la información utilizada
buscando de esa manera el deseado equilibrio entre la estimulación sensorial y la capacidad
de lograr el pensamiento abstracto. En consecuencia, la tecnología multimedia se convierte
en una poderosa y versátil herramienta que transforma a los alumnos, de receptores pasivos
de la información en participantes activos, en un enriquecedor proceso de aprendizaje en el
que desempeña un papel primordial la facilidad de relacionar sucesivamente distintos tipos
de información, personalizando la educación, al permitir a cada alumno avanzar según su
propia capacidad. No obstante, la mera aplicación de la multimedia en la educación no
asegura la formación de mejores alumnos y futuros ciudadanos, si entre otros requisitos
dichos procesos no van guiados y acompañados por el docente. El docente debe seleccionar
criteriosamente el material a estudiar a través del computador; será necesario que
establezca una metodología de estudio, de aprendizaje y evaluación, que no convierta por
ejemplo a la información brindada a través de un CD-ROM en un simple libro animado, en
el que el alumno consuma grandes cantidades de información que no aporten demasiado a
su formación personal. Por sobre todo el docente tendrá la precaución no sólo de examinar
cuidadosamente los contenidos de cada material a utilizar para detectar posibles errores,
omisiones, ideas o conceptos equívocos, sino que también deberá fomentar entre los
alumnos una actitud de atento juicio crítico frente a ello.
A la luz de tantos beneficios resulta imprudente prescindir de un medio tan valioso como lo
es la Informática, que puede conducirnos a un mejor accionar dentro del campo de la
educación. Pero para alcanzar ese objetivo, la enseñanza debe tener en cuenta no sólo la
psicología de cada alumno, sino también las teorías del aprendizaje, aunque se desconozca
aún elementos fundamentales de esos campos. Sin embargo, la educación en general y la
Informática Educativa en particular, carecen aún de estima en influyentes núcleos de la
población, creándose entonces serios problemas educativos que resultan difíciles de
resolver y que finalmente condicionan el desarrollo global de la sociedad. La mejora del
aprendizaje resulta ser uno de los anhelos más importante de todos los docentes; de allí que
la enseñanza individualizada y el aumento de productividad de los mismos son los
problemas críticos que se plantean en educación; el aprendizaje se logra mejor cuando es
activo, es decir cuando cada estudiante crea sus conocimientos en un ambiente dinámico de
descubrimiento. La duración de las clases y la metodología empleada en la actualidad, son
factores que conducen fundamentalmente a un aprendizaje pasivo. Dado que la adquisición
de los conocimientos no es activa para la mayoría de los estudiantes la personalización se
hace difícil. Sería loable que los docentes dedicasen más tiempo a los estudiantes en forma
individual o en grupos pequeños; solamente cuando cada estudiante se esfuerza en realizar
tareas, podemos prestarle atención como individuo.
La incorporación de nuevos avances tecnológicos al proceso educativo necesita estar
subordinada a una concepción pedagógica global que valorice las libertades individuales, la
serena reflexión de las personas y la igualdad de oportunidades, hitos trascendentes en la
formación de las personas, con vistas a preservar en la comunidad los valores de la verdad y
la justicia. La computadora es entonces una herramienta, un medio didáctico eficaz que
sirve como instrumento para formar personas libres y solidarias, amantes de la verdad y la
justicia. En consecuencia toda evaluación de un proyecto de Informática Educativa debería
tener en consideración en qué medida se han logrado esos objetivos.
De lo expuesto se desprende lo siguiente:
-Problema: Puede la Informática utilizarse como recurso didáctico-pedagógico en las
distintas áreas y/o disciplinas de la Educación sistemática?
-Hipótesis: La Informática puede utilizarse como recurso didáctico-pedagógico en las
distintas áreas y/o disciplinas de la Educación sistemática porque favorece al proceso de
enseñanza-aprendizaje.
Citas
Datos extraídos de Magazine de Horizonte Informática Educativa. Bs. As. 1999.
Fuente utilizada: Beccaría, Luis P. - Rey, Patricio E.."La inserción de la Informática en la
Educación y sus efectos en la reconversión laboral". Instituto de Formación Docente -SEPA-
. Buenos Aires. 1999.
Capítulo II
II.1 Las Nuevas Tecnologías en la Educación (5)
La revolución informática iniciada hace cincuenta años e intensificada en la última década
mediante el incesante progreso de las nuevas tecnologías multimediales y las redes de datos
en los distintos ambientes en los que se desenvuelven las actividades humanas, juntamente
con la creciente globalización de la economía y el conocimiento, conducen a profundos
cambios estructurales en todas las naciones, de los que la República Argentina no puede
permanecer ajeno y en consecuencia a una impostergable modernización de los medios y
herramientas con que se planifican, desarrollan y evalúan las diferentes actividades, entre
otras, las que se llevan a cabo en los institutos de enseñanza del país. El análisis sobre las
computadoras y la escuela, tema reservado inicialmente a los especialistas en educación e
informática, se ha convertido en un debate público sobre la informática en la escuela y sus
consecuencias sociales.
Variada resulta en la actualidad el abanico de las diversas realidades en que se
desenvuelven los establecimientos educacionales, desde los que realizan denodados
esfuerzos por mantener sus puertas abiertas brindando un irremplazable servicio, hasta
aquellos otros que han logrado evolucionar a tono con los modernos avances tecnológicos,
sin olvidar una significativa mayoría de los que diariamente llevan a cabo una silenciosa e
invalorable tarea en el seno de la comunidad de la que se nutren y a la que sirven.
Esas realidades comprenden también -en muchos casos- la escasez de docentes
debidamente capacitados, las dificultades relacionadas con la estabilidad del personal
disponible, la persistencia de diversos problemas de infraestructura edilicia, la
discontinuidad en los proyectos emprendidos y las estrecheces económicas siempre vigente,
sin olvidar las inevitables consecuencias en la implementación de la Ley Federal de
Educación de reciente aprobación.
La Informática incide a través de múltiples facetas en el proceso de formación de las
personas y del desenvolvimiento de la sociedad; puede ser observado desde diversos
ángulos, entre los que cabe destacar:
a.- La informática como tema propio de enseñanza en todos los niveles del sistema
educativo, debido a su importancia en la cultura actual; se la denomina también "Educación
Informática".
b.- La informática como herramienta para resolver problemas en la enseñanza práctica de
muchas materias; es un nuevo medio para impartir enseñanza y opera como factor que
modifica en mayor o menor grado el contenido de cualquier currícula educativa; se la
conoce como "Informática Educativa".
c- La informática como medio de apoyo administrativo en el ámbito educativo, por lo que
se la denomina "Informática de Gestión".
De manera que frente al desafío de encarar proyectos de informática en la escuela resulta
fundamental no solo ponderar la importancia relativa que el mismo representa respecto de
otros emprendimientos a promover, sino también evaluar la mencionada problemática en
la que se desenvuelve el establecimiento. La función de la escuela es la de educar a las
nuevas generaciones mediante la transmisión del bagaje cultural de la sociedad,
posibilitando la inserción social y laboral de los educandos; un medio facilitador de nuevos
aprendizajes y descubrimientos, permitiendo la recreación de los conocimientos. Como
espejo que refleja la sociedad, las escuelas no crean el futuro, pero pueden proyectar la
cultura a medida que cambia y preparar a los alumnos para que participen más eficazmente
en un esfuerzo continuado por lograr mejores maneras de vida. Cada sujeto aprende de una
manera particular, única, y esto es así porque en el aprendizaje intervienen los cuatro
niveles constitutivos de la persona: organismo, cuerpo, inteligencia y deseo. Podemos
afirmar que la computadora facilita el proceso de aprendizaje en estos aspectos. Desde lo
cognitivo, su importancia radica fundamentalmente en que es un recurso didáctico más al
igual que los restantes de los que dispone el docente en el aula, el cual permite plantear
tareas según los distintos niveles de los educandos, sin comprometer el ritmo general de la
clase.
Existe una gran variedad de software educativo que permite un amplio trabajo de las
operaciones lógico-matemáticas (seriación, correspondencia, clasificación, que son las base
para la construcción de la noción de número) y también de las operaciones infralógicas
(espacio representativo, secuencias temporales, conservaciones del objeto) colaborando así
con la reconstrucción de la realidad que realizan los alumnos, estimulándolos y
consolidando su desarrollo cognitivo. La computadora favorece la flexibilidad del
pensamiento de los alumnos, porque estimula la búsqueda de distintas soluciones para un
mismo problema, permitiendo un mayor despliegue de los recursos cognitivos de los
alumnos. La utilización de la computadora en el aula implica un mayor grado de
abstracción de las acciones, una toma de conciencia y anticipación de lo que muchas veces
hacemos "automáticamente", estimulando el pasaje de conductas sensorio-motoras a
conductas operatorias, generalizando la reversibilidad a todos los planos del pensamiento.
Desde los planos afectivo y social, el manejo de la computadora permite el trabajo en
equipo, apareciendo así la cooperación entre sus miembros y la posibilidad de intercambiar
puntos de vista, lo cual favorece también sus procesos de aprendizaje. Manejar una
computadora permite a los alumnos mejorar su autoestima, sintiéndose capaces de "lograr
cosas", realizar proyectos, crecer, entre otros. Aparece también la importancia constructiva
del error que permite revisar las propias equivocaciones para poder aprender de ellas. Así el
alumno es un sujeto activo y participante de su propio aprendizaje que puede desarrollar
usos y aplicaciones de la técnica a través de la inserción de las nuevas tecnologías. El
método de razonar informático es concretamente el método de diseño descendente de
algoritmos que es positivamente enriquecedor como método sistemático y riguroso de
resolución de problemas y de razonamiento. De tal manera que el docente, debe dominar
una forma de trabajar metódica, que enseña a pensar y que permite el aprendizaje por
descubrimiento, el desarrollo inteligente y la adquisición sólida de los patrones del
conocimiento. El alumno, estará preparado entonces para distinguir claramente cual es el
problema y cual es el método más adecuado de resolución. La computadora es además, para
el docente, un instrumento capaz de revelar, paso a paso, el avance intelectual del alumno.
II.2 El Rol del Docente en la Educación (5)
Todo esto podrá realizarse solamente si hay un "otro", acompañando y guiando este
proceso de aprendizaje. Este "otro" es, sin lugar a dudas, el docente. Para favorecer este
proceso de aprendizaje, el docente deberá ser, ante todo, una persona flexible, humana,
capaz de acompañar a sus alumnos en este camino de crecimiento y aprendizaje que ellos
realizan. Deberá ser capaz de plantear conflictos cognitivos a los alumnos, apoyándolos en
la construcción de sus estructuras de conocimientos. También deberá colaborar con ellos
para que integren el error como parte del proceso de aprendizaje que está llevando a cabo,
impulsándolos a reflexionar sobre la lógica de sus equivocaciones.
Los educadores de hoy se encuentran ante un volumen creciente de materiales curriculares
y elementos auxiliares de enseñanza: de esta gran multiplicación de libros, objetos
concretos, mapas, películas, libros de texto, computadoras, software educativo, cd-roms,
programas de televisión, medios audiovisuales y tantas otras cosas, ellos deben de alguna
manera seleccionar los materiales que han de ser empleados para enseñar en sus
respectivas clases. En realidad, disponen de pocas referencias de utilidad general a manera
de principios que pudieran ayudarlos a hacer sus selecciones; algunas de ellas, significan
decisiones sobre lo que se va a enseñar; otras encierran selecciones de medios en los cuales
el contenido ya elegido ha de ser presentado. Muchas de estas ideas modernas, son difíciles
de entender, de aceptar y de armonizar con los antiguos conceptos de educación adquiridos
por los docentes. Un particular criterio a desarrollar en los docentes ha de ser el de elegir
adecuadamente los diferentes software educativos a emplear en la educación, considerando
el nivel de los alumnos, la currícula de estudios, la didáctica de enseñanza y los
requerimientos técnicos para su correcta utilización como apoyo a la enseñanza. En muchos
casos, representan un riesgo y producen ansiedad del docente dentro del sistema actual, en
el que tiene que realizar la selección de dichos materiales; entonces el educador no sólo se
encuentra confundido ante una enorme cantidad de productos, sino también desprovisto de
principios confiables para tomar una decisión. Necesita de una preparación
complementaria en los procesos mediante los cuales los nuevos medios son desarrollados,
perfeccionados y evaluados para llegar así a apreciar con seguridad su importancia en
cuanto a niveles de edad y a objetivos educacionales que convengan a cada grupo de
alumnos. La evolución experimentada durante los últimos años en la implementación de
proyectos de informática educativa, promueve el desarrollo de diversas acciones entre las
cuales es necesario destacar la disponibilidad de equipamiento informático adecuado, la
utilización del software más conveniente, el debido mantenimiento y asistencia técnica de
ambos y por último, pero no menos importante, la vigencia de un proyecto institucional
promovido por las autoridades educativas del establecimiento y la formación y capacitación
de los docentes. En efecto, la mera incorporación de las nuevas tecnologías informáticas a
las diversas actividades que se desarrollan habitualmente en los establecimientos
educacionales no logra satisfacer las expectativas creadas, si no se tiene en cuenta la
indispensable necesidad de capacitar simultáneamente los escasos recursos humanos
disponibles a través de un permanente plan de formación y capacitación que incluya el
desarrollo de cursos, la realización de seminarios, encuentros y talleres, que contemple no
sólo los aspectos informáticos sino también los pedagógicos.
II.3 La Capacitación Docente en la Educación (5)
En el caso de la capacitación de los docentes en Informática Educativa podemos identificar
los siguientes caminos para alcanzarla:
a.- El docente como autodidacta: diversos factores -falta de tiempo, atención de la familia,
escasez de recursos económicos, dedicación a la capacitación mediante planes oficiales,
ausencia de incentivos, otros- llevan a muchos docentes a conducir su propio aprendizaje.
No resulta una capacitación regular y suele presentar distintas falencias; de todas maneras,
el autoaprendizaje siempre es valioso, especialmente para mantener actualizados los
conocimientos en una temática como el de las nuevas tecnologías que avanzan tan
vertiginosamente.
b.- El docente capacitado en la Institución Educativa: en muchos casos la capacitación se
realiza en horario extraescolar y en la misma Institución en que se desempeña. No siempre
se consideran los aspectos pedagógicos que rodean la utilización de la informática y se
basan más bien en lo computacional, ya que suelen ser especialistas en sistemas los
encargados de dictar la clases.
c.- La capacitación en institutos dirigidos al público en general: apuntan al entrenamiento
en computación (educación informática) más que a la capacitación en informática
educativa. Se da preferente atención al estudio de los sistemas operativos, los procesadores
de la palabra, las planillas electrónicas, las bases de datos, los graficadores, los diseñadores
gráficos, los programas de animación y para comunicaciones de datos.
d.- La capacitación en Institutos Superiores de Formación Docente: ofrecen cursos, talleres
y seminarios para aprender a utilizar la computadora como medio didáctico eficaz, algunos
con puntaje oficial; suelen ser cortos y modulares.
e.- La capacitación en Institutos Superiores de Formación en Informática Educativa para
Docentes: existen carreras de especialización más extensas, intensivas y la capacitación
resulta sistemática, incluyendo lo pedagógico y lo computacional; proporcionan puntaje
reconocido por las autoridades educativas y otorgan títulos oficiales que habilitan
profesionalmente en la especialidad.
La capacitación que se proporciona a los docentes en Informática Educativa debería reunir
en general las siguientes características:
a.- Impartirse con rigor científico, evitando simplificaciones y las tendencias al facilismo.
b.- Debe ser sistemática: para lo cual se realizará en el marco de un plan integral que
contemple diversas temáticas, incluyendo los aspectos informáticos, pedagógicos y
sistémicos.
c.- La actualización de los conocimientos de los docentes debe ser integral y abarcar por lo
menos los siguientes aspectos:
- Aprehender la profunda influencia que las nuevas tecnologías ejercen en la sociedad
actual.
- Estudiar los procesos psicogenéticos de construcción del conocimiento.
- Analizar el fenómeno de la incorporación de las nuevas tecnologías en las actividades
educativas.
- Estudiar las distintas técnicas específicas para el uso educativo de la informática.
- Asimilar los conocimientos necesarios para respaldar al docente y permitirle abarcar
todos los usos y posibilidades que la informática brinda en las distintas áreas del saber.
d- La enseñanza debe ser modular: a fin de que permita alcanzar objetivos y metas
parciales que se vayan integrando y retroalimentando en el tiempo.
e.- Debe ser permanente, por cuanto la vertiginosa velocidad con que se avanza en el
desarrollo y aplicación de las nuevas tecnologías obliga a una constante capacitación y
actualización de conocimientos.
f.- Debe buscar un efecto multiplicador, es decir la "formación de formadores" con vistas a
la preparación y motivación de futuros ciudadanos con capacidades laborales.
Se observa en general que el docente antes de la capacitación presenta el siguiente perfil
laboral:
a.- No tiene conocimientos de informática y de la posible aplicación en la educación del
computador.
b.- Cuenta con buen nivel pedagógico y tiene interés de aprender y progresar.
c.- Posee necesidad de reconvertirse para el nuevo mercado laboral.
d.- Desea liderar en la escuela proyectos relacionados con las nuevas tecnologías.
Por otro lado, el docente luego de ser capacitado convenientemente, debería alcanzar un
perfil profesional con las siguientes características:
a.- Contar con una permanente actitud para el cambio, la actualización y la propia
capacitación.
b.- Adquirir hábitos para imaginar distintos escenarios y situaciones.
c.- Lograr capacidad para planificar, conducir y evaluar aprendizajes que incluyen la
utilización didáctica de la computadora.
d.- Poseer idoneidad para instrumentar proyectos de Informática Educativa, actuando
como interlocutor entre los alumnos, los docentes de aula y los especialistas en sistemas.
e.- Disponer de competencias para encarar su permanente perfeccionamiento en
Informática Educativa y una visión de constante renovación.
f.- Tener capacidad de iniciativa propia, no esperando consignas adicionales para empezar
a hacer algo.
Una escuela que carece de docentes capacitados en Informática Educativa, podrá ser "una
escuela con computadoras" pero no podrá vencer ese trecho ancho y profundo que separa a
los especialistas en informática (que saben mucho de lo suyo) de los docentes de cualquier
asignatura (que también saben mucho de lo suyo). Lo verdaderamente importante es lograr
que exista un lenguaje en común que les permita a los docentes emplear la informática para
sus clases, organizarlas, comunicarse con los demás colegas y sobre todo, interesar a los
alumnos en una actividad que ellos mismos puedan crear, que les va a ayudar a estudiar y
que además pueda ser muy divertida. El primer paso en la formación de docentes es
prepararlos para que sean paladines del enseñar y pensar.
Citas
Fuente utilizada: Beccaría, Luis P. - Rey, Patricio E.."La inserción de la Informática en la
Educación y sus efectos en la reconversión laboral". Instituto de Formación Docente -SEPA-
. Buenos Aires.

Capítulo III
III.1 Proceso Enseñanza-Aprendizaje (6)
La enseñanza es una actividad intencional, diseñada para dar lugar al aprendizaje de los
alumnos. Pero ligar los conceptos de enseñar y aprender es una manera de manifestar que
la situación que nos interesa es algo más que la relación de acciones instructivas por parte
del profesor y la relación de efectos de aprendizaje en los alumnos. Nos interesa más bien el
entramado de acciones y efectos recíprocos que se generan en las situaciones instructivas.
Pero, cuál es la relación que existe entre la enseñanza y el aprendizaje?.
Febsternacher (1986) ha señalado que normalmente hemos supuesto la existencia, que él
considera discutible, de una relación causal entre la enseñanza y el aprendizaje. Desde esa
posición, sólo cabría hablar de la existencia de enseñanza en la media en que se obtuviera
una reacción de aprendizaje.
Es cierto que hablar de enseñanza requiere hablar de aprendizaje, pero en el mismo sentido
en que una carrera requiere el ganar, o buscar requiere de encontrar. Es decir, en los tres
casos, el primer término requiere del segundo, pero ello no significa que para poder hablar
de enseñanza tenga que ocurrir necesariamente el aprendizaje, lo mismo que puedo
participar en una carrera y no ganar, o no encontrar algo y realmente haberlo buscado.
Existe, por tanto una relación de dependencia entre enseñanza y aprendizaje, pero no es del
tipo de relación que supone que no puede haber enseñanza sin aprendizaje. Es decir existe
una relación pero no es causal, sino de dependencia ontológica.
Debido a que el término aprendizaje vale tanto para expresar una tarea como el resultado
de la misma, es fácil mezclarlos y decir que la tarea de la enseñanza es lograr el resultado
del aprendizaje, cuando en realidad tiene más sentido decir que "la tarea central de la
enseñanza es posibilitar que el alumno realice las tareas del aprendizaje".
Las tareas de enseñanza tienen que ver, más que con la transmisión de contenidos, con
proporcionar instrucciones al alumno sobre cómo realizar las tareas de aprendizaje.
La enseñanza no es un fenómeno de provocación de aprendizaje, sino una situación social
que como tal se encuentra sometida a las variaciones de las interacciones entre los
aspirantes, así como a las presiones exteriores y a las definiciones institucionales de los
roles.
Podemos resumir lo anterior diciendo que en vez de una relación causa-efecto entre
enseñanza y aprendizaje, lo que existe es una relación de dependencia ontológica entre las
tareas que establece el contexto institucional y dentro del cual se descubre el modo de
realización de las tareas de aprendizaje. Son estas últimas las que pueden dar lugar a
aprendizajes. La comprensión de las mediaciones entre estos dos conceptos, de la
dependencia, pero a la vez desigualdad y corte entre ambos, justifica el uso de un concepto
más complejo que el de enseñanza para expresar el referente de la Didáctica, como es la
expresión "proceso de enseñanza-aprendizaje".
Pero los procesos de enseñanza-aprendizaje son simultáneamente un fenómeno que se vive
y se crea desde dentro, esto es, procesos de interacción e intercambio regidos por
determinadas intenciones, fundamentalmente por parte de quien se halla en una posición
de poder o autoridad para definir el régimen básico de actuaciones y disposiciones, en
principio destinadas a hacer posible el aprendizaje; y a la vez es un proceso determinado
desde fuera, en cuanto que forma parte de la estructura de instituciones sociales entre las
cuales desempeña funciones que se explican no desde las intenciones y actuaciones
individuales, sino desde el papel que juega en la estructura social, sus necesidades e
intereses. Tal y como lo expresa Apple "uno puede observar las escuelas y nuestro trabajo
en ellas desde dos ángulos: uno, como forma de mejorar y replantear los problemas, a
través de la cual ayudamos a los estudiantes individualmente para que salgan adelante; y
dos, a escala mucho mayor, para ver los tipos de personas que logran salir y los efectos
sutiles de la institución".
Entenderemos, pues, por proceso de enseñanza-aprendizaje, el sistema de comunicación
intencional que se produce en un marco institucional y en el que se generan estrategias
encaminadas a provocar el aprendizaje.
Con esta definición se resaltan los tres aspectos que mejor caracterizan la realidad de la
enseñanza:
Los procesos de enseñanza-aprendizaje ocurren en un contexto institucional,
transmitiéndole así unas características que trascienden a la significación interna de los
procesos, al conferirle un sentido social.
Los procesos de enseñanza-aprendizaje pueden interpretarse bajo las claves de los sistemas
de comunicación humana, teniendo en cuenta las peculiaridades especificas de aquéllos,
una de las cuales es su carácter de comunicación intencional. La intencionalidad nos remite
tanto a su funcionalidad social como a su pretensión de hacer posible el aprendizaje.
El sentido interno de los procesos de enseñanza-aprendizaje está en hacer posible el
aprendizaje. No hay por qué entender que la expresión "hacer posible el aprendizaje"
significa atender a determinados logros de aprendizaje. Como se ha visto, aprendizaje
puede entenderse como el proceso de aprender y como el resultado de dicho proceso. Para
evitar posibles confusiones convenga decir que el sentido interno de los procesos de
enseñanza-aprendizaje está en hacer posible determinados procesos de aprendizaje, o en
proporcionar oportunidades apropiadas para el aprendizaje.
III.2 Concepto Recursos Didáctico-Pedagógico (7)
Recurso cómo lograr el objetivo?
Para responder este interrogante se determinarán posibles cursos de acción que permitan
alcanzar los resultados esperados.
Esta pregunta lleva a determinar cuáles son las actividades que realizarán docentes y
alumnos, cuáles son las técnicas de enseñanza que el docente seleccionará para organizar
sus actividades y la de los alumnos.
Los recursos didáctico-pedagógicos son los elementos empleados por el docente para
facilitar y conducir el aprendizaje del educando (fotos, láminas, videos, software, etc).
Deben ser seleccionados adecuadamente, para que contribuyan a lograr un mejor
aprendizaje y se deben tener en cuenta algunos criterios, por ejemplo:
deben ser pertinentes respecto de los objetivos que se pretenden lograr.
deben estar disponibles en el momento en que se los necesita.
deben ser adecuados a las características de los alumnos
deben seleccionarse los recursos que permitan obtener los mejores resultados al más bajo
costo, que impliquen la mínima pérdida de tiempo y puedan ser utilizados en distintas
oportunidades.
El docente debe prever, seleccionar y organizar los recursos didáctico-pedagógicos que
integrarán cada situación de aprendizaje, con la finalidad de crear las mejores condiciones
para lograr los objetivos previstos.
La informática como recurso didáctico-pedagógico va adquiriendo un papel más relevante a
medida que la moderna tecnología se va incorporando a la tarea educativa.
Citas
Fuente utilizada: Avolio de Cols, Susana. Planeamiento del Proceso de Enseñanza-
Aprendizaje. Ediciones Marymar S.A.. Buenos aires. 1981.
Fuente utilizada: Contreras Domingo, José . Enseñanza, Currículum y Profesorado.
"Introducción crítica a la Didáctica". Ed. Akal. Buenos Aires. 1990.

Capítulo IV
IV.1 Caracterización de los Niveles Educativos
Con el fin de asegurar la igualdad de oportunidades a todos y adecuarse mejor
a la necesidad de una formación más integrada y vinculadas con los intereses y
la edad de los alumnos se estableció otra organización de los niveles y ciclos.
Todos los niveles tendrán una función propia y otra "propedeútica", es decir vinculada con
la continuación de estudios en el sistema.
En el siguiente cuadro se refleja a grandes rasgos lo que se propone cada nivel de la nueva
estructura:
Cuadro Nº 1: "Organización de los Niveles Educativos "

Necesidad Nivel Funciones a cumplir Areas de formación


educativa que prevista
satisface

Prevención y INICIAL Complementa la acción educadora de Ambitos de experiencia:


educación la familia y compensa desigualdades
Jardín maternal Expresión y comunicación.
temprana para iniciales.
garantizar la calidad (0 a 3 años) Vínculos afectivos.
de los resultados en
todas las etapas del Cognición.
aprendizaje. Motricidad.

Jardín de Autonomía personal.


infantes
Areas en que se
Profundiza los logros educativos
(3 a 5 años) organizan los CBC:
adquiridos en la familia y favorece el
rendimiento en los primeros años de la Matemática.
EGB.
Ciencias sociales, ciencias
El preescolar prepara para el proceso naturales, tecnología.
alfabetizador y ofrece iniciación
sistemática en los procesos Lengua.
curriculares de la EGB. Expresión corporal,
plástica y música.

Educación física

Adquisición de EDUCACION Completa la educación obligatoria, Areas en que se


conocimientos GENERAL desarrolla en toda la población las organizan los CBC:
elementales y BASICA (EGB) competencias básicas necesarias para
Lengua.
comunes el desempeño social y asegura una
1º ciclo:
imprescindibles formación común con vistas a la Matemática.
para toda la 6 a 8 años. educación post-obligatoria.
población. Ciencias Naturales.
Se centra en el logro de la
alfabetización y la adquisición de las Ciencias Sociales.
operaciones numéricas básicas. Tecnología.
2º ciclo: Afianza el conocimiento de la lengua y Educación Artística.
9 a 11 años. la matemática e inicia el estudio
sistemático de los saberes de otros Educación Física.
campos culturales.
Formación Etica y
3º ciclo: Permite la elaboración de hipótesis y la ciudadana.
trascendencia de los límites de lo
12 a 14 años.
concreto. Constituye una unidad
respecto al desarrollo psico-evolutivo
preadolescencia - primera
adolescencia

Dominio de POLIMODAL Brinda una formación general de Habrá orientaciones:


capacidades fundamento que, continuando la EGB,
(15 a 17 años) Humanísticas.
intermedias, profundiza y amplia la formación
deseables para personal y social, al mismo tiempo, una Social.
toda la población, formación orientada hacia un campo
según las diversas laboral. Ambiente y Salud.
realidades y según Administración y Gestión.
Prepara para la incorporación activa al
cada opción.
mundo del trabajo y a la continuación Industria y Agro.
de estudios superiores.
Arte.
Se persigue la formación de
competencias tales como: Cada una de ellas se
orientará a espacios
"aprender a aprender" laborales diferentes.
"aprender a emprender" Todas las orientaciones
"aprender a encontrar trabajo" comprenderán una:

* Formación general o
tronco común que
representa la continuidad
de las áreas básicas de la
EGB.

* Formación orientada,
focalizada en saberes
correspondientes a
determinados espacios
laborales, procurando la
polivalencia.
Logro de alta EDUCACION Institutos de formación Docente: De acuerdo con el tipo y
capacidad y SUPERIOR. preparan para el desempeño eficaz en especialidad de cada
competencias cada uno de los niveles del sistema carrera.
Etapa
diferenciales y educativo y perfecciona a graduados y
profesional: no
opcionales, para docentes en actividad.
universitaria.
distintos grupos de
Institutos de formación Técnica:
población.
brindan formación profesional y
Universitaria. reconversión permanente en áreas
técnicas.

Universidades: forman y capacitan


técnicos.

Fuente: Ley de Educación Federal Nº 24 195. Ministerio de Cult y Educ. de la Nac. Buenos
Aires. 1993.

Capítulo V
V.1 Definición de Software Educativo (8)
V.1.1.- Conceptualización
En esta obra se utilizarán las expresiones software educativo, programas educativos y
programas didácticos como sinónimos para designar genéricamente los programas para
ordenador creados con la finalidad específica de ser utilizados como medio didáctico, es
decir, para facilitar los procesos de enseñanza y de aprendizaje.
Esta definición engloba todos los programas que han estado elaborados con fin didáctico,
desde los tradicionales programas basados en los modelos conductistas de la enseñanza, los
programas de Enseñanza Asistida por Ordenador (EAO), hasta los aun programas
experimentales de Enseñanza Inteligente Asistida por Ordenador (EIAO), que, utilizando
técnicas propias del campo de los Sistemas Expertos y de la Inteligencia Artificial en
general, pretenden imitar la labor tutorial personalizada que realizan los profesores y
presentan modelos de representación del conocimiento en consonancia con los procesos
cognitivos que desarrollan los alumnos.
No obstante según esta definición, más basada en un criterio de finalidad que de
funcionalidad, se excluyen del software educativo todos los programas de uso general en el
mundo empresarial que también se utilizan en los centros educativos con funciones
didácticas o instrumentales como por ejemplo: procesadores de textos, gestores de bases de
datos, hojas de cálculo, editores gráficos. Estos programas, aunque puedan desarrollar una
función didáctica, no han estado elaborados específicamente con esta finalidad.
V.1.2.- Características esenciales de los programas educativos
Los programas educativos pueden tratar las diferentes materias (matemáticas, idiomas,
geografía, dibujo), de formas muy diversas (a partir de cuestionarios, facilitando una
información estructurada a los alumnos, mediante la simulación de fenómenos) y ofrecer
un entorno de trabajo más o menos sensible a las circunstancias de los alumnos y más o
menos rico en posibilidades de interacción; pero todos comparten cinco características
esenciales:
Son materiales elaborados con una finalidad didáctica, como se desprende de la definición.
Utilizan el ordenador como soporte en el que los alumnos realizan las actividades que ellos
proponen.
Son interactivos, contestan inmediatamente las acciones de los estudiantes y permiten un
diálogo y un intercambio de informaciones entre el ordenador y los estudiantes.
Individualizan el trabajo de los estudiantes, ya que se adaptan al ritmo de trabajo cada uno
y pueden adaptar sus actividades según las actuaciones de los alumnos.
Son fáciles de usar. Los conocimientos informáticos necesarios para utilizar la mayoría de
estos programas son similares a los conocimientos de electrónica necesarios para usar un
vídeo, es decir, son mínimos, aunque cada programa tiene unas reglas de funcionamiento
que es necesario conocer.
V.2 Estructuras Básicas de los Programas Educativos (8)

La mayoría de los programas didácticos, igual que muchos de los programas


informáticos nacidos sin finalidad educativa, tienen tres módulos principales claramente
definidos: el módulo que gestiona la comunicación con el usuario (sistema input/output), el
módulo que contiene debidamente organizados los contenidos informativos del programa
(bases de datos) y el módulo que gestiona las actuaciones del ordenador y sus respuestas a
las acciones de los usuarios (motor).
V.2.1.- El entorno de comunicación o interficie
La interficie es el entorno a través del cual los programas establecen el diálogo con sus
usuarios, y es la que posibilita la interactividad característica de estos materiales. Está
integrada por dos sistemas:
El sistema de comunicación programa-usuario, que facilita la transmisión de informaciones
al usuario por parte del ordenador, incluye:
Las pantallas a través de las cuales los programas presentan información a los usuarios.
Los informes y las fichas que proporcionen mediante las impresoras.
El empleo de otros periféricos: altavoces, sintetizadores de voz, robots, módems,
convertidores digitales-analógicos...
El sistema de comunicación usuario-programa, que facilita la transmisión de información
del usuario hacia el ordenador, incluye:
El uso del teclado y el ratón, mediante los cuales los usuarios introducen al ordenador un
conjunto de órdenes o respuestas que los programas reconocen.
El empleo de otros periféricos: micrófonos, lectores de fichas, teclados conceptuales,
pantallas táctiles, lápices ópticos, modems, lectores de tarjetas, convertidores analógico-
digitales.
Con la ayuda de las técnicas de la Inteligencia Artificial y del desarrollo de las tecnologías
multimedia, se investiga la elaboración de entornos de comunicación cada vez más
intuitivos y capaces de proporcionar un diálogo abierto y próximo al lenguaje natural.
V.2.2.- Las bases de datos
Las bases de datos contienen la información específica que cada programa presentará a los
alumnos. Pueden estar constituidas por:
Modelos de comportamiento. Representan la dinámica de unos sistemas. Distinguimos:
Modelos físico-matemáticos, que tienen unas leyes perfectamente determinadas por unas
ecuaciones.
Modelos no deterministas, regidos por unas leyes no totalmente deterministas, que son
representadas por ecuaciones con variables aleatorias, por grafos y por tablas de
comportamiento.
Datos de tipo texto, información alfanumérica.
Datos gráficos. Las bases de datos pueden estar constituidas por dibujos, fotografías,
secuencias de vídeo, etc
Sonido. Como los programas que permiten componer música, escuchar determinadas
composiciones musicales y visionar sus partituras.
V.2.3.- El motor o algoritmo
El algoritmo del programa, en función de las acciones de los usuarios, gestiona las
secuencias en que se presenta la información de las bases de datos y las actividades que
pueden realizar los alumnos. Distinguimos 4 tipos de algoritmo:
Lineal, cuando la secuencia de las actividades es única.
Ramificado, cuando están predeterminadas posibles secuencias según las respuestas de los
alumnos.
Tipo entorno, cuando no hay secuencias predeterminadas para el acceso del usuario a la
información principal y a las diferentes actividades. El estudiante elige qué ha de hacer y
cuándo lo ha de hacer. Este entorno puede ser:
Estático, si el usuario sólo puede consultar (y en algunos casos aumentar o disminuir) la
información que proporciona el entorno, pero no puede modificar su estructura.
Dinámico, si el usuario, además de consultar la información, también puede modificar el
estado de los elementos que configuran el entorno.
Programable, si a partir de una serie de elementos el usuario puede construir diversos
entornos.
Instrumental, si ofrece a los usuarios diversos instrumentos para realizar determinados
trabajos.
Tipo sistema experto, cuando el programa tiene un motor de inferencias y, mediante un
diálogo bastante inteligente y libre con el alumno (sistemas dialogales), asesora al
estudiante o tutoriza inteligentemente el aprendizaje. Su desarrollo está muy ligado con los
avances en el campo de la Inteligencia Artificial.
V.3 Clasificación de los Programas Didácticos (8)

Los programas educativos a pesar de tener unos rasgos esenciales básicos y una
estructura general común se presentan con unas características muy diversas: unos
aparentan ser un laboratorio o una biblioteca, otros se limitan a ofrecer una función
instrumental del tipo máquina de escribir o calculadora, otros se presentan como un juego
o como un libro, bastantes tienen vocación de examen, unos pocos se creen expertos... y,
por si no fuera bastante, la mayoría participan en mayor o menor medida de algunas de
estas peculiaridades. Para poner orden a esta disparidad, se han elaborado múltiples
tipologías que clasifican los programas didácticos a partir de diferentes criterios.
Uno de estos criterios se basa en la consideración del tratamiento de los errores que
cometen los estudiantes, distinguiendo:
Programas tutoriales directivos, que hacen preguntas a los estudiantes y controlan en todo
momento su actividad. El ordenador adopta el papel de juez poseedor de la verdad y
examina al alumno. Se producen errores cuando la respuesta del alumno está en
desacuerdo con la que el ordenador tiene como correcta. En los programas más
tradicionales el error lleva implícita la noción de fracaso.
Programas no directivos, en los que el ordenador adopta el papel de un laboratorio o
instrumento a disposición de la iniciativa de un alumno que pregunta y tiene una libertad
de acción sólo limitada por las normas del programa. El ordenador no juzga las acciones del
alumno, se limita a procesar los datos que éste introduce y a mostrar las consecuencias de
sus acciones sobre un entorno. Objetivamente no se producen errores, sólo desacuerdos
entre los efectos esperados por el alumno y los efectos reales de sus acciones sobre el
entorno. No está implícita la noción de fracaso. El error es sencillamente una hipótesis de
trabajo que no se ha verificado y que se debe sustituir por otra. En general, siguen un
modelo pedagógico de inspiración cognitivista, potencian el aprendizaje a través de la
exploración, favorecen la reflexión y el pensamiento crítico y propician la utilización del
método científico.
Otra clasificación interesante de los programas atiende a la posibilidad de modificar los
contenidos del programa y distingue entre programas cerrados (que no pueden
modificarse) y programas abiertos, que proporcionan un esqueleto, una estructura, sobre la
cual los alumnos y los profesores pueden añadir el contenido que les interese. De esta
manera se facilita su adecuación a los diversos contextos educativos y permite un mejor
tratamiento de la diversidad de los estudiantes.
No obstante, de todas las clasificaciones la que posiblemente proporciona categorías más
claras y útiles a los profesores es la que tiene en cuenta el grado de control del programa
sobre la actividad de los alumnos y la estructura de su algoritmo, que es la que se presenta a
continuación.
V.3.1.- Programas tutoriales
Son programas que en mayor o menor medida dirigen, tutorizan, el trabajo de los alumnos.
Pretenden que, a partir de unas informaciones y mediante la realización de ciertas
actividades previstas de antemano, los estudiantes pongan en juego determinadas
capacidades y aprendan o refuercen unos conocimientos y/o habilidades. Cuando se limitan
a proponer ejercicios de refuerzo sin proporcionar explicaciones conceptuales previas se
denominan programas tutoriales de ejercitación, como es el caso de los programas de
preguntas (drill&practice, test) y de los programas de adiestramiento psicomotor, que
desarrollan la coordinación neuromotriz en actividades relacionadas con el dibujo, la
escritura y otras habilidades psicomotrices.
En cualquier caso, son programas basados en los planteamientos conductistas de la
enseñanza que comparan las respuestas de los alumnos con los patrones que tienen como
correctos, guían los aprendizajes de los estudiantes y facilitan la realización de prácticas
más o menos rutinarias y su evaluación; en algunos casos una evaluación negativa genera
una nueva serie de ejercicios de repaso. A partir de la estructura de su algoritmo, se
distinguen cuatro categorías:
Programas lineales, que presentan al alumno una secuencia de información y/o ejercicios
(siempre la misma o determinada aleatoriamente) con independencia de la corrección o
incorrección de sus respuestas. Herederos de la enseñanza programada, transforman el
ordenador en una máquina de enseñar transmisora de conocimientos y adiestradora de
habilidades. No obstante, su interactividad resulta pobre y el programa se hace largo de
recorrer.
Programas ramificados, basados inicialmente también en modelos conductistas, siguen
recorridos pedagógicos diferentes según el juicio que hace el ordenador sobre la corrección
de las respuestas de los alumnos o según su decisión de profundizar más en ciertos temas.
Ofrecen mayor interacción, más opciones, pero la organización de la materia suele estar
menos compartimentada que en los programas lineales y exigen un esfuerzo más grande al
alumno. Pertenecen a éste grupo los programas multinivel, que estructuran los contenidos
en niveles de dificultad y previenen diversos caminos, y los programas ramificados con
dientes de sierra, que establecen una diferenciación entre los conceptos y las preguntas de
profundización, que son opcionales.
Entornos tutoriales. En general están inspirados en modelos pedagógicos cognitivistas, y
proporcionan a los alumnos una serie de herramientas de búsqueda y de proceso de la
información que pueden utilizar libremente para construir la respuesta a las preguntas del
programa. Este es el caso de los entornos de resolución de problemas, "problem solving",
donde los estudiantes conocen parcialmente las informaciones necesarias para su
resolución y han de buscar la información que falta y aplicar reglas, leyes y operaciones
para encontrar la solución. En algunos casos, el programa no sólo comprueba la corrección
del resultado, sino que también tiene en cuenta la idoneidad del camino que se ha seguido
en la resolución. Sin llegar a estos niveles de análisis de las respuestas, podemos citar como
ejemplo de entorno de resolución de problemas el programa MICROLAB DE
ELECTRÓNICA.
Sistemas tutoriales expertos, como los Sistemas Tutores Inteligentes (Intelligent Tutoring
Systems), que, elaborados con las técnicas de la Inteligencia Artificial y teniendo en cuenta
las teorías cognitivas sobre el aprendizaje, tienden a reproducir un diálogo auténtico entre
el programa y el estudiante, y pretenden comportarse como lo haría un tutor humano:
guían a los alumnos paso a paso en su proceso de aprendizaje, analizan su estilo de
aprender y sus errores y proporcionan en cada caso la explicación o ejercicio más
conveniente.
V.3.2.- Bases de datos
Proporcionan unos datos organizados, en un entorno estático, según determinados
criterios, y facilitan su exploración y consulta selectiva. Se pueden emplear en múltiples
actividades como por ejemplo: seleccionar datos relevantes para resolver problemas,
analizar y relacionar datos, extraer conclusiones, comprobar hipótesis... Las preguntas que
acostumbran a realizar los alumnos son del tipo: ¿Qué características tiene este dato? ¿Qué
datos hay con la característica X? ¿Qué datos hay con las características X e Y?
Las bases de datos pueden tener una estructura jerárquica (si existen unos elementos
subordinantes de los que dependen otros subordinados, como los organigramas), relacional
(si están organizadas mediante unas fichas o registros con una misma estructura y rango) o
documental (si utiliza descriptores y su finalidad es almacenar grandes volúmenes de
información documental: revistas, periódicos, etc). En cualquier caso, según la forma de
acceder a la información se pueden distinguir dos tipos:
Bases de datos convencionales. Tienen la información almacenada en ficheros, mapas o
gráficos, que el usuario puede recorrer según su criterio para recopilar información..
Bases de datos tipo sistema experto. Son bases de datos muy especializadas que recopilan
toda la información existente de un tema concreto y además asesoran al usuario cuando
accede buscando determinadas respuestas.
V.3.3.- Simuladores
Presentan un modelo o entorno dinámico (generalmente a través de gráficos o animaciones
interactivas) y facilitan su exploración y modificación a los alumnos, que pueden realizar
aprendizajes inductivos o deductivos mediante la observación y la manipulación de la
estructura subyacente; de esta manera pueden descubrir los elementos del modelo, sus
interrelaciones, y pueden tomar decisiones y adquirir experiencia directa delante de unas
situaciones que frecuentemente resultarían difícilmente accesibles a la realidad (control de
una central nuclear, contracción del tiempo, pilotaje de un avión...). También se pueden
considerar simulaciones ciertos videojuegos que, al margen de otras consideraciones sobre
los valores que incorporan (generalmente no muy positivos) facilitan el desarrollo de los
reflejos, la percepción visual y la coordinación psicomotriz en general, además de estimular
la capacidad de interpretación y de reacción ante un medio concreto.
En cualquier caso, posibilitan un aprendizaje significativo por descubrimiento y la
investigación de los estudiantes/experimentadores puede realizarse en tiempo real o en
tiempo acelerado, según el simulador, mediante preguntas del tipo: ¿Qué pasa al modelo si
modifico el valor de la variable X? ¿Y si modifico el parámetro Y? Se pueden diferenciar dos
tipos de simulador:
Modelos físico-matemáticos: Presentan de manera numérica o gráfica una realidad que
tiene unas leyes representadas por un sistema de ecuaciones deterministas. Se incluyen
aquí los programas-laboratorio, algunos trazadores de funciones y los programas que
mediante un convertidor analógico-digital captan datos analógicos de un fenómeno externo
al ordenador y presentan en pantalla un modelo del fenómeno estudiado o informaciones y
gráficos que van asociados. Estos programas a veces son utilizados por profesores delante
de la clase a manera de pizarra electrónica, como demostración o para ilustrar un concepto,
facilitando así la transmisión de información a los alumnos, que después podrán repasar el
tema interactuando con el programa.
Entornos sociales: Presentan una realidad regida por unas leyes no del todo deterministas.
Se incluyen aquí los juegos de estrategia y de aventura, que exigen una estrategia cambiante
a lo largo del tiempo.
V.3.4.- Constructores
Son programas que tienen un entorno programable. Facilitan a los usuarios unos elementos
simples con los cuales pueden construir elementos más complejos o entornos. De esta
manera potencian el aprendizaje heurístico y, de acuerdo con las teorías cognitivistas,
facilitan a los alumnos la construcción de sus propios aprendizajes, que surgirán a través de
la reflexión que realizarán al diseñar programas y comprobar inmediatamente, cuando los
ejecuten, la relevancia de sus ideas. El proceso de creación que realiza el alumno genera
preguntas del tipo: ¿Qué sucede si añado o elimino el elemento X? Se pueden distinguir dos
tipos de constructores:
Constructores específicos. Ponen a disposición de los estudiantes una serie de mecanismos
de actuación (generalmente en forma de órdenes específicas) que les permiten llevar a cabo
operaciones de un cierto grado de complejidad mediante la construcción de determinados
entornos, modelos o estructuras, y de esta manera avanzan en el conocimiento de una
disciplina o entorno específico
Lenguajes de programación, como LOGO, PASCAL, BASIC, que ofrecen unos "laboratorios
simbólicos" en los que se pueden construir un número ilimitado de entornos. Aquí los
alumnos se convierten en profesores del ordenador. Además, con los interfaces
convenientes, pueden controlar pequeños robots construidos con componentes
convencionales (arquitecturas, motores...), de manera que sus posibilidades educativas se
ven ampliadas incluso en campos pre-tecnológicos. Así los alumnos pasan de un manejo
abstracto de los conocimientos con el ordenador a una manipulación concreta y práctica en
un entorno informatizado que facilita la representación y comprensión del espacio y la
previsión de los movimientos.
Dentro de este grupo de programas hay que destacar el lenguaje LOGO, creado en 1969
para Seymour Papert, que constituye el programa didáctico más utilizado en todo el
mundo. LOGO es un programa constructor que tiene una doble dimensión:
Proporciona entornos de exploración donde el alumno puede experimentar y comprobar las
consecuencias de sus acciones, de manera que va construyendo un marco de referencia,
unos esquemas de conocimiento, que facilitarán la posterior adquisición de nuevos
conocimientos.
Facilita una actividad formal y compleja, próxima al terreno de la construcción de
estrategias de resolución de problemas: la programación. A través de ella los alumnos
pueden establecer proyectos, tomar decisiones y evaluar los resultados de sus acciones.
V.3.5.- Programas herramienta
Son programas que proporcionan un entorno instrumental con el cual se facilita la
realización de ciertos trabajos generales de tratamiento de la información: escribir,
organizar, calcular, dibujar, transmitir, captar datos.... A parte de los lenguajes de autor
(que también se podrían incluir en el grupo de los programas constructores), los más
utilizados son programas de uso general que provienen del mundo laboral y, por tanto,
quedan fuera de la definición que se ha dado de software educativo. No obstante, se han
elaborado algunas versiones de estos programas "para niños" que limitan sus posibilidades
a cambio de una, no siempre clara, mayor facilidad de uso. De hecho, muchas de estas
versiones resultan innecesarias, ya que el uso de estos programas cada vez resulta más
sencillo y cuando los estudiantes necesitan utilizarlos o su uso les resulta funcional
aprenden a manejarlos sin dificultad. Los programas más utilizados de este grupo son:
Procesadores de textos. Son programas que, con la ayuda de una impresora, convierten el
ordenador en una fabulosa máquina de escribir. En el ámbito educativo debe hacerse una
introducción gradual que puede empezar a lo largo de la Enseñanza Primaria, y ha de
permitir a los alumnos familiarizarse con el teclado y con el ordenador en general, y
sustituir parcialmente la libreta de redacciones por un disco (donde almacenarán sus
trabajos). Al escribir con los procesadores de textos los estudiantes pueden concentrarse en
el contenido de las redacciones y demás trabajos que tengan encomendados
despreocupándose por la caligrafía. Además el corrector ortográfico que suelen incorporar
les ayudará a revisar posibles faltas de ortografía antes de entregar el trabajo.
Además de este empleo instrumental, los procesadores de textos permiten realizar
múltiples actividades didácticas, por ejemplo:
Ordenar párrafos, versos, estrofas.
Insertar frases y completar textos.
Separar dos poemas...
Gestores de bases de datos. Sirven para generar potentes sistemas de archivo ya que
permiten almacenar información de manera organizada y posteriormente recuperarla y
modificarla. Entre las muchas actividades con valor educativo que se pueden realizar están
las siguientes:
Revisar una base de datos ya construida para buscar determinadas informaciones y
recuperarlas.
Recoger información, estructurarla y construir una nueva base de datos.
Hojas de cálculo. Son programas que convierten el ordenador en una versátil y rápida
calculadora programable, facilitando la realización de actividades que requieran efectuar
muchos cálculos matemáticos. Entre las actividades didácticas que se pueden realizar con
las hojas de cálculo están las siguientes:
Aplicar hojas de cálculo ya programadas a la resolución de problemas de diversas
asignaturas, evitando así la realización de pesados cálculos y ahorrando un tiempo que se
puede dedicar a analizar los resultados de los problemas.
Programar una nueva hoja de cálculo, lo que exigirá previamente adquirir un conocimiento
preciso del modelo matemático que tiene que utilizar.
Editores gráficos. Se emplean desde un punto de vista instrumental para realizar dibujos,
portadas para los trabajos, murales, anuncios, etc. Además constituyen un recurso idóneo
para desarrollar parte del currículum de Educación Artística: dibujo, composición artística,
uso del color, etc.
Programas de comunicaciones. Son programas que permiten que ordenadores lejanos (si
disponen de módem) se comuniquen entre sí a través de las líneas telefónicas y puedan
enviarse mensajes y gráficos, programas. Desde una perspectiva educativa estos sistemas
abren un gran abanico de actividades posibles para los alumnos, por ejemplo:
Comunicarse con otros compañeros e intercambiarse informaciones.
Acceder a bases de datos lejanas para buscar determinadas informaciones.
Programas de experimentación asistida. A través de variados instrumentos y convertidores
analógico-digitales, recogen datos sobre el comportamiento de las variables que inciden en
determinados fenómenos. Posteriormente con estas informaciones se podrán construir
tablas y elaborar representaciones gráficas que representen relaciones significativas entre
las variables estudiadas.
Lenguajes y sistemas de autor. Son programas que facilitan la elaboración de programas
tutoriales a los profesores que no disponen de grandes conocimientos informáticos. Utilizan
unas pocas instrucciones básicas que se pueden aprender en pocas sesiones. Algunos
incluso permiten controlar vídeos y dan facilidades para crear gráficos y efectos musicales,
de manera que pueden generar aplicaciones multimedia. Algunos de los más utilizados en
entornos PC han sido: PILOT, PRIVATE TUTOR, TOP CLASS, LINK WAY, QUESTION
MARK.
V.4 Funciones del Software Educativo (8)

Los programas didácticos, cuando se aplican a la realidad educativa, realizan las


funciones básicas propias de los medios didácticos en general y además, en algunos casos,
según la forma de uso que determina el profesor, pueden proporcionar funcionalidades
específicas.
Por otra parte, como ocurre con otros productos de la actual tecnología educativa, no se
puede afirmar que el software educativo por sí mismo sea bueno o malo, todo dependerá
del uso que de él se haga, de la manera cómo se utilice en cada situación concreta. En
última instancia su funcionalidad y las ventajas e inconvenientes que pueda comportar su
uso serán el resultado de las características del material, de su adecuación al contexto
educativo al que se aplica y de la manera en que el profesor organice su utilización.
Funciones que pueden realizar los programas:
Función informativa. La mayoría de los programas a través de sus actividades presentan
unos contenidos que proporcionan una información estructuradora de la realidad a los
estudiantes. Como todos los medios didácticos, estos materiales representan la realidad y la
ordenan.
Los programas tutoriales, los simuladores y, especialmente, las bases de datos, son los
programas que realizan más marcadamente una función informativa.
Función instructiva. Todos los programas educativos orientan y regulan el aprendizaje de
los estudiantes ya que, explícita o implícitamente, promueven determinadas actuaciones de
los mismos encaminadas a facilitar el logro de unos objetivos educativos específicos.
Además condicionan el tipo de aprendizaje que se realiza pues, por ejemplo, pueden
disponer un tratamiento global de la información (propio de los medios audiovisuales) o a
un tratamiento secuencial (propio de los textos escritos).
Con todo, si bien el ordenador actúa en general como mediador en la construcción del
conocimiento y el metaconocimiento de los estudiantes, son los programas tutoriales los
que realizan de manera más explícita esta función instructiva, ya que dirigen las actividades
de los estudiantes en función de sus respuestas y progresos.
Función motivadora. Generalmente los estudiantes se sienten atraídos e interesados por
todo el software educativo, ya que los programas suelen incluir elementos para captar la
atención de los alumnos, mantener su interés y, cuando sea necesario, focalizarlo hacia los
aspectos más importantes de las actividades.
Por lo tanto la función motivadora es una de las más características de este tipo de
materiales didácticos, y resulta extremadamente útil para los profesores.
Función evaluadora. La interactividad propia de estos materiales, que les permite
responder inmediatamente a las respuestas y acciones de los estudiantes, les hace
especialmente adecuados para evaluar el trabajo que se va realizando con ellos. Esta
evaluación puede ser de dos tipos:
Implícita, cuando el estudiante detecta sus errores, se evalúa, a partir de las respuestas que
le da el ordenador.
Explícita, cuando el programa presenta informes valorando la actuación del alumno. Este
tipo de evaluación sólo la realizan los programas que disponen de módulos específicos de
evaluación.
Función investigadora. Los programas no directivos, especialmente las bases de datos,
simuladores y programas constructores, ofrecen a los estudiantes interesantes entornos
donde investigar: buscar determinadas informaciones, cambiar los valores de las variables
de un sistema, etc.
Además, tanto estos programas como los programas herramienta, pueden proporcionar a
los profesores y estudiantes instrumentos de gran utilidad para el desarrollo de trabajos de
investigación que se realicen básicamente al margen de los ordenadores.
Función expresiva. Dado que los ordenadores son unas máquinas capaces de procesar los
símbolos mediante los cuales las personas representamos nuestros conocimientos y nos
comunicamos, sus posibilidades como instrumento expresivo son muy amplias.
Desde el ámbito de la informática que estamos tratando, el software educativo, los
estudiantes se expresan y se comunican con el ordenador y con otros compañeros a través
de las actividades de los programas y, especialmente, cuando utilizan lenguajes de
programación, procesadores de textos, editores de gráficos, etc.
Otro aspecto a considerar al respecto es que los ordenadores no suelen admitir la
ambigüedad en sus "diálogos" con los estudiantes, de manera que los alumnos se ven
obligados a cuidar más la precisión de sus mensajes.
Función metalingüística. Mediante el uso de los sistemas operativos (MS/DOS,
WINDOWS) y los lenguajes de programación (BASIC, LOGO...) los estudiantes pueden
aprender los lenguajes propios de la informática.
Función lúdica. Trabajar con los ordenadores realizando actividades educativas es una
labor que a menudo tiene unas connotaciones lúdicas y festivas para los estudiantes.
Además, algunos programas refuerzan su atractivo mediante la inclusión de determinados
elementos lúdicos, con lo que potencian aún más esta función.
Función innovadora. Aunque no siempre sus planteamientos pedagógicos resulten
innovadores, los programas educativos se pueden considerar materiales didácticos con esta
función ya que utilizan una tecnología recientemente incorporada a los centros educativos
y, en general, suelen permitir muy diversas formas de uso. Esta versatilidad abre amplias
posibilidades de experimentación didáctica e innovación educativa en el aula.
Citas
Fuente utilizada: Marqués, Pere. "El software educativo". www.doe.d5.ub.es. Universidad
de Barcelona. España. 1999. El Software Educativo.

Capítulo VI
VI.1 Reconversión Laboral - Etica Profesional (9)
La formación de los futuros recursos humanos de un país en las instituciones educativas
asegura la continuidad institucional de la Nación. Es la palanca para todo proceso de
cambio y el único camino para asegurar un progreso continuo de sus habitantes. Es un
hecho real el constante y acelerado proceso de intelectualización de la humanidad, que
conlleva a formar personas con conductas éticas, conocimientos y habilidades. Estas
últimas deben permitir utilizar una variedad de diferentes técnicas de influencia y
determinar, de acuerdo con las circunstancias, cuál es la mejor. También deben permitir
alcanzar la capacidad de visualizar y descubrir cosas que no son visibles con facilidad; la de
enfrentar los supuestos vigentes respecto de la compensación, las recompensas, los
incentivos y la calidad total como expresión del trabajo en equipo. Deben crearse hábitos
acerca de la necesidad de la capacitación también para los adultos como reaseguro de una
conversión laboral acorde con los cambios tecnológicos y de costumbres en la sociedad. La
tarea en la escuela debe desarrollar habilidades para que el futuro ciudadano sea capaz de
trabajar en equipo para la solución creativa de problemas, como afrontar los problemas a
tiempo, la toma de decisiones, la valoración personal, los criterios de selección de
alternativas y la capacidad de negociación, todo ello en el marco de la ética y las normas
legales. La metodología de enseñanza ha de tener en consideración la inteligencia o
capacidad para aprender del alumno, el método de enseñanza y las motivaciones
individuales del estudiante. Dado el creciente fenómeno de la globalización existe una
mayor difusión de las obligaciones y responsabilidades a nivel mundial. En este marco los
accesos a bases de datos disponibles en otros países y el creciente uso de las autopistas de
información por parte de los habitantes refuerza la necesidad de las instituciones
educativas de prepararse para una nueva sociedad real comunicada a través de la red,
conformada por personas del otro lado de los monitores que interactúan entre sí a través de
medios de comunicación masiva, diversificando la fuerza laboral; la proliferación de la
tecnología, la globalización y el carácter multinacional de los negocios.
La ética es parte de la filosofía que estudia la moral y de las obligaciones del hombre;
deberíamos poder saber objetivamente que es lo bueno o lo malo. Entran a jugar una serie
de elementos que hacen a la formación integral de la persona humana. Aparecen los
conceptos de "natura" y "cultura". El primero tiene que ver con la naturaleza del ser
humano y lo segundo con todo aquello que este va creando a lo largo de su historia, como
resultado de cultivar los conocimientos y mejorar las facultades intelectuales por medio del
ejercicio. Si partimos de los hechos de la naturaleza y los observamos desde el punto de
vista ético desembocamos en la cultura. La cultura es el resultado o efecto de cultivar los
conocimientos humanos y de afinarse por medio del ejercicio las facultades intelectuales del
hombre. La cultura es ambigua, es dual, porque la ética puede tener su carga buena o mala,
dada su condición de subjetividad.
Las nuevas tecnologías constituyen hoy en día uno de los ejes del desarrollo de la
humanidad, pero también es cierto que a veces se confunden dichos avances con el uso o
abuso que se hace de ellos.
La perspectiva ética consiste en aprender a convivir con la automatización que día a día
avanza sobre la sociedad generando nuevas situaciones, muchas veces conflictivas porque
afectan el estilo de vida y las costumbres arraigadas de los seres humanos. Se plantean así
nuevos desafíos éticos para la humanidad, para lo cual el desarrollo de los pueblos
requerirá de la formación y capacitación de ciudadanos que comiencen a través de la
educación a adoptar lemas que luego acompañarán a esa persona que hoy es un alumno, a
transformarse mañana en un ciudadano con poder de decisión en la sociedad. En la etapa
de formación esos lemas deberían abarcar valores acerca de la búsqueda de la verdad; el
respeto por la justicia, la dedicación al trabajo y la convivencia con los semejantes, con lo
cual se podría esperar en conformar a futuro una sociedad mucho más equitativa que la
actual. Una sociedad donde, entre lo humano y la automatización, prevalezca el ser
humano. Que entre el hombre y la máquina, seamos capaces de optar por el hombre; entre
la "natura" y la "cultura", el hombre pueda hacer prevalecer la esencia de su "naturaleza",
como respuesta a todo aquello creado por él que lo pueda conflictuar en el desarrollo de su
proyecto de vida. Es importante plantearse seriamente a la hora de elaborar proyectos de
enseñanza la validez y conveniencia de la inserción plena de las nuevas tecnologías en los
mismos, como medios eficaces para el mejoramiento de la calidad educativa y la formación
de las personas más responsables.
Esto nos lleva a concluir que debe haber una guía en el quehacer ético de los educadores,
donde prevalezca la "humanización" de las computadoras y no la "informatización" de las
personas.
Citas
Fuente consultada: Beccaría, Luis P. - Rey, Patricio E.."La inserción de la Informática en la
Educación y sus efectos en la reconversión laboral". Instituto de Formación Docente -SEPA-
. Buenos Aires. 1999.
Conclusiones
Una pieza clave de toda transformación educativa está en los docentes, tanto por lo que los
que hoy están en la escuela, como por lo nuevos que deben formarse en el futuro.
Para atender a los que hoy están en las aulas, se tendría que estar realizando un gran
esfuerzo de capacitación a nuevos docentes para la incorporación de tecnología, ésta es
imprescindible para una nueva y profunda reorganización de los nuevos especialistas, que
incluya también oportunidades de perfeccionamiento continuo.
El docente debe posibilitar la construcción de aprendizajes a grupos determinados de
alumnos en contextos específicos, debiendo participar en acciones pedagógicas e
institucionales, potenciando sus capacidades individuales como persona.
La Escuela hoy más que nunca necesita renovarse si quiere ingresar al siglo XXI dando
respuesta a las variadas demandas sociales y laborales. Por eso, incluir la informática en el
ámbito escolar constituye una acción necesaria y urgente. Los docentes que actúan en el
sistema educativo, deben incorporar este nuevo y revolucionario recurso a su currículum y
por medio de un docente especializado trasladarlo a sus alumnos como herramienta. Al
servicio de una enseñanza transformadora y beneficiosa par aprender con mayor rapidez y
facilidad. Brindando al alumno la posibilidad de investigar, adaptándose a la tecnología
actual y a los cambios constantes.
Desde luego las posibilidades ocupacionales y la elevada categorización de los docentes
preparados para el uso pedagógico de la informática crecen en la medida de una urgente a
la vez exigente demanda, por parte de todos los niveles de sistema educativo público y
privado.
En la formación docente se debe incluir una actualización continua brindada por la nueva
tecnología para adecuar ésta a la docencia.
En este entorno informatizado y el uso de la computadora como herramienta que no sólo
nos permita la creación de entornos de aprendizaje estimuladores de la construcción de
conocimientos, economizar tiempos y esfuerzos, lo que implica nuevas formas de pensar y
hacer.
En este marco, la nueva tecnología interactiva, fruto de la asociación de la informática, las
comunicaciones, la robótica y el manejo de las imágenes, revolucionará el aprendizaje
resolviendo dichos interrogantes, los que en la actualidad limitan la evolución del sistema
educativo.
El componente principal para el progreso será el desarrollo de cursos y de currículas de
estudio enteramente nuevos. Los puntos esenciales de la reforma educativa pasan entonces
por la capacitación de los docentes y el desarrollo de nuevos materiales de aprendizaje,
utilizando en lo posible tecnología informática interactiva.
Es necesario reconocer que no hay una sola filosofía que abarque toda la temática, pero
ciertamente si disponemos de variados materiales podremos realizar evaluaciones
conjuntas de los productos y analizar otras técnicas de aprendizaje. Todo proyecto de
informática educativa deberá entonces tener en consideración que lo más importante de la
educación no consiste en instruir sobre diversos temas, lo cual es siempre necesario, sino en
transmitir y hacer encarnar en la conducta de los alumnos los valores y creencias que dan
sustento al estilo de vida que ha elegido la sociedad para lograr su vigencia.
MATLAB
De Wikipedia, la enciclopedia libre

Saltar a: navegación, búsqueda

MATLAB

Desarrollador

The MathWorks
Página principal de MathWorks

Información general

Última versión estable R2011a


8 de abril de 2011

Género Software matemático

Sistema operativo Multiplataforma1

Licencia Propietario

En español

MATLAB (abreviatura de MATrix LABoratory, "laboratorio de matrices") es un


software matemático que ofrece un entorno de desarrollo integrado (IDE) con un
lenguaje de programación propio (lenguaje M). Está disponible para las plataformas
Unix, Windows y Apple Mac OS X.
Entre sus prestaciones básicas se hallan: la manipulación de matrices, la representación
de datos y funciones, la implementación de algoritmos, la creación de interfaces de
usuario (GUI) y la comunicación con programas en otros lenguajes y con otros
dispositivos hardware. El paquete MATLAB dispone de dos herramientas adicionales
que expanden sus prestaciones, a saber, Simulink (plataforma de simulación
multidominio) y GUIDE (editor de interfaces de usuario - GUI). Además, se pueden
ampliar las capacidades de MATLAB con las cajas de herramientas (toolboxes); y las
de Simulink con los paquetes de bloques (blocksets).
Es un software muy usado en universidades y centros de investigación y desarrollo. En
los últimos años ha aumentado el número de prestaciones, como la de programar
directamente procesadores digitales de señal o crear código VHDL.
Contenido
[ocultar]

 1 Historia
 2 Sintaxis
o 2.1 Ejemplos
 2.1.1 Hello World
 2.1.2 Diseño de filtros digitales
 3 Cajas de herramientas y paquetes de bloques
 4 Limitaciones y alternativas
 5 Llamar funciones C y Fortran
 6 Véase también
 7 Referencias
 8 Enlaces externos

[editar] Historia
Fue creado por Cleve Moler en 1984, surgiendo la primera versión con la idea de
emplear paquetes de subrutinas escritas en Fortran en los cursos de álgebra lineal y
análisis numérico, sin necesidad de escribir programas en dicho lenguaje. El lenguaje de
programación M fue creado en 1970 para proporcionar un sencillo acceso al software de
matrices LINPACK y EISPACK sin tener que usar Fortran.
En 2004, se estimaba que MATLAB era empleado por más de un millón de personas en
ámbitos académicos y empresariales.2
[editar] Sintaxis
MATLAB es un programa de cálculo numérico orientado a matrices. Por tanto, será
más eficiente si se diseñan los algoritmos en términos de matrices y vectores.
[editar] Ejemplos

[editar] Hello World


Éste es el tradicional programa Hello World hecho con el lenguaje de MATLAB:
>> disp('Hola mundo'); % Muestra el mensaje.
Hola mundo
[editar] Diseño de filtros digitales
En este ejemplo se diseña un filtro digital paso bajo de Butterworth y se muestra el
módulo de su espectro además incluimos otro ejemplo de un tren de deltas para el
análisis espectral:
close all % Cierra todas las
ventanas.
clear all % Borra todas las
variables del espacio de trabajo.
clc % Limpia la pantalla.

Fc=200; % Frecuencia de
corte.
Fm=1000; % Frecuencia de
muestreo.
BT=100; % Banda de
transición.
Rs=40; % Ganancias.
rs=10^(-Rs/20);
Rp=2;
rp=(10^(Rp/20)-1)/(10^(Rp/20)+1);

[n1b,wn1]=buttord(2*Fc/Fm,2*(Fc+BT)/Fm,Rp,Rs); % Orden del filtro


(función buttord).
[B1,A1]=butter(n1b,wn1); % Coeficientes del
filtro (función butter).
h1=freqz(B1,A1); % Respuesta en
frecuencia (función freqz).
plot(abs(h1)) % Representación de
la respuesta.

Archivo:
otro ejemplo
Serie trigonométrica de tren de pulsos positivos y negativos.
n=input('número de sumandos= '); % creamos una serie de pulsos útil
para el procesados de señales y sistemas dentro del mundo de las
telecomunicanciones

t=-2:.01:2;
pulso=zeros(1,length(t));
for k=1:n
pulso=pulso+sin(2*(2*k-1)*pi*t)/(2*k-1);
end
plot(t,pulso)
grid
[editar] Cajas de herramientas y paquetes de bloques
Las funcionalidades de Matlab se agrupan en más de 35 cajas de herramientas y
paquetes de bloques (para Simulink), clasificadas en las siguientes categorías:3

MATLAB (Cajas de herramientas) Simulink

Matemáticas y Optimización Modelado de punto fijo


Estadística y Análisis de datos Modelado basado en eventos

Diseño de sistemas de control y análisis Modelado físico

Procesado de señal y comunicaciones Gráficos de simulación

Procesado de imagen Diseño de sistemas de control y análisis

Pruebas y medidas Procesado de señal y comunicaciones

Biología computacional Generación de código

Modelado y análisis financiero Prototipos de control rápido y SW/HW HIL

Desarrollo de aplicaciones Tarjetas integradas

Informes y conexión a bases de datos Verificación, validación y comprobación

[editar] Limitaciones y alternativas


Durante mucho tiempo hubo críticas porque MATLAB es un producto propietario de
The Mathworks, ya que los usuarios están sujetos a un vendor lock-in. Recientemente se
ha proporcionado una herramienta adicional llamada MATLAB Builder bajo la sección
de herramientas Application Deployment para utilizar funciones MATLAB como
archivos de biblioteca que pueden ser usados con ambientes de construcción de
aplicación .NET o Java. Pero la desventaja es que el computador donde la aplicación
tiene que ser utilizada necesita MCR(MATLAB Component Runtime) para que los
archivos MATLAB funcionen correctamente. MCR puede ser distribuido libremente
con archivos de biblioteca generados por el compilador MATLAB.

 LabVIEW
 GNU Octave
 SAS
 Scilab
 Mathcad
 SciPy & Numerical Python
 Lenguaje R
 Álgebra computacional:
o Véase Anexo:Programas de álgebra computacional
[editar] Llamar funciones C y Fortran
MATLAB puede llamar funciones y subrutinas escritas en C o Fortran. Se crea una
función envoltorio que permite que sean pasados y devueltos tipos de datos de
MATLAB. Los archivos objeto dinámicamente cargables creados compilando esas
funciones se denominan "MEX-files", aunque la extensión de nombre de archivo
depende del sistema operativo y del procesador.
function [fa,dfa]=funcion_y_derivada(x)
fa=0;
n=1;
h=1;
dfa=0;
while (n <= (10*(x-(1/2))^2) + 10)
fa=fa+(((-x^2)^n)/factorial(2*n));
h=h/2;
dfa=dfa+(((((-(x+h)^2)^n)/factorial(2*n))-(((-
x^2)^n)/factorial(2*n)))/h);
n=n+1;
end

function v=aproxima_derivada2(funci,a)
syms x;
i=1;
h=1;
v(i)=(subs(funci,a+h)+subs(funci,a-h)-(2*subs(funci,a)))/(h^2);
error=1;
while(error>1e-10)
h=h/2;
i=i+1;
v(i)=(subs(funci,a+h)+subs(funci,a-h)-(2*subs(funci,a)))/(h^2);
error= abs(v(i)-v(i-1));
end

Métodos Numéricos Avanzados


Instituto Tecnológico de Buenos Aires

Search this site Search

 Temas
o Conceptos generales
o Error
o Ecuaciones no lineales
o Sistemas de ecuaciones lineales
o Interpolación polinómica
o Ajuste por mínimos cuadrados
o Diferenciación
o Integración
o Ecuaciones diferenciales ordinarias
o Fourier
o Ejercicios de Fourier
o Filtros
o Convolución
 Útiles
o Exámenes
o Foro
o Cambios recientes
Create account or Sign in

Sistemas de ecuaciones lineales


Fold

Table of Contents

Introducción

Discretización

Método de eliminación gaussiana (GEM)

Pivoteo parcial

Ejemplo

Pivoteo parcial escalado

Ejemplo:

Factorización LU

Factorización de Cholesky

Links Interesantes

Introducción

Esta sección da herramientas para resolver los problemas del tipo Ax=b .

Discretización
Para los sistemas que se modelan con la ecuación de Laplace, si hacemos algunos
manipuleos con Taylor (f(x+h)+f(x−h) ) llegamos a que se pueden discretizar así:

(1)

u ′′ (x,y)=u(x−h,y)+u(x+h,y)+u(x,y−h)+u(x,y+h)−4u(x,y) h 2

donde h es el espaciamiento entre los puntos discretizados.

Para una sola variable esto se convierte en

(2)
y ′′ (x)=y(x−h)+y(x+h)+y(x)+y(x)−4y(x) h 2 =y(x−h)+y(x+h)−2y(x) h 2

más algún término de error.

Pasando a los nodos en el caso de una variable queda


(3)
y ′′ (x i )=y i−1 +y i+1 −2y i h 2

entonces de acá extraemos un sistema de ecuaciones (necesitamos condiciones de borde).

Método de eliminación gaussiana (GEM)


Este método transforma un sistema lineal en otro equivalente (con las mismas soluciones)
para resolverlo más fácilmente. También se lo llama Gauss-Jordan.

Se hace:

 Multiplicando una fila por una constante.


 Sumando una ecuación con el múltiplo de otra.
 Intercambiando ecuaciones.

De esta manera se debe obtener una matriz triangular superior o inferior, logrando despejar
fácilmente una solución para luego reemplazarla e ir obteniendo las demás.

A tener en cuenta: si el determinante de la matriz es distinto de cero, el sistema tiene


solución única.

Pivoteo parcial
La onda con el pivoteo es hacer Gauss-Jordan pero eligiendo el mejor valor para hacer
cuentas, de manera tal que los errores de las cuentas de la maquinita sean los menores. Así,
se implementa un criterio para reordenar filas de manera tal que se queden los valores
mayores al momento de dividir. El método consiste en elegir en la iteración i-ésima, el
elemento de la columna que sea el de mayor valor absoluto entre todos los que están por
encima de la diagonal, el menor valor de p≥i tal que

(4)

|a pi |=max i≤k≤n |a ki |

para poder hacer el intercambio Fila i por Fila p .

Ejemplo

La matriz:

(5)
⎛⎝⎜549 417 231 102 ⎞⎠⎟

quedaría:
(6)
⎛⎝⎜954 741 123 210 ⎞⎠⎟

para el primer paso en que se logren los ceros inferiores en la primera columna. Luego se
procedería a hacer lo mismo para las siguientes dos filas.

Pivoteo parcial escalado


Cuando hay algún valor muy zarpado en las ecuaciones en comparación con el resto, el
pivoteo solito no alcanza. Ahí hay que usar escalado. El escalado implica usar un factor de
escala para cada fila, que se define

(7)
s k =max 1≤j≤n |a kj |

Ahora, antes de eliminar la variable xi el intercambio de filas Filai <-> Filap se hace
tomando el primer entero p≠i tal que

(8)

|a pi | s p =max i≤k≤n |a ki | s k

El pivoteo parcial agrega 3/2(n²-n) comparaciones y (n²+n)/2 -1 divisiones, por lo que para
lograr una precisión mayor hace falta más poder de cómputo.

Ejemplo:

(9)
2.11x 1 4.01x 1 1.09x 1 −4.21x 2 +0.921x 3 +10.2x 2 −1.12x 3 +0.987x 2 +0.832x 3 =2.0
1 =−3.09 =4.21

Este sistema que es de n=3 tiene como matriz a

(10)

⎛ ⎝ ⎜ 2.11 4.01 1.09 −4.21 10.2 0.987 0.921 −1.12 0.831 2.01 −3.09 4.21 ⎞ ⎠ ⎟

Luego buscamos los sk

(11)

s 1 m\'aximo de la fila 1=max 1≤j≤n |a 1j |=4.21 s 2 m\'aximo de la fila


2=max 1≤j≤n |a 2j |=10.2 s 3 m\'aximo de la fila 3=max 1≤j≤n |a 3j |=1.09

Luego queda buscar el pivote, para ello se utiliza la ecuación 8 que busca el
max 1≤k n ∣ ∣ a k1 ∣ ∣ s k
(12)

|a 11 | s 1 =2.11 4.21 =0.501,|a 21 | s 2 =4.01 10.2 =0.393y|a 31 | s 3 =1.09 1.09 =1

De ahí agarramos el mayor que es ∣ ∣ a 31 ∣∣ s 3 y se hace el intercambio Fila1 <-> Fila3. La


matriz 10 pasa a quedar

(13)

⎛ ⎝ ⎜ 1.09 4.01 2.11 0.987 10.2 −4.21 0.831 −1.12 0.921 4.21 −3.09 2.01 ⎞ ⎠ ⎟

Los multiplicadores quedan m 21 =3.68 y m 31 =1.94 y eliminando, 13 queda como

(14)

⎛ ⎝ ⎜ 1.09 0 0 0.987 6.57 −6.12 0.831 −4.18 −0.689 4.21 −18.6 −6.16 ⎞ ⎠ ⎟

Repetimos una vez más la búsqueda de los máximos, manteniendo la escala que usamos
antes. Como

(15)
|a 22 | s 2 =6.57 10.2 =0.644<|a 32 | s 3 =6.12 4.21 =1.45

El pivote pasa a ser el de la fila 3, por lo que se intercambian Fila2 <-> Fila3 y queda

(16)
⎛ ⎝ ⎜ 1.09 0 0 0.987 −6.12 6.57 0.831 −0.689 −4.18 4.21 −6.16 −18.6 ⎞ ⎠ ⎟

y el m 32 =6.57 −6.12 =−1.07 . Eliminando queda

(17)

⎛ ⎝ ⎜ 1.09 0 0 0.987 −6.12 0 0.831 −0.689 −4.92 4.21 −6.16 −25.2 ⎞ ⎠ ⎟

Sustituyendo hacia atrás: x=(−0.4310.4305.12) .

Factorización LU
La idea es factorizar a la matriz A en una triangular superior y otra triangular inferior ( L
=lower, U =upper). Esto permite resolver la ecuación Ax=b con orden N (una vez
factorizado A ). Como factorizar A tiene el mismo orden que gauss, esto se suele hacer
cuando b varía.

Haciendo GEM sobre la matriz original obtenemos una matriz inferior a la que denominamos
U . Después convertimos las operaciones elementales que utilizamos para obtener U y las
convertimos en matrices (a las cuales llamamos Ei ). Luego invertimos las matrices Ei y
las multiplicamos en orden contrario (por lo tanto se supone que no reordenamos filas para
hacer LU).

Por ejemplo si tenemos el sistema

(18)
Ax=b

y para obtener U tubimos tuvimos que multiplicar a A por E1 E2 y E3


nos queda

(19)

E 3 E 2 E 1 Ax=E 3 E 2 E 1 b

donde llamamos U a E3E2E1A . Hasta acá podríamos decir que resolvimos el ejercicio
haciendo sustitución hacia atrás, pero el problema es que por cada b hay que recalcular el
lado derecho de la ecuación.
Partiendo de

(20)

E 3 E 2 E 1 A=U

multiplicando por las matrices inversas en orden inverso obtenemos

(21)
E 1 ′ E 2 ′ E 3 ′ E 3 E 2 E 1 A=E 1 ′ E 2 ′ E 3 ′ U

la matriz resultante E1 ′E2 ′E3 ′ es una matriz inferior, a la cual llamamos L . Hay que
notar que Ei ′Ei es la matriz identidad, entonces

(22)

A=E 1 ′ E 2 ′ E 3 ′ U

llamando L=E 1 ′ E 2 ′ E 3 ′ logramos factorizar A en dos matrices, una inferior L y otra


superior U

(23)

A=LU

para resolver un problema ahora remplazamos el nuevo a en la ecuación lineal 1.

(24)
LUx=b
llamando z=Ux podemos reescribirla asi

(25)

Lz=b

como L es inferior el problema sale con sustitución forward y una vez obtenido z
calculamos x como

(26)

Ux=z

como U es superior se resuelve con sustitución backward.

Factorización de Cholesky
Para matrices definidas positivas, existe una matriz L tal que A=LL T . Los elementos de
L se calculan así:

 La diagonal: a i i=∑ i k=1 l 2 ik


 Lo que no es diagonal: a i j=∑k=1 j l ik l ij

y después de ahí hay que despejar los l ij .