Sei sulla pagina 1di 46

Robert Espinoza Domínguez

Algoritmos numéricos y geométricos


Algoritmos numéricos

 Un algoritmo numérico es el conjunto de instrucciones


ordenados para resolver un problema que involucra
procesos matemáticos (con cálculo de fórmulas de
manera repetida).
 Este tipo de algoritmos no admiten ambigüedades y
debe darse cada uno de los pasos para su solución.
 Gran parte de los problemas matemáticos están dentro
del dominio del análisis numérico (cálculo o métodos
numéricos)
Algoritmos numéricos

Ejemplos:
 Generación de números seudo aleatorios

 Método de congruencia lineal


 Método de congruencia aditiva
 Problemas de aritmética
 Suma y multiplicación de polinomios
 Multiplicación de enteros muy grandes
 Multiplicación de matrices
 Eliminación gaussiana para resolver un sistema lineal
de ecuaciones.
 Algoritmo de Euclides para calcular el máximo común
divisor de dos enteros positivos
Algoritmos numéricos

 Ajuste de curvas o ajuste de datos


 Interpolación polinómica
 Interpolación spline
 Método de los mínimos cuadrados
 Integración
 Método de cuadratura elementales
Números pseudoaleatorios
Números aleatorios

 Cuando nos referimos un número como aleatorio es


cuando cada número debe tener la misma probabilidad
de ser generado.
 Se debe restringir el campo de los números a utilizar
en un dominio finito.
 No se puede generar un número aleatorio cualquiera,
únicamente un número aleatorio dentro de un rango.
 Por ejemplo generar un número entre 1 y 100.
 Casi nunca se necesita obtener un único número
aleatorio, sino una serie de ellos.
 Por ejemplo: 5, 60, 3, 67, 27,…
Números pseudoaleatorios

 No existe ningún modo de generar verdaderos


números aleatorios en una computadora (o en
cualquier sistema determinista)
 Una vez escrito el programa, los números que genera
se pueden deducir.
 Lo mejor que se puede esperar es escribir programas
que generen series de números que presenten la
mayoría de las propiedades de los números aleatorios.
 Dichos números se conocen como números
pseudoaleatorios.
 No son realmente aleatorios pero se pueden considerar
válidos como una aproximación a los números aleatorios
Números pseudoaleatorios

 Las propiedades que deben cumplir las series de


números pseudoaleatorios:
 Los números han de estar uniformemente distribuidos
 Han de ser estadísticamente independientes
 Han de ser reproducibles
 Que requieran poco espacio en memoria
 Que se obtengan rápidamente
 Nuestro objetivo es encontrar un método que nos
permita obtener series de números pseudoaleatorios:
números que a todo el mundo le parezcan aleatorios
excepto al programador que sabe el método.
Números pseudoaleatorios

 Existen muchos métodos posibles para obtener series


de números pseudoaleatorios. Ejemplo simple:
escoger un número de n cifras, elevarlo al cuadrado,
coger las k cifras centrales del resultado obtenido,
siendo éstas el siguiente número de la serie. Para
n=k=4:
4231 9013
x 4231 x 9013
4231 27039
12693  9013 ...
8462 81117 .
6924 . 81234169
17901361
Números pseudoaleatorios

 Este método no tiene nada de aleatorio, pero lo


parece. No tiene ninguna propiedad aceptable, ya que
no se puede comprobar absolutamente nada, por lo
que es impredecible cuándo comenzarán a repetirse
los números.
 Una serie de números es aleatoria cuando no se
descubre en ella ninguna propiedad: de crecimiento,
repetición, siguiente, etc.
Método de congruencia lineal (Lehmer)
Método de congruencia lineal (Lehmer)
 Es el método más conocido para generar números
pseudoaleatorios. Introducido por D. Lehmer en
1951

Se utilizan tres datos según la fórmula:


Xn = (a*Xn-1 + c) mod m

 Tipos:
 Generador congruencial mixto: aquel en el que c ≠ 0
 Generador congruencial multiplicativo: aquel en el que
c=0
 Diferencias: los multiplicativos son más rápidos,
aunque tienen una menor longitud de ciclo.
Método de congruencia lineal (Lehmer)

 Si la variable semilla contiene algún número


arbitrario, el siguiente algoritmo llenará un arreglo de
n números aleatorios, si c=1

Método Aleatorio (semilla, a, m)


x[0] = semilla
Para i desde 1 hasta n hacer
x[ i ]  (x[ i - 1] * a + 1) mod m
Fin Para
Fin Método
Método de congruencia lineal (Lehmer)

 Se inicia con un valor X0 llamada semilla


 Para obtener un número aleatorio, se toma el anterior
 Se multiplica por una constante a, se le suma c = 1 y
