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;
}