|
TwojePC.pl © 2001 - 2025
|
 |
A R C H I W A L N A W I A D O M O Ś Ć |
 |
| |
|
[c++] Metoda Eliminacji Gauss'a według wzoru algorytmu z książki (załączony) - problem , Soulburner 21/08/08 13:56 Witam!
Muszę opanować rozwiązywanie układów równań metodą eliminacji Gauss'a. Posiadam wzór algorytmu z pewnej książki "Metody numeryczne" - niestety, więcej nic o niej nie wiem, bo mam tylko ksero kilku stron ;)
Idąc krok po kroku i spoglądając w program znajomego (który zapewne został żywcem ściągnięty z netu :P Prawdopodobnie stąd http://www.i-lo.tarnow.pl/...lg/zmzf/pages/006.php ), udało sprowadzić się macierz do postaci trójkątnej.
Problem zaczyna się jednak podczas próby obliczenia rozwiązania, czyli "iksów".
Najpierw może pokażę co siedzi w książce:
http://img507.imageshack.us/...?image=gaussjb7.jpg
A teraz czas na kod, który na tej podstawie wymęczyłem (siedzi w nim pełno głupawych cout'ów, które pomocne były przy sprawdzeniu, w której pętli się program wywalał):
http://daath.x.pl/kodzik.cpp
Bardzo proszę o wykazanie błędu i sugestie poprawienia. Gotowe fragmenty kodu też mile widziane, byle z komentarzem ;)You must gather your party before
venturing forth. - A gdzie masz wyliczenie xn? , JOTEM 21/08/08 18:31
reszta się wylicza iteracyjnie z pierwszego x-a, a ten pierwszy jest w postaci:
//x[n]=
w Twoim programiku.
Pzdr.Poryjemy..zrobaczymy - ok, ale w książce , Soulburner 21/08/08 21:32
fragment dotyczący xn jest podany "luzem", nie w pętli. Zamiana //x[n]= na
x[n]= tabA[n][n+1] / tabA[n][n];
nie pomaga w obliczeniach - iksy wciąż wychodzą zerowe :/You must gather your party before
venturing forth. - No pewnie ze luzem , JOTEM 22/08/08 00:05
i tak ma być - to rekurencyjne liczenie poza pierwszym elementem - ten jest wyliczany jawnie i poza pętlą.
Można włączyć do pętli, ale trzeba indeksy odpowiednio rozszerzyć.
Poza tym, Twoja książka ma błąd i Twój kod ma inne jeszcze błędy. Analizuję ten starszy kod:
- brak wyliczeń pierwszego wyrazu (xn)
- błąd w książce w pętli
jest for (p=i+1; p<=1; p++)
powinno być for (p=i+1; p<=n-1; p++)
- zastanów się, czy pętle mają być od i=1 do n czy od i=0 do n-1
bo jesteś niekonsekwentny (w książce masz np od 1 do n-1, a Ty używasz od 0 do n-1 - jeden obieg za dużo).
To tyle - popraw, to zadziała.Poryjemy..zrobaczymy
- ok, coś tam wymodziłem i nawet działa, tylko , Soulburner 21/08/08 23:06
wyniki zaokrągla do liczb całkowitych, podczas gdy liczenie na piechotę daje np.
x3 = 2,8
zaś program wyświetla x3 = 3
Tutaj zmodyfikowany kod programu: http://daath.x.pl/kodzik2.cpp
Ciekawostka - mityczny //x[n]= okazał się zbędny, bo... czy linijka:
x[n-1] = tabA[n-1][n] / tabA[n-1][n-1]; //jak widać, trochę inna niż w poście wyżej
jest, czy jej nie ma, wyniki wszystkie są :PYou must gather your party before
venturing forth. - Tak mniej więcej , JOTEM 22/08/08 00:30
krytyczny fragment po poprawnym przeindeksowaniu z książki z indeksowanie pascalowym (1..n) do indeksowania c++(0..n-1):
x[n-1] = (tabA[n-1][n] - w) / tabA[n-1][n-1];
for (i=n-2; i>=0; i--)
{
double w=0;
for (p=i+1; p<n; p++)
{
w = w + tabA[i][p] * x[p];
}
x[i] = (tabA[i][n] - w) / tabA[i][i];
}Poryjemy..zrobaczymy - nie usunałem w z x(n-1) , JOTEM 22/08/08 00:32
x[n-1] = tabA[n-1][n] / tabA[n-1][n-1];Poryjemy..zrobaczymy
|
|
|
|
 |
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL |
 |
|
|
|