• 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
550 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ź 7,772 wizyt
0 głosów
1 odpowiedź 190 wizyt
0 głosów
2 odpowiedzi 294 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...