Strona 1 z 1

[C] Macierz schodkowa

: 15 cze 2013, o 19:15
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;
}

[C] Macierz schodkowa

: 15 cze 2013, o 20:09
autor: konrad509
Może problemem jest to, że funkcja schod nic nie zwraca

[C] Macierz schodkowa

: 15 cze 2013, o 20:53
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.

[C] Macierz schodkowa

: 15 cze 2013, o 21:22
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

[C] Macierz schodkowa

: 15 cze 2013, o 22:02
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]}\) .

[C] Macierz schodkowa

: 15 cze 2013, o 22:58
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ć

[C] Macierz schodkowa

: 15 cze 2013, o 23:23
autor: marcinz
Zaimplementuj eliminację Gaussa. Pamiętaj, żeby zamieniać wiersze jeśli jest zero tam gdzie chciałbyś dzielić.

[C] Macierz schodkowa

: 16 cze 2013, o 13:43
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;
}

[C] Macierz schodkowa

: 16 cze 2013, o 14:13
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.

[C] Macierz schodkowa

: 16 cze 2013, o 14:44
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ć...

[C] Macierz schodkowa

: 16 cze 2013, o 15:54
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ę

[C] Macierz schodkowa

: 16 cze 2013, o 18:29
autor: rydzyk00
Ma powstać macierz schodkowa. Pierwszy wiersz i tak nie zostałby zmieniony, zawsze pozostaje taki sam.

... k%C4%85tna

[C] Macierz schodkowa

: 16 cze 2013, o 18:34
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.

[C] Macierz schodkowa

: 17 cze 2013, o 20:21
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;
}