24.12.2014 Views

Matrices sin álgebra lineal

Matrices sin álgebra lineal

Matrices sin álgebra lineal

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Notas del curso MATE 3009, UPR­Humacao, mayo 2007.<br />

<strong>Matrices</strong> <strong>sin</strong> álgebra <strong>lineal</strong><br />

Esta es una ilustración de cómo podemos usar matrices fuera del contexto del álgebra <strong>lineal</strong>.<br />

Las matrices, como arreglos rectangulares de números, son útiles para representar propiedades en un<br />

plano. Por ejemplo, las temperaturas en distintos puntos de una placa de metal se puede representar<br />

con una matriz. Digamos que queremos usar una matriz 50x50. Podemos dividir la placa en un<br />

cuadriculado 50x50.<br />

const int N = 50, M=50;<br />

double placa[NMAX][MMAX];<br />

Cada entrada de la matriz puede representar la temperatura promedio en el cuadro correspondiente.<br />

Valores iniciales<br />

Podemos usar una función para iniciar la temperatura uniforme de la placa a un valor dado.<br />

for(int n=0; n < N; n++)<br />

for(int m=0; m < M; m++)<br />

placa[n][m] = tInterior;<br />

Aquí tInterior contiene la temperatura que queremos asignar a toda la placa. Suponga ahora que<br />

queremos poner una fuente de calor pegada a la base de la placa. Eso mantendría ese borde de la placa<br />

a esa temperatura. Para simular esa condición podemos poner la región apropiada de la matriz a esa<br />

temperatura de la siguiente manera:<br />

tempMax = tBorde;<br />

for(int m=M/3; m < M*2/3; m++) placa[0][m] = tempMax;<br />

Aquí estamos asignándole otra temperatura a una tercera parte del borde inferior de la placa. Podemos<br />

unir todo esto para formar una función:<br />

void iniciaPlaca(const double tInterior, const double tBorde) {<br />

for(int n=0; n < N; n++)<br />

for(int m=0; m < M; m++)<br />

placa[n][m] = tInterior;<br />

tempMax = tBorde; tempMin = tInterior;<br />

for(int m=M/3; m < M*2/3; m++) placa[0][m] = tempMax;<br />

}<br />

Si queremos iniciar una placa a temperatura ambiente y una fuente de calor a 400 grados podemos usar


esa función haciendo la llamada<br />

iniciaPlaca(25.0, 400.0);<br />

Representación gráfica<br />

Podemos usar una biblioteca gráfica simple para representar la temperatura de la placa en colores<br />

falsos. La biblioteca que usamos en esta ilustración es “Introductory Graphics Library u<strong>sin</strong>g<br />

GLUT/OpenGL” de la Universidad Northwestern. A la plantilla del programa sólo tenemos que<br />

cambiarle las funciones main() y myDisplay(). Sabemos cual es la función de main(). Por ahí<br />

comienza a ejecutarse el programa. Así que allí es que tenemos que inicializar los valores de nuestra<br />

placa:<br />

int main(int argc, char **argv)<br />

{<br />

iniciaPlaca(25.0, 200.0);<br />

InitGraphics();<br />

return 0;<br />

}<br />

// añadido para la placa<br />

// start GLUT/OpenGL<br />

La función myDisplay() es llamada por el sistema gráfico para actualizar el dibujo cada vez que sea<br />

necesario. Por tanto allí añadimos nuestra función para dibujar:<br />

void myDisplay(void)<br />

{<br />

dibujaPlaca();<br />

}<br />

Pero no hemos definido a dibujaPlaca(). Para hacerlo simplemente recorremos la matriz que<br />

tiene la información de la matriz y pintamos un cuadrito con un color que represente esa temperatura:<br />

void dibujaPlaca(){<br />

int anchoCuadrito = 400 / N;<br />

}<br />

for(int n=0; n < N; n++) // ciclos para recorrer la matriz<br />

for(int m=0; m < M; m++){<br />

double intensidad = (placa[n][m]­tempMin)/(tempMax­tempMin);<br />

SetPenColor(intensidad, 0.0, 1.0­intensidad);<br />

int baseX = n * anchoCuadrito, baseY = m * anchoCuadrito;<br />

DrawFillBox(baseX, baseY, baseX+anchoCuadrito,<br />

baseY+anchoCuadrito);<br />

}<br />

Note que:


● para determinar anchoCuadrito se divide el tamaño total en píxeles del área en que se va a<br />

dibujar (en este caso 400) por la cantidad de entradas en la matriz (N) para saber qué ancho<br />

tiene cada cuadrito.<br />

● intensidad es un valor entre 0 y 1.<br />

● SetPenColor es azul cuando la intensidad es cero, rojo cuando es uno y un color intermedio<br />

en otros casos.<br />

El meollo de la simulación<br />

Para que la simulación evolucione tenemos que recomputar la matriz de temperaturas periódicamente.<br />

Tenemos que definir un criterio para saber cuales son las nuevas temperaturas basadas en la<br />

información anterior. La siguiente estrategia es muy común. La temperatura en una celda depende de<br />

su temperatura y la de sus celdas vecinas. Si la temperaturas de las vecinas son más altas la celda se<br />

debe calentar y si son más frías se debe enfriar. Una fórmula que refleja esto es:<br />

placa[n][m] + (promTemp ­ placa[n][m]) * difusividad<br />

PromTemp es el promedio de las temperaturas de las 8 celdas vecinas y difusividad es un parámetro<br />

que define cuan rápido se disipa el calor en ese material. Tenemos que hacer eso con todas las celdas<br />

interiores. Las del borde no tienen vecinas en todos los lados y requieren atención especial. Una<br />

función que atiende el cómputo de las nuevas temperaturas en el interior es:<br />

void calculaTemperaturas(const double difusividad){<br />

for(int n=1; n < N­1; n++) // recorre matriz los<br />

for(int m=1; m < M­1; m++){ // bordes no se consideran<br />

double acumTemp = 0.0;<br />

for(int dn=­1; dn

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!