Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin

Zdjęcie

Wyznacznik macierzy za pomocą eliminacji gaussa

wyznacznik macierzy

  • Nie możesz napisać tematu
  • Zaloguj się aby odpowiedzieć
11 odpowiedzi w tym temacie

#1 doman

doman

    Nowicjusz

  • Użytkownik
  • 2 postów
0
Neutralny
  • Płeć:Mężczyzna

Napisano 12.06.2011 - 16:37

Mam policzyć wyznacznik macierzy za pomocą… metody eliminacji Gauss'a.

| 2 3 5 |
| 6 -2 3 |
| 8 4 1 |

Czy mógłby ktoś wyjaśnić jak to obliczyć?
  • 0

Afroman

    Kombinator

  • Użytkownik
3
  • Płeć:Kobieta

Napisano 25.09.2011 - 17:55

#2 masło

masło

    Kombinator

  • ^Przyjaciele
  • 294 postów
31
Mały Pomocnik II
  • Płeć:Mężczyzna

Napisano 12.06.2011 - 19:13

 \begin{vmatrix} 2&3&5 \\ 6&-2&3 \\ 8&4&1 \end{vmatrix} = \begin{array}{c} W_2-3W_1 \\ W_3-4W_1 \end{array} =\begin{vmatrix} 2&3&5 \\ 0&-11&-12 \\ 0&-16&-19 \end{vmatrix} = \left| \begin{array}{ccc|cc} 2&3&5&2&3 \\ 0&-11&-12&0&-11 \\ 0&-16&-19&0&-16 \end{array}\right|

I teraz widzisz, że wszędzie masz zera oprócz 2\cdot (-11) \cdot (-19) -2\cdot (-12)\cdot (-16)=34 .
Jak coś źle zrobiłem to usuńcie mój post..
  • 0
Dołączona grafika

#3 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2828 postów
1280
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 11:45

 \begin{vmatrix} 2&3&5 \\ 6&-2&3 \\ 8&4&1 \end{vmatrix} = \begin{array}{c} W_2-3W_1 \\ W_3-4W_1 \end{array} =\begin{vmatrix} 2&3&5 \\ 0&-11&-12 \\ 0&-8&-19 \end{vmatrix} = \left| \begin{array}{ccc|cc} 2&3&5&2&3 \\ 0&-11&-12&0&-11 \\ 0&-16&-19&0&-16 \end{array}\right|

I teraz widzisz, że wszędzie masz zera oprócz 2\cdot (-11) \cdot (-19) -2\cdot (-12)\cdot (-16)=34 .
Jak coś źle zrobiłem to usuńcie mój post..


 \begin{vmatrix} 2&3&5 \\ 6&-2&3 \\ 8&4&1 \end{vmatrix} = \begin{array}{c} W_2-3W_1 \\ W_3-4W_1 \end{array} =\begin{vmatrix} 2&3&5 \\ 0&-11&-12 \\ 0&-8&-19 \end{vmatrix} = \left| \begin{array}{ccc} 2&3&5 \\ 0&-11&-12 \\ 0&-8&-19 \end{array}\right | = 2(11\cdot 19 - 8\cdot 12) = 226
  • 0

#4 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 652 postów
225
Pomocnik III
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 13:31

A nie można było jeszcze raz odją…ć wierszy (od trzeciego drugi)
ale pewnie nie chcieliśmy wychodzić poza pierścień liczb całkowitych
Eliminacja Gaussa polega jednak na sprowadzeniu macierzy do postaci trójką…tnej
za pomocą… operacji elementarnych
  • 0

#5 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2828 postów
1280
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 14:17

A nie można było jeszcze raz odją…ć wierszy (od trzeciego drugi)
ale pewnie nie chcieliśmy wychodzić poza pierścień liczb całkowitych
Eliminacja Gaussa polega jednak na sprowadzeniu macierzy do postaci trójką…tnej
za pomocą… operacji elementarnych

Eliminacja Gaussa do obliczenia wyznaczników jest narzędziem do obniżenia stopnia wyznacznika o jeden, w przeciwieństwie do eliminacji Gaussa dla układów równań.
  • 0

#6 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 652 postów
225
Pomocnik III
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 18:20

To co wy zastosowaliście to raczej rozwinięcie Laplace + operacje elementarne

