Istvan

v2.0 gauss.m

Apr 26th, 2012
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.33 KB | None | 0 0
  1. % A gauss.m javított (v2.0) változata hozzá a javított dokumentáció v2.0 néven a pastebin-ben
  2.  
  3. % A program adott A mátrix és b vektor esetén a
  4. % Gauss-elimináció módszerét követve kiszámítja az Ax = b lineáris egyen-
  5. % letrendszer megoldását, részleges főelemkiválasztással
  6. % b vektor helyett adhatunk meg n×m-es mátrixot. Ekkor a b mártix egyes oszlopai egy-egy egyenletrendszert jelentenek.
  7.  
  8. % Bemenő paraméterek:
  9. % Egy n×n -es mátrix (A)
  10. % Egy n méretű vektor (b), vagy egy n×m-es mátrix
  11. % Egy egész szám: 1 ha ki akarjuk iratni a mátrix részeredményeit, különben nem ír ki részeredményt
  12.  
  13. % Kimenő adatok:
  14. % egy n méretű vektor, a lineáris egyenletrendszer megoldása (x), vagy egy n×m es eredménymátrix
  15. % D az A mátrix determinánsa
  16.  
  17. function x = gauss(A,b,p)
  18.  
  19. series_of_exchange=0;
  20. if ( 1 != ismatrix(A) || 1 != ismatrix(b) )
  21.   error('Rossz bemenő paraméter. A program hívása: gauss[n×n mátrix],[n×m mátrix],["i/h" logikai érték]')
  22. end
  23. [b_row,b_column]=size(b);
  24. [n,m]=size(A);
  25.  
  26. if ( n != m )
  27.   error('Nem n×n-es mátrix');
  28.   return;
  29. end
  30. if ( b_row != n )
  31.   error('Nem egyezik a mátrix mérete a b vektor méretével');
  32.   return;
  33. end
  34. if ( p == 1 )
  35.   A=[A,b]
  36. else
  37.   A=[A,b];
  38. end
  39. for k=1:n-1
  40.   for i=k+1:n
  41.     for j=k+1:n+b_column
  42.       if ( A(k,k) == 0 )
  43.     [maximum, ind] = max(abs(A(k:n,k)));
  44.     if ( maximum == 0 )
  45.       x = evaluate(A,n,m,b_column,b_row,p,k);
  46.           if ( p == 1 )
  47.             d = det(A,n,series_of_exchange);
  48.           end
  49.       return;
  50.     end
  51.     akt = A(ind,1:n+b_column);
  52.     A(ind,1:n+b_column) = A(k,1:n+b_column);
  53.     A(k,1:n+b_column) = akt;
  54.         series_of_exchange=series_of_exchange+1;
  55.         if ( p == 1 )
  56.           disp('A mátrix sorcsere utan:')
  57.           disp(A)
  58.           pause
  59.         end
  60.       end
  61.         A(i,j) = A(i,j) - ( (A(i,k) / A(k,k)) * A(k,j) );
  62.     end
  63.     A(i,k)=0;
  64.   end
  65.   if ( p == 1 )
  66.     disp('A matrix elimináció után:')
  67.     disp(A)
  68.     pause
  69.   end
  70. end
  71. if ( p == 1 )
  72.   d = det(A,n,series_of_exchange);
  73.   x=second(A,n,b_column)
  74. else
  75.   x=second(A,n,b_column);
  76. end
  77.  
  78. function xx = second(A,n,b_column)
  79. xx=zeros(n,b_column);
  80. for i=1:b_column  
  81.   xx(n,i) = A(n,n+i) / A(n,n);
  82.   temp=0;
  83.   for k=n-1:-1:1
  84.     for j=k+1:n
  85.       temp = temp + A(k,j) * xx(j,i);
  86.     end
  87.       xx(k,i) = (A(k,n+i) - temp) / A(k,k);
  88.       temp=0;
  89.   end
  90. end
  91.  
  92. function d = det(A,n,series_of_exchange)
  93. d=1;
  94. for i=1:n
  95.   d = d * A(i,i);
  96. end
  97. d=d*(-1)^series_of_exchange;
  98. str = ['Az A mátrix determinánsa: ', num2str(d)];
  99. disp(str)
  100.  
  101. function xx = evaluate(A,n,m,b_column,b_row,p,k)
  102. xx=zeros(n,b_column);
  103. A_is_all_null = !any(any(A(k:n,k:m)));
  104. for i=m+1:m+b_column
  105.   b_is_all_null = !any(any((A(k:b_row,i))));
  106.   if ( A_is_all_null && b_is_all_null )
  107.     AA=A;
  108.     AA(k:n,k:m)=1;
  109.     for t=k:b_row
  110.       AA(t,i)=rand();
  111.     end
  112.     AA=AA([1:n], [1:m i]);
  113.     if ( p == 1 )
  114.       str = [num2str(i-m), '. egyenletrendszernek végtelen sok megoldása van. Ezek közül egy:'];
  115.       disp(str)
  116.       x = second(AA,n,1)
  117.     end
  118.     x = second(AA,n,1);
  119.   elseif ( A_is_all_null && !b_is_all_null )
  120.     if ( p == 1 )
  121.       str = [num2str(i-m), '. egyenletrendszernek nincs megoldása'];
  122.       disp(str)
  123.     end
  124.   else
  125.     if ( p == 1 )
  126.       disp('Nem elég a részleges főelemkiválasztás')
  127.     end
  128.   end
  129. end
Advertisement
Add Comment
Please, Sign In to add comment