se toma el resto de la división por una segunda
constante m.
 El resultado es siempre un entero entre 0 y m-1.
 m debe ser grande, por lo general una potencia de
10 o de 2.
 a no debe ser muy grande ni pequeño, se puede
emplear número con un dígito menor que m
Método de congruencia lineal (Lehmer)

 a debe ser una constante arbitraria sin ningún tipo de


estructura en sus dígitos, excepto que debe terminar
en …x21, con x par
 Éste último requisito en la mayoría de los casos permite
evitar la aparición de algunos casos problemáticos
Método de congruencia lineal (Lehmer)

 Por ejemplo, para una semilla = 45872, a = 421,


m = 1000, se genera una serie entre 0 y 999
113, 574, 655, 756, 277, …
 Un caso problemático se da cuando semilla = 0, a = 19,
m = 381 se debería generar una serie entre 0 y 380, sin
embargo resulta:
0, 1, 20, 0, 1, 20, 0, 1, 20
Método de Gauss - Sistema lineal de
ecuaciones
Eliminación de Gauss-Jordan

 La eliminación de Gauss-Jordan, llamada así debido


a Carl Friedrich Gauss y Wilhelm Jordan, son
algoritmos del álgebra lineal para determinar las
soluciones de un sistema de ecuaciones lineales,
encontrar matrices e inversas.
 Un sistema de ecuaciones se resuelve por el método
de Gauss cuando se obtienen sus soluciones mediante
la reducción del sistema dado a otro equivalente en el
que cada ecuación tiene una incógnita menos que la
anterior. Cuando se aplica este proceso, la matriz
resultante se conoce como: "forma escalonada".
Eliminación de Gauss-Jordan

 Por ejemplo, supongamos que se tienen tres variables


x, y, z y las tres ecuaciones siguientes:
x + 3y – 4z = 8
x + y – 2z = 2
-x – 2y + 5z = -1
 El objetivo será calcular los valores de las variables
que satisfagan simultáneamente las ecuaciones.
 Eliminamos la variable x de todas las ecuaciones
excepto la primera, hallando la diferencia entre la
primera y la segunda; y la primera con la tercera.
x + 3y – 4z = 8
2y – 2z = 6
y+z =7
Eliminación de Gauss-Jordan

 Eliminamos la variable y de la tercera ecuación


hallando la diferencia entre la segunda y la tercera
x + 3y – 4z = 8
2y – 2z = 6
– 4z = –8
 Ahora se puede resolver directamente la tercera
ecuación, z = 2
 Sustituyendo z= 2 en la segunda obtenemos y = 5
 De forma similar sustituimos estos dos valores en la
primera ecuación se puede calcular x=1.
Eliminación de Gauss-Jordan

 Utilizamos la notación matricial para describir el


sistema:
1 3  4  x   8 
    
1 1  2  y    2 
  1  2 5   z    1
    
 Luego lo representamos en una sola matriz
 1 3 4 8 
 
 1 1 2 2 
 1  2 5  1 

Eliminación de Gauss-Jordan

 Eliminamos descendentemente:

 1 3 4 8 
 
 0 2 2 6 
 0 7 
 1 1

 1 3 4 8 
 
 0 2 2 6 
 0  4  8 
 0
Eliminación de Gauss-Jordan

Algoritmo:
 Fase de eliminación descendente.

 Transforma el sistema original, en un sistema que contiene


sólo ceros debajo de la diagonal principal.
 Se comienza por eliminar la primera variable de todas las
ecuaciones excepto la primera, añadiendo un múltiplo
adecuado de la primera ecuación a cada una de ellas.
 A continuación se elimina la segunda variable de todas las
ecuaciones a partir de la segunda, añadiendo un múltiplo
adecuado de esta segunda a cada una de las otras.
 Después se elimina la tercera variable de todas las
ecuaciones a partir de la tercera y así sucesivamente.
Eliminación de Gauss-Jordan

 Este proceso se describe con el algoritmo siguiente:


Para i desde 1 hasta N-1 hacer
Para j desde (i + 1) hasta N hacer
Para k desde (N+1) hasta i Inc -1 hacer
A[ j, k ]  A[ j, k ] - A[ i, k ] * A[ j, i ] / A[ i, i ]
Fin Para
Fin Para
Fin Para
 Si A[ i, i ] es cero debemos buscar una fila a partir de i para
intercambiar. Si no se encuentra entonces no existe solución
única.
 Para evitar “errores de redondeo” al momento de hallar el
múltiplo apropiado, es mejor utilizar la fila (entre i+1 y N) cuyo
valor de la i-ésima columna sea mayor en valor absoluto.
Eliminación de Gauss-Jordan

