Advertisement
Guest User

Jacobi

a guest
Feb 12th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scilab 3.20 KB | None | 0 0
  1. clear // Limpa as variáveis armazenadas na última execução do programa
  2. clc // Apaga texto na saída do programa
  3.  
  4.  
  5. // Criando matriz dos coeficientes de ordem n = 3(3x3)
  6. A = [10 1 -1;
  7.     2 10 8;
  8.     7 1 10];
  9.  
  10. // Criando matriz das constantes
  11. b = [10; 20; 30];
  12.  
  13. // Define a tolerância do programa, o erro máximo que ele aceitará antes de convergir
  14. tol = 1 * 10^-6;
  15.  
  16. // Cria a matriz das variáveis, com o chute inicial do método
  17. x = [0; 0; 0];
  18.  
  19. // Definindo número máximo de iterações que o programa irá fazer,forma de previnir que seu programa
  20. // não seja executado para sempre quando a tolerância não for alcançada
  21. N = 100;
  22.  
  23. // Definindo função que resolve o sistema de equações pelo método de Jacobi
  24. // Essa função retorna um vetor na forma [x, deltax]
  25. // onde x é uma matriz 3x1 com os valores finais da varíavel x
  26. // E deltax é a variação(delta) que teve do último valor calculado de x com seu penultimo valor
  27. // Os parâmetros da função são:
  28. // A: Matriz dos coeficientes
  29. // b: Matriz das constantes
  30. // x: Matriz das variáveis(geralmente é o chute inicial)
  31. // tol: tolerância máxima
  32. // N: Número máximo de iterações
  33.  
  34. function [x, deltax] = jacobi(A, b, x, tol, N)
  35.     // Descobrindo a ordem da matriz A
  36.     // A função size calcula o tamanho de um vetor. Nesse caso, estamos interessados em calcular o
  37.     // tamanho do vetor A(1) = [10 1 -1], que será 3.
  38.     n = size(A, 1)
  39.  
  40.     // Cria uma variável auxiliar para assumir os valores de x a cada iteração do método
  41.     // Inicializamos ela com o valor do chute inicial
  42.     xnew = x
  43.  
  44.     // Criamos uma variável para controlar o loop(while) e parar o processo
  45.     // de iteração caso o método convirja
  46.     convergiu = %F
  47.  
  48.     // Criamos uma variável contadora para sabermos em qual iteração estamos
  49.     k = 1
  50.  
  51.     // O código dentro do while repetirá enquanto o número de iterações não esgotar o máximo definido(N)
  52.     // ou enquanto o método não tenha convergido
  53.  
  54.     while k <= N & ~convergiu
  55.         // Aplicação do método iterativo
  56.         xnew(1) = (b(1) - A(1, 2:n) * x(2:n)) / A(1, 1)
  57.  
  58.         for i = 2: (n - 1)
  59.             xnew(i) = (b(i) - A(i, 1:i - 1) * x(1:i - 1)
  60.                             - A(i, i + 1:n))* x(1 + 1:n)) / A(i, i)
  61.         end
  62.  
  63.         xnew(n) = (b(n) - A(n, 1:n - 1) * x(1:n - 1)) / A(n, n)
  64.  
  65.         // A função max pega o maior valor em um vetor. Exemplo:
  66.         // max([2, -2, 833]) = 833
  67.         // A função abs transforma em módulo todos os números numa matriz. Exemplo:
  68.         // abs([2, -2, 833]) = [2, 2, 833]
  69.  
  70.         // A seguinte linha irá descobrir qual o maior Delta entre a iteração atual e a iteração anterior
  71.         // x: iteração anterior
  72.         // xnew: iteração atual
  73.  
  74.         deltax = max(abs(x - xnew))
  75.  
  76.         // Descobrindo se a tolerância definida foi alcançada
  77.  
  78.         if deltax < tol then
  79.             // Altera o valor da variável convergiu para que o while seja parado
  80.             convergiu = %T
  81.         end
  82.  
  83.         // Aumenta +1 no número da iteração
  84.         k = k + 1
  85.  
  86.         // Atribui os últimos valores calculados das variáveis à variável x
  87.         x = xnew
  88.  
  89.     end
  90. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement