4.2 Matrizes
Matrizes são vetores de vetores, isto é, cada posição de um vetor pode ser
um vetor. Para definir uma matriz fazemos tipo nome[n⁰ linhas][n⁰ colunas],
como no exemplo:
Exemplo 4.2.1. Alguns testes de inicialização de matrizes.
#include <stdio.h>
#include <math.h>
main (void)
{
int i,j;
double x[2][2];// não inicializado
int y[3][3]={{1,2,5},{1,0,1},{0,1,0}};
x[0][0]=1.1;
x[0][1]=2;
x[1][0]=3;
x[1][1]=4;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
printf("x[%d][%d] = %f ",i,j,x[i][j]);
}
printf("\n");
}
printf("\ny[%d][%d] = %d\n",1,2,y[1][2]);
}
Exemplo 4.2.2. Vamos refazer o exemplo 4.1.3 usando estrutura de
matrizes
#include <stdio.h>
#include <math.h>
main (void)
{
double vetor[3]={1,2,3},matriz[3][3]={{3,1,1},{-1,-4,2},{-2,2,5}};
double norma2,tolerancia=1e-3,x_antigo[3],x_atual[3];
int i,controle=3;
//chute inicial
for (i=0;i<3;i++)x_antigo[i]=0;
//iteração
while (controle)
{
x_atual[0]=(vetor[0]-matriz[0][1]*x_antigo[1]-matriz[0][2]*x_antigo[2])/matriz[0][0];
x_atual[1]=(vetor[1]-matriz[1][0]*x_antigo[0]-matriz[1][2]*x_antigo[2])/matriz[1][1];
x_atual[2]=(vetor[2]-matriz[2][0]*x_antigo[0]-matriz[2][1]*x_antigo[1])/matriz[2][2];
norma2=0;
for (i=0;i<3;i++) norma2+=(x_atual[i]-x_antigo[i])*(x_atual[i]-x_antigo[i]);
if (norma2<tolerancia) controle--;
else controle=3;
for (i=0;i<3;i++) x_antigo[i]=x_atual[i];
printf("x=%f, y=%f, z=%f\n",x_atual[0],x_atual[1],x_atual[2]);
}
}
Agora, vamos fazer o mesmo código outra vez generalizando as rotinas
#include <stdio.h>
#include <math.h>
#define N 3 /* dimensão do sistema*/
double norma_2(double x[N])
{
int i;
for (i=0;i<N;i++)
{
norma2+=x[i]*x[i];
}
return sqrt(norma2);
}
void Iteracao(double x_antigo[N],double x_atual[N],double matriz[N][N], double vetor[N])
{
double aux;
int i,j;
for (i=0;i<N;i++)
{
aux=0;
for (j=0;j<i;j++)
aux+=matriz[i][j]*x_antigo[j];
for (j=i+1;j<N;j++)
aux+=matriz[i][j]*x_antigo[j];
x_atual[i]=(vetor[i]-aux)/matriz[i][i];
}
}
void Jacobi(double tolerancia,double x_atual[N])
{
double x_antigo[N],dif[N];
double matriz[N][N]={{3,1,1},{-1,-4,2},{-2,2,5}};
double vetor[N]={1,2,3};
int i,controle=3;
//chute inicial
for (i=0;i<N;i++)x_antigo[i]=0;
//iteração
while (controle)
{
Iteracao(x_antigo,x_atual,matriz,vetor);
for (i=0;i<N;i++) dif[i]=x_atual[i]-x_antigo[i];
if (norma_2(dif)<tolerancia) controle--;
else controle=3;
for (i=0;i<N;i++) x_antigo[i]=x_atual[i];
}
return;
}
main (void)
{
int i;
double tolerancia=1e-3,solucao[N];
Jacobi(tolerancia,solucao);
for (i=0;i<N;i++) printf("x[%d] = %f\n",i,solucao[i]);
}
No último código usamos uma diretiva #define N 3 que diz para o compilador trocar todos
os do código
por . Observe
que a constante
é bastante usada no código e a diretiva # define desobriga de passá-la como
parâmetro em todas as funções que ela aparece.