Ja jak miałem napisać program do liczenia wyznacznika w C/C++ za pomocą… eliminacji Gaussa
to doktorek od C/C++ powiedział że trzeba sprowadzić do postaci trójką…tnej
za pomocą… operacji elementarnych na wierszach bą…dź kolumnach
Wyznacznik macierzy trójką…tnej (jeżeli nie zamienialiśmy wierszy bą…dź kolumn)
jest iloczynem elementów na głównej przeką…tnej
Jeżeli musimy zamieniać wiersze bą…dź kolumny to albo wprowadzamy licznik
zamian wierszy bą…dź kolumn albo od razu po zamianie wierszy bą…dź kolumn
zmienić znak zmiennej która ma przechowywać wartość wyznacznika
  • 0

#7 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2828 postów
1280
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 21:28

To co wy zastosowaliście to raczej rozwinięcie Laplace + operacje elementarne

Ja jak miałem napisać program do liczenia wyznacznika w C/C++ za pomocą… eliminacji Gaussa
to doktorek od C/C++ powiedział że trzeba sprowadzić do postaci trójką…tnej
za pomocą… operacji elementarnych na wierszach bą…dź kolumnach
Wyznacznik macierzy trójką…tnej (jeżeli nie zamienialiśmy wierszy bą…dź kolumn)
jest iloczynem elementów na głównej przeką…tnej
Jeżeli musimy zamieniać wiersze bą…dź kolumny to albo wprowadzamy licznik
zamian wierszy bą…dź kolumn albo od razu po zamianie wierszy bą…dź kolumn
zmienić znak zmiennej która ma przechowywać wartość wyznacznika

Wszystko pięknie jeśli mówimy o numerycznym obliczaniu wyznacznika. Jeśli chcemy już być tacy dokładni, to nie możemy mówić, " do wiersza pierwszego dodajemy wiersz drugi pomnożony przez (-3)", tylko mnożymy daną… macierz ( nie wyznacznik) lewostronnie przez odpowiednią… macierz operacji elementarnej.
Piszą…c program numeryczny obliczania wyznacznika, nie działamy na wyznacznikach tylko na macierzach, a następnie po sprowadzaniu do prostszych postaci obliczamy ich wyznaczniki. Bo wyznacznik, to funkcja, która macierzy liczbowej przyporzą…dkowuje liczbę.
Każdy język programowy ma swoje mozliwości ale też i wymogi. Inne C/C++, jeszcze inne Matlab-Octave, Mathematica czy Maple w konstrukcji programów numerycznych.
  • 0

#8 doman

doman

    Nowicjusz

  • Użytkownik
  • 2 postów
0
Neutralny
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 21:35

 \begin{vmatrix} 2&3&5 \\ 6&-2&3 \\ 8&4&1 \end{vmatrix} = \begin{array}{c} W_2-3W_1 \\ W_3-4W_1 \end{array} =\begin{vmatrix} 2&3&5 \\ 0&-11&-12 \\ 0&-8&-19 \end{vmatrix} = \left| \begin{array}{ccc} 2&3&5 \\ 0&-11&-12 \\ 0&-8&-19 \end{array}\right | = 2(11\cdot 19 - 8\cdot 12) = 226


Powinna wyjść macierz trójką…tna, więc jeszcze w3-(16/11)w2. Dzięki za pomoc ;)
  • 0

#9 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2828 postów
1280
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 21:51

Powinna wyjść macierz trójką…tna, więc jeszcze w3-(16/11)w2. Dzięki za pomoc ;)

 w3 - \frac{8}{11}w2.
  • 0

#10 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 652 postów
225
Pomocnik III
  • Płeć:Mężczyzna

Napisano 13.06.2011 - 23:47

Oto kod w C który miałem napisać na ćwiczenia z C/C++


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

/*
Obliczanie wyznacznika metodą… eliminacji Gaussa
*/

double det(int n,double** a);

int main(){
char ch;
int i,j,n;
double** a;
do{
printf("Podaj n=");
scanf("%d",&n);

a=(double**)malloc((n+1)*sizeof(double));
for(i=1;i<=n;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));

for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("A[%d][%d]=",i,j);
scanf("%lf",&a[i][j]);
}
printf("\n");
}
printf("det(A)=%lf\n",det(n,a));
for(i=1;i<=n;i++)
free(a[i]);
free(a);
ch=getch();
}
while (ch!=27);
return 0;
}

