Use o botão abaixo para reportar erros ou dar sugestões.

Computação Científica - Um Livro Colaborativo

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 N do código por 3. Observe que a constante N é bastante usada no código e a diretiva # define desobriga de passá-la como parâmetro em todas as funções que ela aparece.

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 19/8/2020 às 17:33:17.

Informe erros ou edite você mesmo!