Skocz do zawartości


Zdjęcie

Wyznacznik macierzy za pomocą eliminacji gaussa


Ten temat został zarchiwizowany. Nie można odpowiadać w tym temacie.
11 odpowiedzi w tym temacie

#1 doman

doman

    Nowicjusz

  • Użytkownik
  • 2 postów
0
Neutralny

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ć?

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

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..
Dołączona grafika

#3 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2573 postów
1126
Starszy Wykładowca I

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

#4 Mariusz M

Mariusz M

    Operator całkujący

  • Użytkownik
  • Redaktor
  • 574 postów
192
Pomocnik II

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

#5 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2573 postów
1126
Starszy Wykładowca I

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ń.

#6 Mariusz M

Mariusz M

    Operator całkujący

  • Użytkownik
  • Redaktor
  • 574 postów
192
Pomocnik II

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

#7 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2573 postów
1126
Starszy Wykładowca I

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.

#8 doman

doman

    Nowicjusz

  • Użytkownik
  • 2 postów
0
Neutralny

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 ;)

#9 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2573 postów
1126
Starszy Wykładowca I

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.

#10 Mariusz M

Mariusz M

    Operator całkujący

  • Użytkownik
  • Redaktor
  • 574 postów
192
Pomocnik II

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

#11 janusz

janusz

    Wielki Analityk

  • +Mods
  • 2573 postów
1126
Starszy Wykładowca I

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?

#12 Mariusz M

Mariusz M

    Operator całkujący

  • Użytkownik
  • Redaktor
  • 574 postów
192
Pomocnik II

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






Partnerem technologicznym jest dhosting.pl      Współpracują z nami     PortalMatematyczny.pl