macierz odwrotna

0

Siemka mam wielki problem, bo na metody numeryczne muszę przynieść zmodyfikowany program do obliczania macierzy odwrotnej.

Obecny program wygląda tak:

// Program rozwiązuje układ równań liniowych
// metodą eliminacji Gaussa

#include <iostream>
using namespace std;

main()
{
int n;
float a[50][50],x[50], w,s;

  for (int i=0; i<50; i++)
  {
     for (int j=0; j<50; j++)
     a[i][j]=0.0;
     x[i]=0.0;
  }
  

// wczytywanie danych
cout<<"Podaj liczbe zmiennych w ukladzie n=";
cin>>n;
cout<<"Podaj wspolczynniki przy zmiennych:"<<endl;

  for (int i=1; i<=n; i++)
     for (int j=1; j<=n; j++)
     {
        cout<<"  a["<<i<<"]["<<j<<"]=";
        cin>>a[i][j];
     }
     
  cout<<"Podaj wyrazy wolne:"<<endl;
  for (int i=1; i<=n; i++)
  {
     cout<<"  b["<<i<<"]=";
     cin>>a[i][n+1];
  }  
  

// wyeliminowanie i-tej niewiadomej
w=0.0;
for (int i=1; i<=n; i++)
for (int k=i+1; k<=n; k++)
{
w=-a[k][i]/a[i][i];
for (int j=1; j<=n+1; j++)
a[k][j]+=w*a[i][j];
}
// rozwiązanie układu trójkątnego - wstecz
for (int i=n; i>=1; i--)
{
s=0.0;
for (int j=i+1; j<=n; j++)
s+=a[i][j]*x[j];
x[i]=(a[i][n+1]-s)/a[i][i];
}

  cout<<endl;
  cout<<"Zmienne ukladu wynosza:"<<endl;
  for (int i=1; i<=n; i++)
     cout<<"  x["<<i<<"]="<<x[i]<<endl;
  cout<<endl<<endl;
  
  
  system("pause");
  return(0);

}

Jak widzicie pyta się tylko o jedną "kolumnę" wyrazów wolnych
Więc jeśli mamy np macierz 2x2
to program musielibyśmy odpalić dwa razy, pierw podać wyrazy wolne 1,0 za drugim razem 0,1
By wyglądała ona tak: 10
01 w przypadku rozpisania tego na kartce.
Ja mam to zrobić tak by program (już zmodyfikowany na podstawie tego powyżej) sam obliczał "n"razy (w zależności jaka macierz) i obliczał kolejne wyrazy macierzy odwrotnej.

Najgorsze jest to, że muszę mieć taki program na piątek !
Więc została mi dzisiejsza szczątka czasu i jutrzejszy dzień :/
Sam sobie nie mogę dać rady, dlatego zwracam się z prośbą, czy ktoś mógłby ten program zmodyfikować (im mniej/prościej tym lepiej)

0

Ja mam to zrobić tak by program (już zmodyfikowany na podstawie tego powyżej) sam obliczał "n"razy (w zależności jaka macierz) i obliczał kolejne wyrazy macierzy odwrotnej.

@ edit
Tzn: program sam ma przechodzić tyle razy ile podane mam n (czyli rozmiar macierzy)</quote>

0

wymien podawanie wyrazow wolnych na inteligentne wypelnianie zerami i jedynkami..

      cout<<"Podaj wyrazy wolne:"<<endl;
      for (int i=1; i<=n; i++)
      {
         cout<<"  b["<<i<<"]=";
         cin>>a[i][n+1];
      } 

na

      for (int i=1; i<=n; i++)
         for (int j=1; j<=n; j++)
            a[i][n+j] = (i==j);
         

bacz ze program operuje na statycznych tablicach, wiec po takiej zmianie limit ilosci zmiennych spadnie o polowe! (48->24)

0

Działa faktycznie i na pewno pewno się przyda :) dzięki wielkie muszę jeszce wykombinować tak by nie liczył tylko 2 liczb odwróconych macierzy, tylko tyle ile liczb ma wpisana macierz ...
Słaby jestem z C a w C++ dopiero się gubię...
Jeśli ktoś miałby jakieś podpowiedzi bardzo o nie proszę i z góry baaardzo dziękuje.

Pozdrawiam.

0
#include <iostream>
using namespace std;

main()
{
    int n, m;
    float a[50][50]={0,},x[50][50]={0,}, w,s;

    // wczytywanie danych
    cout<<"Podaj liczbe zmiennych w ukladzie n=";
    cin>>n;
    cout<<"Podaj wspolczynniki przy zmiennych:"<<endl;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
        {
           cout<<"  a["<<i<<"]["<<j<<"]=";
           cin>>a[i][j];
        }

    //bez wczytywania wyrazów wolnych wypelnianie zerami i jedynkami
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
            a[i][n+j] = (i==j);

    // wyeliminowanie i-tej niewiadomej
    w=0.0;
    for (int i=1; i<=n; i++)
        for (int k=i+1; k<=n; k++)
        {
            w = -a[k][i]/a[i][i];
            for (int j=1; j<=2*n; j++)
                a[k][j] += w*a[i][j];
        }

    // rozwiązanie układu trójkątnego - wstecz
    for (int i=n; i>=1; i--)
        for(int j=1; j<=n; j++)
        {   s = 0.0;
            for (int k=i+1; k<=n; k++)
                s += a[i][k]*x[k][j];

            x[i][j] = (a[i][n+j]-s)/a[i][i];
        }

    cout<<endl;
    cout<<"Zmienne ukladu wynosza:"<<endl;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
            cout<<"  x["<<i<<"]["<<j<<"]="<<x[i][j]<<endl;
    cout<<endl<<endl;
    system("pause");
    return(0);
}
0

Dzięki wielkie za pomoc, mi też sięudało z rana przerobić program (z pomocą znajomego :) )
Tak to u mnie wygląda:

         // Program rozwiązuje układ równań liniowych
           //        metodą eliminacji Gaussa
           //              przerobiony na
           //        obliczanie macierzy odwrotnej


#include <iostream>
using namespace std;

main()
{
   int n, m;
   float a[25][50],x[25][25], w,s; //dodanie macierzy 2 wymiarowej x a nie ejdno jak bylo wczesniej
   
// wczytywanie danych
      cout<<"Podaj liczbe zmiennych w ukladzie n=";
      cin>>n;
      cout<<"Podaj wspolczynniki przy zmiennych:"<<endl;
      for (int i=1; i<=n; i++)
         for (int j=1; j<=n; j++)
         {
            cout<<"  a["<<i<<"]["<<j<<"]=";
            cin>>a[i][j];
         }
         
  //bez wczytywania wyrazów wolnych
//inteligentne wypelnianie zerami i jedynkami         


for (int i=1; i<=n; i++)
         for (int j=1; j<=n; j++)
         a[i][n+j] = (i==j);
            
 // wyeliminowanie i-tej niewiadomej     
      w=0.0;
 //m=n*2;
      for (int i=1; i<=n; i++)
      {
         for (int k=i+1; k<=2*n; k++)  // zeby eliminacja przechodzila odrazu przez cale macierze 
         {
         w=-a[k][i]/a[i][i];
            for (int j=1; j<=n+1; j++)
               {
               a[k][j]+=w*a[i][j];
               }
         }
      }


////////////////////////////////////////////////////////////      
/*      /// wypisanie macierzy po gaussie 
      cout << endl;
      for (int i=1; i<=n; i++){
         for (int j=1; j<=n*2; j++)
         {
            cout<<a[i][j]<<" ";
         }
         cout<<endl;
         }
         */
 
///////////////////////////////////////////////////////////// 
 
 
 // rozwiązanie układu trójkątnego - wstecz  
   
   for (int k=1;k<=n;k++) // petla ktora przechodzi przezk olejne kolumny macierzy jednostkowej 
   {
       
      for (int i=n; i>=1; i--)
      {
         s=0.0;
         
         for (int j=i+1; j<=n; j++)
         s+=a[i][j]*x[j][k];
         x[i][k]=(a[i][n+k]-s)/a[i][i]; //[k] czyli zapisuje w ktej kolumnie rozwiazanie
                                       // n+k kolejny wiersz jednostykowej macierzy
      }
      
   }
      //wypisywanie macierzy rozwiazan
      cout << endl;
      for (int i=1; i<=n; i++){
         for (int j=1; j<=n; j++)
         {
            cout<<x[i][j]<<" ";
         }
         cout<<endl;
         }
      
      
      system("pause");
      return(0);
}
 

Jeszce raz dziękuję quetzalcoatl za czas i chęci [browar]
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1