wyznacznik - C

Awatar użytkownika
qaz
Użytkownik
Użytkownik
Posty: 486
Rejestracja: 28 paź 2006, o 21:56
Płeć: Kobieta
Lokalizacja: Gobbos' Kingdom
Podziękował: 311 razy
Pomógł: 5 razy

wyznacznik - C

Post autor: qaz »

Witam, muszę napisac program w C liczący wyznacznik macierzy stopnia 2, 3, 4 ale koniecznie z rozwinięcia Laplace'a. Nie proszę o cały program, ale tylko o podpowiedz np. czesc kodu programu dla oblicznia wyznacznika 2x2. Jeśli to będę miec to mysle ze sobie poradze :) I najlepiej w jak najprostszy sposób... Dziekuję za pomoc :)
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

wyznacznik - C

Post autor: Undre »

qaz pisze:ale koniecznie z rozwinięcia Laplace'a


to chyba to, niemniej algorytm jest imo masakra, macierz 20x20 rozklada problem wyznacznika na tyle macierzy 3x3 ze musialbym pewnie pomyslec o dokupieniu ramu :mrgreen:
Awatar użytkownika
qaz
Użytkownik
Użytkownik
Posty: 486
Rejestracja: 28 paź 2006, o 21:56
Płeć: Kobieta
Lokalizacja: Gobbos' Kingdom
Podziękował: 311 razy
Pomógł: 5 razy

wyznacznik - C

Post autor: qaz »

za skomplikowany, musze sie obejsc bez malloc, bo tego jeszcze na zajęciach nie mieliśmy, ale dziekuję
Awatar użytkownika
Emiel Regis
Użytkownik
Użytkownik
Posty: 1495
Rejestracja: 26 wrz 2005, o 17:01
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 71 razy
Pomógł: 225 razy

wyznacznik - C

Post autor: Emiel Regis »

Kod: Zaznacz cały

//Program oblicza wartość wyznacznika

int n;

void wprowadz (int n, double tab[n][n]);
void wypisz (int n, double tab[n][n]);
double wyznacznik(int n, double m1[n][n]);
void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1]);
int potega(int k1);

main()
{
printf("Podaj wymiar wyznacznika
");
scanf("%d",&n);      

double a[n][n];
double b[n][n];

if (n>0)
   {
   wprowadz(n, a);      
   wypisz(n, a); 
  printf("Wartosc wyznacznika wynosi: %lf
",wyznacznik(n, a));
   }
else
    {
    printf("Wymiar wyznacznika musi być > 0 !!!
");
    }
      
system("PAUSE");      
}


//Funkcja do wprowadzenia elementów macierzy
void wprowadz (int n, double tab[n][n])
{
     printf("Wprowadzanie wyrazow macierzy
");
     int i,j;
     for (i=0; i<n; i++)
     {
         for (j=0; j<n; j++)
         {
             printf("Wprowadz wyraz %d, %d: ",i+1,j+1);
             scanf("%lf",&tab[i][j]);
         }
     }     
}

//Funkcja wypisująca macierz
void wypisz (int n, double tab[n][n])
{
     printf("
");
     int i,j;
     for (i=0; i<n; i++)
     { for (j=0; j<n; j++) 
       {
       printf("%lf ", tab[i][j]);
       }
       printf("
");
       }
}

//Funkcja obliczająca wartość wyznacznika
double wyznacznik(int n, double m1[n][n])
{
 int k1; //kolumna względem której rozwijamy
 double m2[n-1][n-1]; //macierz na minor 
 double det=0; //wartość wyznacznika
       
       if (n==1) return m1[0][0]; //jeżeli stopień wyznacznika =1 to det|a| = a (a to liczba)
       else
       {
           for (k1=0; k1<n; k1++)
           {
               minor(k1, n, m1, m2); //obliczenie minoru m2 aby przekazać poniżej do funkcji wyznacznik
               det = det + potega(k1) * m1[0][k1] * wyznacznik(n-1,m2); //wzór Laplasa 
           }
       }
return det;
}


//Funkcja obliczająca minor z macierzy
void minor(int k1, int n, double m1[n][n], double m2[n-1][n-1])
{
int u,v;
    for(v=0; v<n-1; v++)
         {
             for(u=0; u<k1; u++)
                 {
                 m2[v][u] = m1[v+1][u];
                 }
             for(u=k1+1; u<n; u++)
                 {
                 m2[v][u-1] = m1[v+1][u];        
                 }
         }
}

//Funkcja obliczająca potęgę (-1)^(i+j)
int potega(int k1)
{
if ((k1%2)==1) return -1;
else return 1;

}

Nie jest to program pisany przeze mnie (mój byłby w C++) natomiast z tego co sprawdzałem to wygląda że działa poprawnie.
Awatar użytkownika
qaz
Użytkownik
Użytkownik
Posty: 486
Rejestracja: 28 paź 2006, o 21:56
Płeć: Kobieta
Lokalizacja: Gobbos' Kingdom
Podziękował: 311 razy
Pomógł: 5 razy

wyznacznik - C

Post autor: qaz »

thx
ODPOWIEDZ