Método Clase.Eliminación( )
Para i desde 1 hasta N hacer
max  i
Para j desde (i + 1) hasta N hacer
Si abs(A[ j, i ]) > abs(A[ max, i ])
max  j
Fin Si
Fin Para
Para k desde (i + 1) hasta N+1 hacer
aux  A[ i, k ]
A[ i, k ]  A[ max, k ]
A[ max, k ]  aux
Fin Para
Eliminación de Gauss-Jordan

Para j desde (i + 1) hasta N-1 hacer


Para k desde (N+1) hasta i Inc -1 hacer
A[ j, k ]  A[ j, k ] - A[ i, k ] * A[ j, i ] / A[ i, i ]
Fin Para
Fin Para
Fin Para
Fin Método
Eliminación de Gauss-Jordan

Algoritmo:
 Fase de sustitución ascendente.

 Los valores de las variables se calculan en el array x de N


elementos, por medio de la matriz triangular obtenida en la
primera fase.
Método Clase.Sustitución( )
Para j desde N hasta 1 Inc -1 hacer
t0
Para k desde (j + 1) hasta N hacer
t  t + A[ j, k ] * x[ k ]
Fin Para
x [ j ]  (A[ j, N+1 ] – t)/ A[ j, j ]
Fin Para
Fin Método
Algoritmos geométricos
Algoritmos geométricos

 Las computadoras se utilizan muchas veces para


resolver problemas que son inherentemente
geométricos.
 Los objetos geométricos como puntos, líneas y
polígonos constituyen la base de una gran variedad de
aplicaciones importantes.
 Los algoritmos geométricos son importantes en
sistemas de análisis y diseño de objetos físicos, que
pueden ser desde edificios y automóviles hasta
circuitos integrados.
 Además de resolver problemas geométricos, en la
actualidad tiene otras aplicación es como gráfica,
robótica y diseño.
Puntos, líneas y polígonos

 El objeto fundamental es el punto, al que se le


considera como una par de enteros (coordenadas del
punto en el sistema cartesiano).
Clase Punto ( )
Atributos
entero X
entero Y
Métodos
…….
fin Clase
Puntos, líneas y polígonos

 Una línea es un par de puntos, que se supone que


están unidos por un segmento de línea recta
Clase Línea( )
Atributos
Punto A
Punto B
Métodos
…….
fin Clase
Puntos, líneas y polígonos

 Un polígono es una lista de puntos, se supone que


puntos sucesivos están unidos por líneas y que el
primer punto está conectado al último, para formar una
figura cerrada.
Clase Polígono( )
Atributos
Punto polig[Nmax]
Métodos
…….
fin Clase
Puntos, líneas y polígonos

 Se representarán los objetos geométricos más


complicados en función de estos componentes
básicos.
Problemas clásicos de Geometría

 Verificar si un punto se encuentra a izquierda o


derecha de un segmento.
 Verificar corte de segmentos y punto de corte.
 Verificar si un punto se encuentra dentro de un
polígono.
 Calcular el área encerrada por un polígono.
 Encontrar el convex hull. (menor polígono convexo que
encierra un conjunto de puntos).
 Encontrar el par de puntos cuya distancia es la menor
de un conjunto.
Verificar si un punto se encuentra a
izquierda o derecha de un segmento
 Conociendo las propiedades del producto vectorial es muy
simple saber si un punto esta a la derecha o a izquierda de
un segmento. Seguimos los siguientes pasos:
 Trasladamos todo al origen, generando 2 vectores, uno
del primer punto del segmento al segundo, y otro del
primer punto del segmento al punto que quiero saber si
se encuentra a izquierda o a derecha.
V1 = P – S.p1
V2 = S.p2 – S.p1
Verificar si un punto se encuentra a
izquierda o derecha de un segmento
 Aplicamos el producto vectorial entre los vectores
generados. Y sacamos las conclusiones desde ahí, como
muestra la figura.
 En nuestro caso V1 y V2, como el punto está a la
derecha nos da positivo, siguiendo la regla del tirabuzón.
Si nos diese negativo el punto estaría a izquierda y si nos
diese 0 el punto estaría sobre el segmento.
Verificar si un punto se encuentra a
izquierda o derecha de un segmento
Método Clase.IzqDer(Linea S, punto P)
punto V1
punto V2
V1.x  P.x - S.p1.x, V1.y  P.y - S.p1.y
V2.x  S.p2.x - S.p1.x, V2.y  S.p2.y - S.p1.y
producto_vectorial  ((V1.x * V2.y)-(V2.x * V1.y))
Retornar producto_vectorial
Fin Método
 > 0 a derecha, < 0 izquierda, = 0 en el segmento

 Este producto vectorial nos estaría dando sólo la

coordenada en z que es la que nos interesa saber si


es positiva o negativa.
Verificar mismo lado

 Verifica que ambos puntos del segmento se encuentren del


