• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obliczanie Wzynacznika macierzy stopnia n

VPS Starter Arubacloud
0 głosów
645 wizyt
pytanie zadane 17 kwietnia 2020 w C i C++ przez PirchHD Obywatel (1,730 p.)

Ogólnie dostaliśmy takie zadanie(Dokładnie obliczenie rozwiązań tego układu równań ) z studiów. Ogólnie zrobiłem super podawanie danych od użytkownika ale teraz mam problem taki że chce zrobić pomocnicza tablice które będzie zapisała coś w stylu:

Orginalna Macierz:                   pomocnicza macierz:

1  2                                         1   2

3  5                                         3   5

                                               1   2

I pózniej bym mógł łatwo obliczyć wyznacznik tej macierzy tylko niestety głowie się który dzień jak zapisać to dla n przypadków.

Na razie mam coś takiego:

     int TabPom[n][n + (n-1)];
       for(int i = 1; i <= n + (n-1);i++){
           for (int j = 1; j <= n; j++){
                TabPom[j][i] = tab[j][i];
           }
       }

Proszę o pomoc i dziekuję

komentarz 17 kwietnia 2020 przez TOM_CPP Pasjonat (22,640 p.)
Najlepiej będzie jak podasz treść zadania, bo z tego co powiedziałeś nie wiele można zrozumieć. Swoją drogą wyznacznik można obliczyć tylko dla macierzy kwadratowych. Przydałby się też całość kodu wraz z definicją zmiennych.
komentarz 17 kwietnia 2020 przez PirchHD Obywatel (1,730 p.)
Jasne już wysyłam

2 odpowiedzi

0 głosów
odpowiedź 17 kwietnia 2020 przez PirchHD Obywatel (1,730 p.)

O to cały kod:

#include <iostream>

using namespace std;

int main()
{
    cout << "Prochal Szymon- Rozwiazywanie uklad rownan liniowych NxN" << endl;
    int n=0; // ile rzad
    cout << "Podaj ilosc n (n-rz¹d i kolumny rownania): "; cin >> n;
    int m=n; // ile kolumn
    int tabA[n+1][m+1];

    // WYRAZY Z MACIERZY A
    cout << "Podaj wyrazy Macierzy A:" << endl;
    for(int i=1; i <= n; i++){
        for(int x=1; x <= m; x++){
            cout<< "Podaj A[" << i << "][" << x << "] :"; cin >> tabA[i][x];
        }
    }


    system("CLS");

    //WYPISZ WYRAZY DLA MACIESZY B TAK ZWANE WYRAZY WOLNE
    cout << "Podaj wyrazy Macierzy B - kolumna wyrazow wolnych" << endl;
    int tabB[n];
    for(int i = 0; i <= n;i++){
            cout<<"Podaj B[" << i << "][0]: "; cin >> tabB[i];
    }


    // WYPISUJE MACIERZ A
    cout << "Twoja Macierz A: "<< endl;
    for(int i = 1; i <=n; i++){
            for(int x=1;x <= m; x++){
                cout << tabA[i][x];
                cout << " ";
            }
        cout << endl;
    }

    // Liczymy det A
    /* int TabPom[n][n + (n-1)];
       for(int i = 1; i <= n + (n-1);i++){
           for (int j = 1; j <= n; j++){
               int x = i, y = j;
                if(j == n+1){
                    j = 1;
                    i = 1;
                }
                TabPom[x][y] = tabA[x][y];
           }
       } */

    //Wypisuje Macierz B
    cout << "Twoja macierz B: " << endl;
    for(int i = 0; i <=n;i++){
        cout << tabB[i] << endl;
    }



    return 0;
}

 

A tutaj treść zadania:

Proszę napisać program rozwiązujący układ równań liniowych A x = B stopnia n. Dane do programu powinny być podane w następującej postaci: rząd równania, n, kolejne wiersze macierzy współczynników, A, a następnie kolumna wyrazów wolnych, B.

W opisie zadania znajdują się pliki pdf z opisem metody.
 

0 głosów
odpowiedź 17 kwietnia 2020 przez TOM_CPP Pasjonat (22,640 p.)

Przed Tobą jeszcze daleka droga:

Po pierwsze źle wczytujesz wektor wyrazów wolnych B - powinien mieć o jeden mniej element. Numerujesz tutaj od zera co zwiększa liczbę elementów o jeden.

Teraz zakładam, że rozwiązujesz to metodą Cramera.

Przede wszystkim musisz napisać funkcję która będzie obliczała wyznacznik dla dowolnej macierzy kwadratowej stopnia n np:

double calculateDet( const vector<vector<double>>& matrix )
{
    double det {0.0};

    if( matrix.size() == 1 ) return  matrix[0][0];
    if( matrix.size() == 2 ) return (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);
    if( matrix.size() == 3 ) return (matrix[0][0]*(matrix[1][1]*matrix[2][2] - matrix[1][2]*matrix[2][1])
                                     - matrix[1][0]*(matrix[0][1]*matrix[2][2] - matrix[1][2]*matrix[2][0])
                                     + matrix[2][0]*(matrix[0][1]*matrix[2][1] - matrix[1][1]*matrix[2][0]) );


    // LE decomposition algorithm
    const double eps = 1e-12;

    vector<vector<double>> mirrorMatrix {matrix};

    for( size_t k = 0 ; k < matrix.size() - 1 ; ++k )
    {
        if( abs(mirrorMatrix[k][k])<eps ) return 0; 
        for( size_t i = k + 1 ; i < matrix.size() ; ++i ) mirrorMatrix[i][k] /= mirrorMatrix[k][k];
        for( size_t i = k + 1 ; i < matrix.size() ; ++i )
        {
            for( size_t j = k + 1 ; j < matrix.size() ; ++j ) mirrorMatrix[i][j] -= mirrorMatrix[i][k] * mirrorMatrix[k][j];
        }
    }

    double result {0.0};
    for( size_t index=0 ; index<matrix.size() ; ++index ) result += matrix[index][index];

    return result;
}

Do przechowywania danych macierzy użyłem kontenera STL vector, gdyż użycie zwykłych tablic nie jest zalecane z wielu powodów zobacz

Następnie musisz podmienić każdą kolumnę macierzy współczynników A wektorem wyrazów wolnych B Zobacz. Zrobić to można używając funkcji getMatrix

vector<vector<double>> getMatrix( const vector<vector<double>>& A , const vector<double>& B , int column )
{
    vector<vector<double>> newMatrix;
    // Twoja implementacja
    return newMatrix;
}

I teraz wystarczy już obliczyć wyznaczniki tak otrzymanych macierzy i podzielić je przez wyznacznik macierzy współczynników.

Podobne pytania

0 głosów
1 odpowiedź 8,010 wizyt
0 głosów
1 odpowiedź 282 wizyt
0 głosów
2 odpowiedzi 342 wizyt

93,025 zapytań

141,990 odpowiedzi

321,292 komentarzy

62,371 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...