Advertisement
Fedeaguirre87

TP2EJ2eV3ParaConsulta

Sep 9th, 2024
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.51 KB | Source Code | 0 0
  1. %TP2EJ2V3ParaConsulta
  2.  
  3.  
  4. clc
  5. clear
  6. % Definir los sistemas de ecuaciones
  7. A1 = [3.8, 1.6, 0.9; -0.7, 5.4, 1.6; 1.5, 1.1, 3.2];
  8. b1 = [15.5; 10.3; 3.5];
  9.  
  10. A2 = [1 0 1; -1 1 0; 1 2 -3];
  11. b2 = [4; 1; -4];
  12.  
  13. A3 = [1 0.5 0.5; 0.5 1 0.5; 0.5 0.5 1];
  14. b3 = [2; 2; 2];
  15.  
  16. % Tolerancia y número máximo de iteraciones
  17. tol = 1e-6;
  18. max_iter = 100;
  19.  
  20. % Resolver los sistemas
  21. [x1_gs, x1_jacobi] = resolver_sistemas(A1, b1, tol, max_iter);
  22. [x2_gs, x2_jacobi] = resolver_sistemas(A2, b2, tol, max_iter);
  23. [x3_gs, x3_jacobi] = resolver_sistemas(A3, b3, tol, max_iter);
  24.  
  25. disp(x1_jacobi);
  26. disp(x1_gs);
  27.  
  28. disp(x2_jacobi);
  29. disp(x2_gs);
  30. disp(x3_jacobi);
  31. disp(x3_gs);
  32.  
  33.  
  34. % Función para resolver sistemas de ecuaciones lineales
  35. function [x_gs, x_jacobi] = resolver_sistemas(A, b, tol, max_iter)
  36.     % Verificar diagonal dominancia y reordenar filas si es necesario
  37.     [A, b] = asegurar_diagonal_dominante(A, b);
  38.    
  39.     % Inicializar soluciones
  40.     n = length(b);
  41.     x_gs = zeros(n, 1);
  42.     x_jacobi = zeros(n, 1);
  43.    
  44.     % Método de Gauss-Seidel
  45.     x_gs = gauss_seidel(A, b, x_gs, tol, max_iter);
  46.    
  47.     % Método de Jacobi
  48.     x_jacobi = jacobi(A, b, x_jacobi, tol, max_iter);
  49. end
  50.  
  51. % Función para asegurar diagonal dominancia
  52. function [A, b] = asegurar_diagonal_dominante(A, b)
  53.     n = size(A, 1);
  54.     for i = 1:n
  55.         if abs(A(i, i)) < sum(abs(A(i, [1:i-1, i+1:n])))
  56.             % Buscar una fila para intercambiar
  57.             for j = i+1:n
  58.                 if abs(A(j, i)) > sum(abs(A(j, [1:i-1, i+1:n])))
  59.                     % Intercambiar filas i y j
  60.                     A([i, j], :) = A([j, i], :);
  61.                     b([i, j]) = b([j, i]);
  62.                     break;
  63.                 end
  64.             end
  65.         end
  66.     end
  67. end
  68.  
  69. % Función de Gauss-Seidel
  70. function x = gauss_seidel(A, b, x0, tol, max_iter)
  71.     x = x0;
  72.     for i = 1:max_iter
  73.         for j = 1:size(A, 2)
  74.             sum = 0;
  75.             for k = 1:j-1
  76.                 sum = sum + A(j, k) * x(k);
  77.             end
  78.             for k = j+1:size(A, 2)
  79.  
  80.                 sum = sum + A(j, k) * x0(k);
  81.             end
  82.             x(j) = (b(j) - sum) / A(j, j);
  83.         end
  84.         if norm(A * x - b) < tol
  85.             break
  86.         end
  87.         x0 = x;
  88.     end
  89. end
  90.  
  91. % Función de Jacobi
  92. function x = jacobi(A, b, x0, tol, max_iter)
  93.     x = x0;
  94.     D = diag(A);
  95.     R = A - diag(D);
  96.     for i = 1:max_iter
  97.         x_new = (b - R * x) ./ D;
  98.         if norm(x_new - x) < tol
  99.             break
  100.         end
  101.         x = x_new;
  102.     end
  103. end
Tags: Matlab
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement