wyznacznik - C
- qaz
- 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
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
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
wyznacznik - C
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
- Emiel Regis
- 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
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;
}