Академический Документы
Профессиональный Документы
Культура Документы
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.
• 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
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 conones(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
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
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.
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.
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.
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
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
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) 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.
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.
CLASIFICACION DE PROBLEMAS
"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)".
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:
Así por ejemplo, una instancia del problema del agente viajero, con 5 ciudades es la
siguiente:
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.
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).
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.
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;
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):
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
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
Contador : Integer;
...
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)
begin
...
i:=1;
readln(n);
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:
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.
type
tContador = integer;
var
i : tContador;
n : integer;
begin
i := i + 1
end
end.
type
tLogico = boolean;
var
begin
else
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 *)
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
var
begin
nombre := 'Beni';
letra_NIF := 'L';
end.
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.
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:
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
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;
}
clrscr();
for( ; 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>
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
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)
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;
PorcentajeCiudadanosResponsables=(TotalVotosEleccion/TotalCensoElectoral)*100
PorcentajeCiudadanosInconcientes = 100 - PorcentajeCiudadanosResponsables
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
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.
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 "
Educación física
* 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.
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)
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)
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
MATLAB
Desarrollador
The MathWorks
Página principal de MathWorks
Información general
Licencia Propietario
En español
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
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);
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
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
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
Table of Contents
Introducción
Discretización
Pivoteo parcial
Ejemplo
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
(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
Se hace:
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.
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 |
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.
(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
(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 ⎞ ⎠ ⎟
(11)
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)
(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 ⎞ ⎠ ⎟
(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 ⎞ ⎠ ⎟
(17)
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).
(18)
Ax=b
(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
(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
(23)
A=LU
(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
Factorización de Cholesky
Para matrices definidas positivas, existe una matriz L tal que A=LL T . Los elementos de
L se calculan así: