Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 11. 11. 2010 13:36

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Gaussova eliminační metoda

Hoši, nutně bych potřeboval vědět jak přibližně napsat program, který má vyřešit soustavu lineárních rovnic pomocí matice max 20 řádků na 21 sloupců. Máme za úkol to udělat pomocí pole. Např x [m][n], kde m je počet řádků a n samozřejmě počet sloupců. Jsem začátečník v C, takže  nějak nemůžu vymyslet to, jak naprogramovat aby pod diagonálou byli samý nuly bez opakování určitýho vzorce či cyklu pro každej řádek samostatně a nakonec dosadit výsledek posledniho řádku do rovnic nahoře. Prosím o něčí pomoc :D předem děkuju

Offline

  • (téma jako vyřešené označil(a) renegade1)

#2 11. 11. 2010 13:43

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Gaussova eliminační metoda

http://forum.matweb.cz/viewtopic.php?pid=110623#p110623

Přepsat výpisy, aby to bylo ve stylu c a ne c++ snad zváldneš. Příště zkus hledat než se zeptáš.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#3 11. 11. 2010 13:56

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

↑ renegade1:

Jo..právě že jsem na tohle koukal, ale přepsat bych to asi bohužel neuměl...jsem začátečník v C , zatim jsme C++ vůbec neměli a určitě se to docela liší, tak jestli bys mi nějak nepomohl?

Offline

 

#4 11. 11. 2010 14:22

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Gaussova eliminační metoda

výpis je cout << promenna; tak místo toho dáš printf("%i", promenna); Snaž se trochu když už to máš celé hotové přímo pod nosem.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#5 11. 11. 2010 14:29

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

↑ renegade1:

Věř mi, že kdybych věděl jak, tak to udělam...tak díky za nápovědu, zkusim to.

Offline

 

#6 11. 11. 2010 14:56

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Gaussova eliminační metoda

↑ renegade1:
Hlavně ať tam máš správně datový typ
%i - je integer
%f - flout
....


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#7 11. 11. 2010 18:27

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

↑ gladiator01:

Takhle jsem to nakonec přepsal, ale něco mám špatně a nevím co? + to že nakonec do mainu jsem nedával schválně žadnou určitou matici, nechápu na co je tam ta zadaná..pls poraď....pokud víš, kde mám tu elementární chybu, dej mi vědět ...nechci se furt opakovat ale fakt jsem ještě začátečník v C ..dikes


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 20
#define S 21

void mat(float x[R][S]) {
    int i,j,max = 0;
    float pom;

    for ( i = 0; i < R; i++)
    {
       
        for ( j = i + 1; j < R; j++)
            if (fabs(x[j][i]) > fabs(x[i][i]))
                max = j;
        int k;
        for (k = i; k < S; k++)
        {
            pom = x[i][k];
            x[i][k] = x[max][k];
            x[max][k] = pom;   
        }

        for (j = i + 1; j < R; j++)
            for (k = R; k >= i; k--)
                x[j][k] = x[j][k] - x[i][k] * x[j][i] / x[i][i];
    }
    /* vypis*/
    for (i = 0; i < R; i++)
    {
        for (j = 0; j < S - 1; j++)
        {
            printf("%i", x[i][j]);

            if (j == R - 1)
            {
                printf("%i\n");
            }
        }
    }
}

int main(int argc, char** argv) {
    int i, j, k;
    float X[R][S];
    /* vypis matice */

    printf("matice\n");
    for (i = 0; i < R; i++)
    {
        for (j = 0; j < S - 1; j++)
        {
            printf("%i", X[i][j]);

            if (j == R - 1)
            {
                printf("\n");
            }
        }
    }

    printf("\n");
    mat(X);
    printf("\n");
   
    return (EXIT_SUCCESS);
}

Offline

 

#8 11. 11. 2010 19:24

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: Gaussova eliminační metoda

Hlavne ze ti gladiator01 psala at tam mas spravny datovy typ :-) U tech printf ma byt %f a ne %i, protoze x a X jsou typu float. Take kdyz vymazes tu inicializaci, tak tam budes mit v te matici nejaka nahodna cisla, takze bys tam ji tam mel prozatim vratit (dokud nevyresis nacitani jinak). Muze tam vic chyb, to kdyztak pozdeji.

Co ti tam vlastne konkretne nefunguje? Vypisuje to nejaka divna cisla?

Offline

 

#9 11. 11. 2010 19:33

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

↑ Lumikodlak:

No to jsem si myslel :D..
Ted jsem to teda opravil a přidal tam tu matici v tom mainu..a vypisuje mi to tohle..

5.0000002.0000003.0000002.000000......................
0.0000000.0000000.0000000...........................

určitě mám někde malou chybu ale nevim kde?

Offline

 

#10 11. 11. 2010 19:40

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: Gaussova eliminační metoda

↑ renegade1:
Mozna velikost te matice, ty tam mas

#define R 20
#define S 21

ale v puvodnim zadani byly velikosti 4 a 5, tak se tam nactou ty hodnoty spatne pri te inicializaci (jestli jsi to neupravoval).

Jestli neni problem v tomhle, tak to bude asi slozitejsi uz.

Offline

 

#11 11. 11. 2010 20:02

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

↑ Lumikodlak:

Jasný máš pravdu, vypadáto že to bylo tím...ale ted bych potřeboval vyřešit to, jak to udělat pro jakoukoliv matici 20řádků x 21sloupců ....:(

Offline

 

#12 11. 11. 2010 20:08

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: Gaussova eliminační metoda

↑ renegade1:
To zalezi na tom - jakym zpusobem se ty matice maji zadavat? Normalne ze velikost matice a prvky matice ma napsat uzivatel kdyz se ten program spusti?

Offline

 

#13 11. 11. 2010 21:29

renegade1
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Gaussova eliminační metoda

Offline

 

#14 12. 11. 2010 10:20

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Gaussova eliminační metoda

↑ renegade1:
To je jednoduché. Nadeklaruješ si pole 20x21, potom uživatel na vstupu zadá hodnoty M a N (rozměry matice) a posloupnost hodnot, kterou pomocí for-cyklů načítáš do toho pole. Musíš hlídat, aby hodnoty M, N nebyly větší než 20,21 aby ti pole nepřeteklo.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#15 13. 11. 2010 02:43

Green333
Zelenáč
Příspěvky: 6
Reputace:   
 

Re: Gaussova eliminační metoda

Dělám stejnej příklad a nemůžu dát do kupy kdy má nekonečno řešení a kdy nemá žádný. Potřeboval bych prosím poradit s cyklem, který postupně veme každý řádek a dát podmínku, že když všechny prvky pole v tom řádku jsou rovny nule, tak má nekonečno řešení. A pak ten samý cyklus ale že když každá hodnota v řádku, kromě té poslední, je rovna nule, tak nemá řešení. Zkoušel sem to přes dva for cykly, jeden nacita do poctu řádku a druhý do počtu sloupů, ale to nějak nešlapalo

ukázka výstupu programu pro zadaní matice [(1,1,2),(1,1,2)]- má nekonečno řešení

1.000000 1.000000 2.000000
0.000000 0.000000 0.000000
1.000000 1.000000 2.000000
0.000000 0.000000 0.000000

díky za tipy :)

Offline

 

#16 13. 11. 2010 17:31 — Editoval gladiator01 (13. 11. 2010 17:33)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Gaussova eliminační metoda

↑ Green333:↑ renegade1:
Tady máte pro kontrolu nebo pro inspiraci:


Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 20 
#define S 21 

void PocReseni(float a[R][S], float r[R], int N, int M, int res);

// Gaussova eliminace -------------------------------
void mat(float a[R][S], int N, int M, int res) 
{
    int max = 0,pr=0;
    float pom;
    
  for(int i=0; i<N; i++)              //nalezení pivota
  { 
    max=i;
    for(int j=i+1; j<N; j++)
      if(fabs(a[j][i])>fabs(a[i][i]))
        max=j;
        
    for(int k=i; k<M; k++)         
    {
      pom=a[i][k];
      a[i][k]=a[max][k];
      a[max][k]=pom;
    }
    for(int j=i+1; j<N; j++)
      for(int k=N; k>=i; k--) 
        if(a[i][i]!=0)
          a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
  }
  //---------------------------------------------------------------- 
    //Zpětný chod  - řešení soustavy
    float r[N];
    for(int i=0; i<N; i++)
       r[i]=a[i][res]; 
         
    if(pr==0)
    {
     for(int j=N-1; j>=0; j--)
     {
       pom=0;
       for(int k=j+1; k<=N; k++)  
           pom=pom+a[j][k]*r[k];   
       r[j]=(a[j][N]-pom)/a[j][j];
     } 
   }
   
   PocReseni(a,r, N, M, res);
//---------------------------------------------------------------- 
//---------------------------------------------------------------
}

//Výpis soustavy ---------------------------------------- 
void vypis(float a[R][S],int N, int n, int m) 
{
  //Výpis
  for(int i=0; i<N; i++)
   {//vypisuje prvky, když dojde na konec řadky, odřádkuje
     for(int j=0; j<m; j++)
     {
        printf("%5.3f ", a[i][j]);
        if(j==n-1)
        printf(" | ");
        
        if(j==n)
          printf("\n");
     }
   }  
}
//---------------------------------------------------------------- 

//Počet řešení ---------------------------------------------------
void PocReseni(float a[R][S],float r[R], int N, int M, int res) 
{
  float rP[R]; //Pro testování počtu řešení
  //Osetreni poctu reseni
   for(int i=0; i<N; i++)
       rP[i]=a[i][res]; //vektor pravych stran
 
   int p=0,pr=0;
   for(int j=0; j<res; j++)
   {
       while(p<N)
       {
           if(a[p][j]==0)
           {
             if(rP[p]==0) //má nekonečně mnoho řešení
               pr=1;
             else if(rP[p]!=0) //nemá žádné řešení
               pr=2;
             
             break;
           }
           else 
           {
             pr=0; //má jedno řešení
             p++; 
           } 
       }
       
   }

   
    //Reseni--------
    printf("\n");
    if(pr==1)
      printf("\n!!!Soustava ma nekonecne mnoho reseni!!!\n\n");
    else if(pr==2)
      printf("\n!!!Soustava nema reseni!!!\n\n"); //např. pokud je více rovnic než proměnných a žádná nejpřejde na nulový řádek
    else if(pr==0)                                     // vyjde tedy 0=něco
    {
      printf("\n!!!Soustava ma jedno reseni!!!\n\n");
      printf("\nVektor reseni:\n");
      for (int i = 0; i < N; i++)
      { 
         printf("%5.3f ", r[i]);
      }
      printf("\n");
    }
}

//---------------------------------------------------------------- 
//---------------------------------------------------------------- 

int main(int argc, char** argv) {
    int i, j, k,M,N, res, n, m;
   float X[R][S];

   //Nacitani cisel-------------------------------------------------
   int cisla=0;
   printf("Zadej pocet radku a sloupcu (max 20x21)\n ----------------------------------\n");
   printf("Pokud je vektor pravych stran nulovy zadejte nuly (pokud ho nezadate dostanete\nspatny vysledek) : ");
   while(N>20 || M>21) 
   {
     scanf("%i %i",&N,&M); 
     if(N<=20 && M<=21) break;
     printf("pocet radku a sloupku musi byt < 20 a 21, Zadejte pocet radku a sloupku: \n");
   }
   
   printf("Zadavej hodnoty matice (po radcich): \n");
   for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
             scanf("%i", &cisla);
             X[i][j]=cisla;
             if(M==N) 
               X[i][M+1]=0;
        }
    }
    //-----------------------------------------------------------------------
    // Pokud je matice ctvercova - rovnice navic
    if(M==N) 
    { 
      M++; 
      res=M-2;   
      n=N-1;
      m=M-1;
    }
    else
    {
      res=M;
      n=N;
      m=M;
    }
   //------------------------------------------------------------------------
    printf("\n Matice A:\n");
    vypis(X,N, n,m); 
    
    printf("\n");
    mat(X, N, M, res); // Volání fce, která provádí eliminace
    printf("\n");
    
    printf("\n Matice GEA(A):\n");
    vypis(X,N, n,m); 
    
    system("pause");
    return (0); 
}


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson