tomasfdel

Métodos Práctica 5

Oct 12th, 2017
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scilab 8.20 KB | None | 0 0
  1. FUNCIONES/PROCEDIMIENTOS ÚTILES:
  2. - spec(A) devuelve los autovalores de A
  3. -   x = poly(0, 'x')
  4.     pol = det(x*eye(A) - A)
  5.     roots(pol)
  6. Hace lo mismo
  7.  
  8.  
  9.  
  10.  
  11. Ejercicio 1 - Apartado A:
  12. - Ya revisamos que ambas matrices de coeficientes son inversibles.
  13.  
  14. - Primer sistema: La matriz N no es inversible pues tenemos un 0 en la entrada (1,1) de A. Permutando para que las filas de A estén en el orden (2,3,1), da que el radio espectral de A permutada es menor a 1, lo cual por un Corolario permite afirmar que converge.
  15. - Segundo sistema: El segundo sistema converge pues la matriz de coeficientes es diagonal dominante (Un teorema dice que la sucesión converge si pasa eso).
  16.  
  17. Ejercicio 1 - Apartado B:
  18. - Primer sistema: Con la permutación de filas (2,3,1) el radio espectral es menor a 1.
  19. - Segundo sistema: La mtriz sin permutar da un radio espectral menor a 1.
  20.  
  21. Ejercicio 1 - Apartado C:
  22. //Somos gente simple y suponemos que la diagonal de A no tiene elementos nulos.
  23. function x2 = metodoJacobi(A, b, inicio, tolerancia)
  24.     N = size(A)(1)
  25.     x1 = inicio
  26.    
  27.     for i = 1:N
  28.         sumatoria = 0
  29.         for j = 1:N
  30.             if(j ~= i)
  31.                sumatoria = sumatoria + A(i, j) * x1(j)      
  32.             end
  33.         end
  34.         x2(i) = (b(i) - sumatoria) / A(i,i)
  35.     end
  36.  
  37.     while (norm(x2-x1,2) > tolerancia)
  38.         x1 = x2
  39.         for i = 1:N
  40.             sumatoria = 0
  41.             for j = 1:N
  42.                 if(j ~= i)
  43.                    sumatoria = sumatoria + A(i, j) * x1(j)      
  44.                 end
  45.             end
  46.             x2(i) = (b(i) - sumatoria) / A(i,i)
  47.         end
  48.     end
  49. endfunction
  50.  
  51.  
  52. Ap1 = [1 -1 -1; 1 -1 2; 0 2 4]
  53.  Ap1  =
  54.    1.  -1.  -1.
  55.    1.  -1.   2.
  56.    0.   2.   4.
  57. --> b = [0.375; 0; 0]
  58.  b  =
  59.    0.375
  60.    0.
  61.    0.
  62. --> metodoJacobi(Ap1, b, [0; 0; 0], 0.01)
  63.  ans  =
  64.    0.4980469
  65.    0.2460938
  66.   -0.1230469
  67. --> Ap1 * ans
  68.  ans  =
  69.    0.375
  70.    0.0058594
  71.    0.
  72.  
  73.  
  74.  
  75.  
  76.  
  77. --> Bp1
  78.  Bp1  =
  79.    1.  -1.   0.
  80.   -1.   2.  -1.
  81.    0.  -1.   1.1
  82. --> b = [0; 1; 0]
  83.  b  =
  84.    0.
  85.    1.
  86.    0.
  87. --> metodoJacobi(Bp1, b, [0; 0; 0], 0.01)
  88.  ans  =
  89.    10.789086
  90.    10.798673
  91.    9.8082602
  92. --> Bp1 * ans
  93.  ans  =
  94.   -0.009587
  95.    1.
  96.   -0.009587
  97.  
  98.  
  99.  
  100.  
  101.  
  102. Ejercicio 2:
  103.  
  104. function [x2, iteraciones] = metodoGaussSeidel(A, b, inicio, tolerancia)
  105.     N = size(A)(1)
  106.     x1 = inicio
  107.     for i = 1:N
  108.         sumatoria = 0
  109.         for j = 1:i-1
  110.             sumatoria = sumatoria + A(i, j) * x2(j)
  111.         end
  112.         for j = i+1:N
  113.             sumatoria = sumatoria + A(i, j) * x1(j)
  114.         end
  115.         x2(i) = (b(i) - sumatoria) / A(i,i)
  116.     end
  117.    
  118.     iteraciones = 1
  119.    
  120.     while (norm(x2-x1,2) > tolerancia)
  121.         x1 = x2
  122.         for i = 1:N
  123.             sumatoria = 0
  124.             for j = 1:i-1
  125.                 sumatoria = sumatoria + A(i, j) * x2(j)
  126.            end
  127.             for j = i+1:N
  128.                 sumatoria = sumatoria + A(i, j) * x1(j)
  129.             end
  130.             x2(i) = (b(i) - sumatoria) / A(i,i)
  131.         end
  132.         iteraciones = iteraciones + 1
  133.     end
  134. endfunction
  135.  
  136.  
  137. --> A = [10 1 2 3 4; 1 9 -1 2 -3; 2 -1 7 3 -5; 3 2 3 12 -1; 4 -3 -5 -1 15]
  138.  A  =
  139.    10.   1.   2.   3.    4.
  140.    1.    9.  -1.   2.   -3.
  141.    2.   -1.   7.   3.   -5.
  142.    3.    2.   3.   12.  -1.
  143.    4.   -3.  -5.  -1.    15.
  144. --> b = [12; -27; 14; -17; 12]
  145.  b  =
  146.    12.
  147.   -27.
  148.    14.
  149.   -17.
  150.    12.
  151. --> [res, iter] = metodoJacobi(A, b, [0;0;0;0;0], 10**-6)
  152.  iter  =
  153.    67.
  154.  res  =
  155.    1.0000016
  156.   -2.0000015
  157.    2.9999973
  158.   -1.9999996
  159.    0.9999981
  160. --> [res2, iter2] = metodoGaussSeidel(A, b, [0;0;0;0;0], 10**-6)
  161.  iter2  =
  162.    38.
  163.  res2  =
  164.    1.0000009
  165.   -2.0000007
  166.    2.9999987
  167.   -1.9999999
  168.    0.9999992
  169. --> A * res - b
  170.  ans  =
  171.    0.0000028
  172.   -0.0000023
  173.   -0.0000033
  174.    0.0000009
  175.   -0.0000051
  176. --> A * res2 - b
  177.  ans  =
  178.    0.0000029
  179.   -0.0000018
  180.   -0.000002
  181.   -0.0000004
  182.    0.
  183.  
  184.  
  185.  
  186.  
  187.  
  188. Ejercicio 3:
  189.  
  190. --> N = [2 0 0 0 0; -1 2 0 0 0; 0 -1 2 0 0; 0 0 -1 2 0; 0 0 0 -1 2]
  191.  N  =
  192.    2.   0.   0.   0.   0.
  193.   -1.   2.   0.   0.   0.
  194.    0.  -1.   2.   0.   0.
  195.    0.   0.  -1.   2.   0.
  196.    0.   0.   0.  -1.   2.
  197. --> N \ eye(N)
  198.  ans  =
  199.    0.5       0.       0.      0.     0.
  200.    0.25      0.5      0.      0.     0.
  201.    0.125     0.25     0.5     0.     0.
  202.    0.0625    0.125    0.25    0.5    0.
  203.    0.03125   0.0625   0.125   0.25   0.5
  204. --> A = [2 -1 0 0 0; -1 2 -1 0 0; 0 -1 2 -1 0; 0 0 -1 2 -1; 0 0 0 -1 2]
  205.  A  =
  206.    2.  -1.   0.   0.   0.
  207.   -1.   2.  -1.   0.   0.
  208.    0.  -1.   2.  -1.   0.
  209.    0.   0.  -1.   2.  -1.
  210.    0.   0.   0.  -1.   2.
  211. --> N \ A
  212.  ans  =
  213.    1.  -0.5       0.       0.      0.  
  214.    0.   0.75     -0.5      0.      0.  
  215.    0.  -0.125     0.75    -0.5     0.  
  216.    0.  -0.0625   -0.125    0.75   -0.5
  217.    0.  -0.03125  -0.0625  -0.125   0.75
  218. --> B = N/eye(N)
  219.  B  =
  220.    2.   0.   0.   0.   0.
  221.   -1.   2.   0.   0.   0.
  222.    0.  -1.   2.   0.   0.
  223.    0.   0.  -1.   2.   0.
  224.    0.   0.   0.  -1.   2.
  225. --> B = N \ eye(N)
  226.  B  =
  227.    0.5       0.       0.      0.     0.
  228.    0.25      0.5      0.      0.     0.
  229.    0.125     0.25     0.5     0.     0.
  230.    0.0625    0.125    0.25    0.5    0.
  231.    0.03125   0.0625   0.125   0.25   0.5
  232. --> C=B*A
  233.  C  =
  234.    1.  -0.5       0.       0.      0.  
  235.    0.   0.75     -0.5      0.      0.  
  236.    0.  -0.125     0.75    -0.5     0.  
  237.    0.  -0.0625   -0.125    0.75   -0.5
  238.    0.  -0.03125  -0.0625  -0.125   0.75
  239. --> eye(C) - C
  240.  ans  =
  241.    0.   0.5       0.       0.      0.  
  242.    0.   0.25      0.5      0.      0.  
  243.    0.   0.125     0.25     0.5     0.  
  244.    0.   0.0625    0.125    0.25    0.5
  245.    0.   0.03125   0.0625   0.125   0.25
  246.  
  247.  
  248.  
  249.  
  250.  
  251. Ejercicio 4:
  252. Para contar el tiempo, es algo como:
  253.     tic()
  254.     //Inserte función para timear aquí.
  255.     Tiempo = toc()
  256.  
  257. --> N=500;
  258. --> A = 8*eye(N,N) + 2*diag(ones(N-1,1),1) + 2*diag(ones(N-1,1),-1) + diag(ones(N-3,1),3) + diag(ones(N-3,1),-3);
  259. --> b = ones(N, 1);
  260. --> [sol, timer] = metodoGauss(A,b);
  261. --> timer
  262.  timer  =
  263.    3.5102211
  264.  
  265. --> N=1000;
  266. --> A2 = 8*eye(N,N) + 2*diag(ones(N-1,1),1) + 2*diag(ones(N-1,1),-1) + diag(ones(N-3,1),3) + diag(ones(N-3,1),-3);
  267. --> b2 = ones(N, 1);
  268. --> [sol2, timer2] = metodoGauss(A2,b2);
  269. --> timer2
  270.  timer2  =
  271.    22.402927
  272.  
  273. --> N = 500;
  274. --> help zeros
  275. --> ceros = zeros (N, 1);
  276. --> [sol3, timer3] = gaussSeidelTimeado(A, b, ceros, 10**-6);
  277. --> timer3
  278.  timer3  =
  279.    11.317839
  280. --> [sol4, timer4] = gaussSeidelTimeado(A, b, ceros, 10**-12);
  281. --> timer4
  282.  timer4  =
  283.    28.087232
  284.  
  285. --> N = 1000;
  286. --> ceros2 = zeros(N, 1);
  287. --> [sol5, timer5] = gaussSeidelTimeado(A2, b2, ceros2, 10**-6);
  288. --> timer5
  289.  timer5  =
  290.    45.916292
  291. --> [sol6, timer6] = gaussSeidelTimeado(A2, b2, ceros2, 10**-12);
  292. --> timer6
  293.  timer6  =
  294.    113.07043
  295.  
  296.  
  297.  
  298.  
  299. Ejercicio 5:
  300.  
  301. function x2 = metodoSOR(A, b, factorCarga,  inicio, tolerancia)
  302.     N = size(A)(1)
  303.     x1 = inicio
  304.    
  305.     for i = 1:N
  306.         sumatoria = 0
  307.        
  308.         for j = 1:i-1
  309.             sumatoria = sumatoria + A(i, j) * x2(j)
  310.         end
  311.        
  312.         for j = i+1:N
  313.             sumatoria = sumatoria + A(i, j) * x1(j)
  314.         end
  315.  
  316.         x2(i) = (1-factorCarga) * x1(i) + factorCarga * (b(i) - sumatoria) / A(i,i)
  317.     end
  318.    
  319.     while (norm(x2-x1,2) > tolerancia)
  320.         x1 = x2
  321.         for i = 1:N
  322.             sumatoria = 0
  323.        
  324.             for j = 1:i-1
  325.                 sumatoria = sumatoria + A(i, j) * x2(j)
  326.             end
  327.            
  328.             for j = i+1:N
  329.                 sumatoria = sumatoria + A(i, j) * x1(j)
  330.             end
  331.    
  332.             x2(i) = (1-factorCarga) * x1(i) + factorCarga * (b(i) - sumatoria) / A(i,i)
  333.         end
  334.     end
  335. endfunction
  336.  
  337. // Suponemos ya se sabe que A es definida positiva y tridiagonal.
  338. function solucion = metodoSORDisney(A, b, inicio, tolerancia)
  339.     tamano = size(A)(1)
  340.     N = zeros(A)
  341.     for i=1:tamano
  342.         N(i,i) = A(i,i)
  343.     end
  344.    
  345.     Pj = eye(A) - N \ A
  346.     radioE = max(abs(spec(Pj)))
  347.     w = 2/(1+sqrt(1-radioE**2))
  348.     solucion = metodoSOR(A, b, w, inicio, tolerancia)
  349. endfunction
  350.  
  351.  
  352.  
  353. --> [sol1, iter1] = metodoGaussSeidelContador(A, b, [0; 0; 0], 10**-7)
  354.  iter1  =
  355.    36.
  356.  sol1  =
  357.    3.0000001
  358.    3.9999999
  359.   -5.
  360. --> [sol2, iter2] = metodoSORDisney(A, b, [0; 0; 0], 10**-7)
  361.  iter2  =
  362.    46.
  363.  sol2  =
  364.    3.
  365.    4.
  366.   -5.
Add Comment
Please, Sign In to add comment