[C] Macierz schodkowa

rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Napisałem naiwny program do tworzenia macierzy schodkowej. Wiem, że się wyłoży na dzieleniu przez 0, ale nie rozumiem czemu nie tworzy w innych przypadkach. Pokazuje błąd dzielenia przez 0, ale nie wiem dokładnie z jakiego powodu.



Oto ten kod:

Kod: Zaznacz cały

#include <stdio.h>

double schod(double m[3][3], int n)
{
    int i,j,k;
    for (j=0; j<n; j++)
        for(i=1; i<n; i++)
            for(k=j; k<n; k++)
            {
                m[i][k] = m[i][k]-(m[i][j]/m[j][j])*m[j][k];
            }
}

int main()
{
    double m[3][3]= {{1.0,3.0,2.0},{4.0,5.0,6.0},{7.0,8.0,9.0}};
    int i,j;
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
            printf("%3.0f", m[i][j]);
        printf("
");
    }
    schod(m, 3);
    printf("

");
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
            printf("%15f", m[i][j]);
        printf("
");
    }
    return 0;
}
konrad509
Użytkownik
Użytkownik
Posty: 1841
Rejestracja: 5 mar 2012, o 14:08
Płeć: Mężczyzna
Lokalizacja: Polska :D
Podziękował: 6 razy
Pomógł: 323 razy

[C] Macierz schodkowa

Post autor: konrad509 »

Może problemem jest to, że funkcja schod nic nie zwraca
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C] Macierz schodkowa

Post autor: marcinz »

Ale akurat w tym przykładzie jest problem ze względu na to, że dzielisz przez \(\displaystyle{ 0}\). Wypisz sobie za każdym razem \(\displaystyle{ m[j][j]}\) na ekran, to w pewnym momencie to zobaczysz.
rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Specjalnie rozwiązałem na kartce i nie powinno tu się znaleźć dzielenie przez \(\displaystyle{ 0}\).. A algorytm i iteracje są wg mnie w porządku
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C] Macierz schodkowa

Post autor: marcinz »

Nie rozpisuj na kartce, tylko wykonaj program, bo może błąd jest tam gdzie wydaje ci się, że robisz coś innego. Popatrz na wyjście, dopisałem wypisywanie \(\displaystyle{ m[j][j]}\) .
rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Po pierwsze, zauważyłem że za mało o \(\displaystyle{ 1}\) się wykonuje pętla z \(\displaystyle{ i}\), co poprawiłe oraz że błąd pojawia się kiedy\(\displaystyle{ j=2}\), ale nadal nie za bardzo wiem jak to wyeliminować
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C] Macierz schodkowa

Post autor: marcinz »

Zaimplementuj eliminację Gaussa. Pamiętaj, żeby zamieniać wiersze jeśli jest zero tam gdzie chciałbyś dzielić.
rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Zmieniłem trochę pętle i zeruje to co trzeba, ale resztę niestety zostawia bez zmian :/

Kod: Zaznacz cały

#include <stdio.h>

double* schod(double m[3][3], int n)
{
    int i,j,k;
    for (j=0; j<n; j++)
        for(i=j+1; i<n; i++)
            for(k=j; k<n; k++)
                m[i][k] = m[i][k]-(m[i][j]/m[j][j])*m[j][k];
    return m;
}

int main()
{
    double m[3][3]= {{1.0,3.0,2.0},{4.0,5.0,6.0},{7.0,8.0,9.0}};
    int i,j;
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
            printf("%3.0f", m[i][j]);
        printf("
");
    }
    schod(m, 3);
    printf("

");
    for (i=0; i<3; i++)
    {
        for (j=0; j<3; j++)
            printf("%15.5f", m[i][j]);
        printf("
");
    }
    return 0;
}
konrad509
Użytkownik
Użytkownik
Posty: 1841
Rejestracja: 5 mar 2012, o 14:08
Płeć: Mężczyzna
Lokalizacja: Polska :D
Podziękował: 6 razy
Pomógł: 323 razy

[C] Macierz schodkowa

Post autor: konrad509 »

A z jakiego sposobu wyznaczania macierzy schodkowej tu korzystasz? To tak bardziej z ciekawości się pytam, bo tak średnio się orientuję w macierzach i słyszałem tylko o eliminacji Gaussa. A po poście kolegi marcinz wnioskuję, że użyłeś innej metody.
rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Tak, korzystam z eliminacji Gaussa, najpierw sprowadzam do macierzy trójkątnej a potem przemnażam, tylko na razie zatrzymałem się na gaussie bo coś nie chce działać...
konrad509
Użytkownik
Użytkownik
Posty: 1841
Rejestracja: 5 mar 2012, o 14:08
Płeć: Mężczyzna
Lokalizacja: Polska :D
Podziękował: 6 razy
Pomógł: 323 razy

[C] Macierz schodkowa

Post autor: konrad509 »

Te elementy tablicy, które zostają takie same, nie zmieniają się dlatego, że ich nowa wartość nigdy nie jest liczona. Weź np. m[0][0]. Dla tego elementu nigdy nie będzie liczona nowa wartość, bo zmienna "i" w funkcji nigdy nie będzie równa 0. Ale jak to poprawić, żeby działało to nie wiem. Właściwie to ledwo rozumiem tą funkcję
rydzyk00
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 31 mar 2012, o 22:45
Płeć: Mężczyzna
Lokalizacja: Milanówek
Podziękował: 1 raz

[C] Macierz schodkowa

Post autor: rydzyk00 »

Ma powstać macierz schodkowa. Pierwszy wiersz i tak nie zostałby zmieniony, zawsze pozostaje taki sam.

... k%C4%85tna
konrad509
Użytkownik
Użytkownik
Posty: 1841
Rejestracja: 5 mar 2012, o 14:08
Płeć: Mężczyzna
Lokalizacja: Polska :D
Podziękował: 6 razy
Pomógł: 323 razy

[C] Macierz schodkowa

Post autor: konrad509 »

Tak, wiem, że ma powstać macierz schodkowa.
Faktycznie pierwszy zostaje taki sam więc to nie ma znaczenia. Ale to weź teraz element m[2][2] czyli ten w prawym dolnym rogu. On już może się zmienić, więc powinien być liczony, a nie jest. Chyba, że znowu coś pokręciłem.
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C] Macierz schodkowa

Post autor: marcinz »

Chyba znalazłem usterkę. Zapamiętuję współczynnik, przez który mnożysz.

Kod: Zaznacz cały

double* schod(double m[3][3], int n)
{
    int i,j,k;
    float x;
    for (j=0; j<n; j++)
        {
       
        for(i=j+1; i<n; i++)
            {
             x=m[i][j]/m[j][j];        
            for(k=j; k<n; k++)
                m[i][k] = m[i][k]-x*m[j][k];
            }
        }        
    return m;
}
ODPOWIEDZ