mismo lado utilizando el método IzqDer.
Método Clase.VerSeCortan(Linea S, Linea Q)
lado_p1 = IzqDer(S,Q.p1)
lado_p2 = IzqDer(S,Q.p2)
Si ((lado_p1 * lado_p2) <= 0) entonces
lado_p1 = Izq_der(Q,S.p1)
lado_p2 = Izq_der(Q,S.p2)
Si((lado_p1 * lado_p2) <= 0) entonces Retornar 1 //se cortan
Sino Retornar 0 //no se cortan
Fin Método
 La condición ((lado_p1 * lado_p2) <= 0) verifica si están del
mismo lado, o son los 2 positivos o son los 2 negativos.
Verificar por la ecuación de la recta

 La ventaja de este algoritmo es que además de decidir si hay o no


hay intersección, en caso que lo haya devuelve el punto de
intersección.
 Calcula la distancia del punto, a ambos puntos del segmento, si la
suma de éstas, es la misma a la distancia entre los puntos del
segmento entonces, el punto está sobre éste.

Método Clase.Pertenece(Linea S, punto P)


distanciaP1  Raiz(Pot(S.p1.x – P.x, 2) + Pot(S.p1.y - P.y, 2))
distanciaP2  Raiz(Pot(S.p2.x – P.x, 2) + pow(S.p1.y - P.y, 2))
distanciaS1S2  Raiz(Pot(S.p1.x - S.p2.x, 2) +
Pot(S.p1.y - S.p2.y, 2))
Retornar ((distanciaP1 + distanciaP2) = distanciaS1S2)
Fin Método
Verificar por la ecuación de la recta
Método VerPorEcuacion(Linea S, Linea Q, Punto &X) //Y = MX + B
M1 = (S.p2.y - S.p1.y)/(S.p2.x - S.p1.x) // pendiente 1
M2 = (Q.p2.y - Q.p1.y)/(Q.p2.x - Q.p1.x) // pendiente 2
B1 = S.p1.y - M1 * S.p1.x //ordenada 1
B2 = Q.p1.y - M2 * Q.p1.x //ordenada 2
XE.x = (B2 - B1)/(M1 - M2) //y de encuentro, igualando las rectas
XE.y = M1*XE.x + B1
Si(Pertenece(S, XE) y Pertenece(Q, XE)) entonces
X.x = E.x, X.y = XE.y
Retornar 1
Fin Si
X.x = INFINITO, X.y = INFINITO
Retornar 0
Fin Método
Camino Cerrado Simple

 Dado un conjunto de N puntos, se debe encontrar un


camino que no se corte a si mismo, que recorra todos
los puntos y que vuelva al punto inicial.
 Tal camino se denomina “camino cerrado simple”.

C K N

I
L

A F P

G
O
E J
D
H

Q M
B
Camino Cerrado Simple

 Una forma sencilla de resolver este problema es la


siguiente:
 Se selecciona uno de los puntos que servirá como
pivote.
 Después se calcula el ángulo de las líneas que unen el
pivote con cada uno de los puntos del conjunto según la
dirección horizontal positiva (pivote como origen).
 A continuación se ordenan los puntos según el ángulo
calculado.
 Por último se conectan los ángulos adyacentes.
 El resultado es un camino cerrado simple que conecta
todos los puntos como se muestra en la figura anterior, si
los puntos se recorren en el orden:
B, M, J, L, N, P, K, F, I, E, C, O, A, H, G, D, Q
Camino Cerrado Simple

 Si dx y dy son las distancias en los ejes x e y, desde el


punto pivote a cualquier otro punto, el ángulo buscado
en este algoritmo es tan-1 dy/dx (arcotangente).
 En lugar de usar el arcotangente, se puede crear un
método “Theta” que devuelva un número entre 0 y
360, que no es el ángulo formado por el punto con la
horizontal, pero que nos servirá igual para la
ordenación. Para esto calcularemos dy/(dx+dy).
Camino Cerrado Simple
Método Clase.Theta (Punto p1, Punto p2)
dx  p2.x - p1.x
ax  abs(dx)
dy  p2.y - p1.y
ay  abs(dy)
Si (ax + ay = 0) entonces t  0
Sino t  1.0*dy/(ax+ay)
Si (dx < 0) entonces
t2–t
Sino
Si (dy < 0) entonces t  t + 4
Fin Si
Retornar (t*90.0)
Fin Método
Cerco Convexo

 Polígono convexo. Es aquél que tiene la propiedad


de que cualquier línea que una dos puntos
cualesquiera del interior del polígono estará dentro del
mismo.
 Cerco Convexo. Dado un conjunto de puntos del
plano, un cerco convexo es el polígono convexo más
pequeño que los contiene a todos.
 Es el camino más pequeño que envuelve los puntos.
 Los vértices del polígono convexo que definen el cerco
son puntos pertenecientes al conjunto original de puntos.
Cerco Convexo

Potrebbero piacerti anche