double det(int n,double** a){
int i,j,k,wm;
double p,w=1.0,max;
for (i=1;i<n;i++){
  max=fabs(a[i][i]);
	wm=i;
for(j=i+1;j<=n;j++)
  if(fabs(a[j][i])>max){
	max=fabs(a[j][i]);
	wm=j;
  }
 if(wm>i) {
  for(k=i;k<=n;k++){
	p=a[i][k];
  a[i][k]=a[wm][k];
a[wm][k]=p;
  }
 w*=-1;
 }
 if (a[i][i]==0) w=0;
 if (w!=0)
 for(j=i+1;j<=n;j++){
	p=(double)a[j][i]/a[i][i];
  for(k=n;k>i;k--)
  a[j][k]-=p*a[i][k];
 }
 w*=a[i][i];
 }
 w*=a[n][n];
 return w;
}

Janusz zgadza się że to co potocznie nazywamy dodaniem wiersza etc to
mnożenie przez macierze operacji elementarnych
Zgadza się że wyznacznik jest funkcją…
Wyznacznik można policzyć przy pomocy rozwinięć Laplace,
sumują…c iloczyny po wszystkich permutacjach
Jednak obydwie te metody korzystają… z rekurencji
i niewiele się różnią…
Ty proponujesz także metodę eliminacji Gaussa sprowadzić do rekurencji
chociaż w tej metodzie nie jest ona potrzebna
  • 0

#11 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2828 postów
1280
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 14.06.2011 - 21:24

Oto kod w C który miałem napisać na ćwiczenia z C/C++


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

/*
Obliczanie wyznacznika metodą… eliminacji Gaussa
*/

double det(int n,double** a);

int main(){
char ch;
int i,j,n;
double** a;
do{
printf("Podaj n=");
scanf("%d",&n);

a=(double**)malloc((n+1)*sizeof(double));
for(i=1;i<=n;i++)
a[i]=(double*)malloc((n+1)*sizeof(double));

for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("A[%d][%d]=",i,j);
scanf("%lf",&a[i][j]);
}
printf("\n");
}
printf("det(A)=%lf\n",det(n,a));
for(i=1;i<=n;i++)
free(a[i]);
free(a);
ch=getch();
}
while (ch!=27);
return 0;
}

double det(int n,double** a){
int i,j,k,wm;
double p,w=1.0,max;
for (i=1;i<n;i++){
  max=fabs(a[i][i]);
	wm=i;
for(j=i+1;j<=n;j++)
  if(fabs(a[j][i])>max){
	max=fabs(a[j][i]);
	wm=j;
  }
 if(wm>i) {
  for(k=i;k<=n;k++){
	p=a[i][k];
  a[i][k]=a[wm][k];
a[wm][k]=p;
  }
 w*=-1;
 }
 if (a[i][i]==0) w=0;
 if (w!=0)
 for(j=i+1;j<=n;j++){
	p=(double)a[j][i]/a[i][i];
  for(k=n;k>i;k--)
  a[j][k]-=p*a[i][k];
 }
 w*=a[i][i];
 }
 w*=a[n][n];
 return w;
}

Janusz zgadza się że to co potocznie nazywamy dodaniem wiersza etc to
mnożenie przez macierze operacji elementarnych
Zgadza się że wyznacznik jest funkcją…
Wyznacznik można policzyć przy pomocy rozwinięć Laplace,
sumują…c iloczyny po wszystkich permutacjach
Jednak obydwie te metody korzystają… z rekurencji
i niewiele się różnią…
Ty proponujesz także metodę eliminacji Gaussa sprowadzić do rekurencji
chociaż w tej metodzie nie jest ona potrzebna

Jaka rekurencja?
  • 0

#12 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 652 postów
225
Pomocnik III
  • Płeć:Mężczyzna

Napisano 05.07.2011 - 00:21

Oto lista kroków algorytmu który ty zaproponowałeś


Jeżeli stopień macierzy jest równy jeden to wyznacznik jest równy temu elementowi

w przeciwnym wypadku

1. Wykonuj operacje elementarne na wierszach lub kolumnach
dopóki w kolumnie lub w wierszu będzie więcej niż jeden niezerowy element
2. Zastosuj rozwinięcie Laplace względem "zerowanego" wiersza lub kolumny
3. Wywołaj powyższą… procedurę dla macierzy otrzymanej po zastosowaniu rozwinięcia Laplace

Krok 3 to wywołanie rekurencyjne
  • 0




Partner i sponsor hostingu



sys-com.pl          m-networks.pl