Matrices sin álgebra lineal
Matrices sin álgebra lineal
Matrices sin álgebra lineal
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, UPRHumacao, 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)/(tempMaxtempMin);<br />
SetPenColor(intensidad, 0.0, 1.0intensidad);<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 < N1; n++) // recorre matriz los<br />
for(int m=1; m < M1; m++){ // bordes no se consideran<br />
double acumTemp = 0.0;<br />
for(int dn=1; dn