Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % A gauss.m javított (v2.0) változata hozzá a javított dokumentáció v2.0 néven a pastebin-ben
- % A program adott A mátrix és b vektor esetén a
- % Gauss-elimináció módszerét követve kiszámítja az Ax = b lineáris egyen-
- % letrendszer megoldását, részleges főelemkiválasztással
- % b vektor helyett adhatunk meg n×m-es mátrixot. Ekkor a b mártix egyes oszlopai egy-egy egyenletrendszert jelentenek.
- % Bemenő paraméterek:
- % Egy n×n -es mátrix (A)
- % Egy n méretű vektor (b), vagy egy n×m-es mátrix
- % 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
- % Kimenő adatok:
- % egy n méretű vektor, a lineáris egyenletrendszer megoldása (x), vagy egy n×m es eredménymátrix
- % D az A mátrix determinánsa
- function x = gauss(A,b,p)
- series_of_exchange=0;
- if ( 1 != ismatrix(A) || 1 != ismatrix(b) )
- error('Rossz bemenő paraméter. A program hívása: gauss[n×n mátrix],[n×m mátrix],["i/h" logikai érték]')
- end
- [b_row,b_column]=size(b);
- [n,m]=size(A);
- if ( n != m )
- error('Nem n×n-es mátrix');
- return;
- end
- if ( b_row != n )
- error('Nem egyezik a mátrix mérete a b vektor méretével');
- return;
- end
- if ( p == 1 )
- A=[A,b]
- else
- A=[A,b];
- end
- for k=1:n-1
- for i=k+1:n
- for j=k+1:n+b_column
- if ( A(k,k) == 0 )
- [maximum, ind] = max(abs(A(k:n,k)));
- if ( maximum == 0 )
- x = evaluate(A,n,m,b_column,b_row,p,k);
- if ( p == 1 )
- d = det(A,n,series_of_exchange);
- end
- return;
- end
- akt = A(ind,1:n+b_column);
- A(ind,1:n+b_column) = A(k,1:n+b_column);
- A(k,1:n+b_column) = akt;
- series_of_exchange=series_of_exchange+1;
- if ( p == 1 )
- disp('A mátrix sorcsere utan:')
- disp(A)
- pause
- end
- end
- A(i,j) = A(i,j) - ( (A(i,k) / A(k,k)) * A(k,j) );
- end
- A(i,k)=0;
- end
- if ( p == 1 )
- disp('A matrix elimináció után:')
- disp(A)
- pause
- end
- end
- if ( p == 1 )
- d = det(A,n,series_of_exchange);
- x=second(A,n,b_column)
- else
- x=second(A,n,b_column);
- end
- function xx = second(A,n,b_column)
- xx=zeros(n,b_column);
- for i=1:b_column
- xx(n,i) = A(n,n+i) / A(n,n);
- temp=0;
- for k=n-1:-1:1
- for j=k+1:n
- temp = temp + A(k,j) * xx(j,i);
- end
- xx(k,i) = (A(k,n+i) - temp) / A(k,k);
- temp=0;
- end
- end
- function d = det(A,n,series_of_exchange)
- d=1;
- for i=1:n
- d = d * A(i,i);
- end
- d=d*(-1)^series_of_exchange;
- str = ['Az A mátrix determinánsa: ', num2str(d)];
- disp(str)
- function xx = evaluate(A,n,m,b_column,b_row,p,k)
- xx=zeros(n,b_column);
- A_is_all_null = !any(any(A(k:n,k:m)));
- for i=m+1:m+b_column
- b_is_all_null = !any(any((A(k:b_row,i))));
- if ( A_is_all_null && b_is_all_null )
- AA=A;
- AA(k:n,k:m)=1;
- for t=k:b_row
- AA(t,i)=rand();
- end
- AA=AA([1:n], [1:m i]);
- if ( p == 1 )
- str = [num2str(i-m), '. egyenletrendszernek végtelen sok megoldása van. Ezek közül egy:'];
- disp(str)
- x = second(AA,n,1)
- end
- x = second(AA,n,1);
- elseif ( A_is_all_null && !b_is_all_null )
- if ( p == 1 )
- str = [num2str(i-m), '. egyenletrendszernek nincs megoldása'];
- disp(str)
- end
- else
- if ( p == 1 )
- disp('Nem elég a részleges főelemkiválasztás')
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment