macierze
Bartek: Znacie może jakiś zbiór zadań pdf, w którym były by układy równań z trzema lub czterema
niewiadomymi? Przy czym chodzi mi o metodę rozwiązywania w postaci macierzy.
12 paź 14:35
Bartek: Słuchajcie, chciałem głębiej przetrenować rozwiązywanie układów równań liniowych z niewiadomymi
przy pomocy macierzy, ale kłopot w tym, że internet jest pusty. W googlach nic nie ma, a w
skoczylasie są za dania nie na temat. Pomocy...
12 paź 15:08
Trivial: Możesz sobie sam wymyślać układy, a odpowiedzi sprawdzać na wolframie
12 paź 16:29
Bartek: Właśnie zacząłem sobie wymyślać sam przykłady, ale raz sobie taki wymyśliłem, że już łatwiej mi
było go wyznacznikami policzyć. Sęk jednak w tym, że wyznacznikami liczy się tylko układy
kwadratowe, a nie prostokątne. Chodzi o to, że nie łatwo jest wymyślić taki sprytny układ,
dzięki którem otrzymam układ schodkowy z samymi zerami i jedynkami − a mnie właśnie takie
przykłady są potrzebne.
A no właśnie
12 paź 17:31
Trivial:
Jak wymyślić "ładny" układ? Zacznij od rozwiązania. Niech będzie "ładne", np.:
Teraz pomnóż x przez dowolną "ładną macierz" (taką o współczynnikach całkowitych). Przykładowo:
I możesz sobie rozwiązywać.

Prostokątne zrobisz tak samo. Wymyśl ładne x, np.:
x = [ 1 0 −1 ]
T
Pomnóż przez macierz, np.:
I znów możesz sobie rozwiązywać.
12 paź 18:33
Bartek: Sory Trivial, ale nie za bardzo za tobą nadążam. Przecież w przykładach, które sobie zarzucam
współczynniki są całkowite. To jednak nie wiele zmienia, bo gdy je rozwiązuję, to przychodzi
taka sytuacja, że zupełnie nie wiem do czego zmierzam.
Możę będzie prościej jeśli cię zapytam czy mógłbyś mi wytłumaczyć samą filozofię sprowadzania
macierzy do układu schodkowego zredukowanego. Ogólnie wiem co to jest oraz wiem po co to jest.
Znam też metodę tzn. odejmowanie lub dodawanie wierszy w macierzy, ale i tak mam wrażenie, że
tak do końca tego nie rozumiem.
12 paź 21:11
Trivial:
Sprowadzanie macierzy do postaci zredukowanej to metoda obliczeniowa pozwalająca zapisać układ
równań w takiej postaci, że jego rozwiązanie jest trywialne. Jak chcesz mogę dać przykład:
Znajdź wszystkie wektory x = [ x
1 x
2 x
3 x
4 ]
T, takie że:
12 paź 21:20
Bartek: Okej, to wyszło mi coś takiego, ale dalej nie wiem co z tym zrobić:
Zastosowałem: W2 − W1.
12 paź 21:31
Trivial:
Redukuj dalej. Czy da się ocalić jakoś drugą kolumnę przez zamianę wierszy? Nie. Zatem kolumna
druga jest traktowana jako kolumna wolna (x
2 będzie parametrem w rozwiązaniu). Przechodzimy
do kolumny trzeciej. Redukujemy do góry:
Jeżeli się skupisz, to zobaczysz tutaj macierz jednostkową w kolumnach 1,3.
Zapisując nasze równania mamy:
x
1 + 2x
2 + 2x
4 = 3
x
3 − x
4 = 1
Zatem wystarczy wybrać x
2,x
4 jako parametry i mamy że:
x
1 = 3 − 2c
1 − 2c
2
x
3 = 1 + c
2
Czyli rozwiązanie ogólne wygląda tak:
x = [ 3 − 2c
1 − 2c
2 c
1 1 + c
2 c
2 ]
T =
= [ 3 0 1 0]
T + c
1*[−2 1 0 0]
T + c
2*[−2 0 1 1]
T
Zauważ, że wszystkie te informacje można odczytać wprost z macierzy zredukowanej:
x = [
3 0
1 0]
T + c
1*[
−2 1
0 0]
T + c
2*[
−2 0
1 1]
T
12 paź 21:46
Trivial:
No to teraz trudniejszy przykład, ale od razu zredukowany:
1 2 0 1 −1 0 | −1
0 3 1 3 1 0 | 0
0 1 0 2 0 1 | 1
Jakie wektory x spełniają ten układ równań?
12 paź 21:53
Bartek: Jeju, Trivial, dzięki wielkie. Czyli wnioskuję, że mój problem (mam wrażenie) polega na tym, że
jeszcze nie za bardzo załapałem sam mechanizm redukcji takiej macierzy.
Chodzi mi po prostu o to, że strasznie się jeszcze motam, gdy usiłuję dostrzec jak uzyskać owe
jedynki bez niszczenia zer. Bo mój kłopot polega na tym, że owszem uzyskuję w danym miejscu
jedynkę lub minus jedynkę, ale w tym samym wierszu np. 0 zamienia mi się na niezero. I tak mam
z tymi układami cały czas.
Właśnie usiłuję rozwiązać przykład z wikipedi. Tak na marginesie
12 paź 21:55
Bartek: Trivial poczekaj, ja nie myślę tak szybko. Moment, bo po napisaniu tutaj posta, zajrzałem do
wiki żeby rozwiązać inny przykład. Daj mi chwilę. Rozwiążę tamten, potem przeanalizuję jeszcze
raz ten twój i dopiero, Okej? dziękować.
12 paź 21:58
Trivial:
Ściślej mówiąc, to mój układ nie jest do końca "zredukowany", ale jego rozwiązanie można
zapisać od razu (nic nie trzeba już zmieniać). Może nie będę już kombinować, tylko dam dobrze
"zredukowany" przykład:
1 2 0 1 −1 0 | −1
0 0 1 3 1 0 | 0
0 0 0 0 0 1 | 1
12 paź 22:07
Bartek: Trivial, pytanie ogólne: Czy poprzez "ocalenie" którejkolwiek kolumny masz na myśli uzyskanie w
niej jedynki oraz samych zer? Żeby było prościej, proszę o odpowiedź: tak lub nie.
12 paź 22:17
Trivial: tak.
12 paź 22:20
Bartek: Aha, czyli kolumna z zerami i jedynkami to kolumna jednostkowa a kolumny wolne to kolumny z
parametrami?
A co jeśli mam kolumnę z jedynką i np. trójką i nie da się trójki zredukować do zera? Bo np.
wtedy rozwalam zera w kolumnie sąsiedniej? Bo z tym problemem właśnie zetknąłem się dzisiaj
najczęściej.
Po prostu takie bałagany mi wychodziły, że załamać się można.
12 paź 22:24
Bartek: Okej, może dam przykład:
x + 3y +2z = 4
2x + 4y + 5z =3
5x + 10y +7z = 6

?
12 paź 22:26
Trivial: Mam gdzieś program do redukcji macierzy. Zaraz wygrzebię.
12 paź 22:32
Trivial:
1 3 2 4
2 4 5 3
5 10 7 6
w2 := w2 − (2)*w1
w3 := w3 − (5)*w1
1 3 2 4
0 −2 1 −5
0 −5 −3 −14
w2 := w2/(−2)
1 3 2 4
0 1 −12 52
0 −5 −3 −14
w1 := w1 − (3)*w2
w3 := w3 − (−5)*w2
1 0 72 −72
0 1 −12 52
0 0 −112 −32
w3 := w3/(−112)
1 0 72 −72
0 1 −12 52
0 0 1 311
w1 := w1 − (72)*w3
w2 := w2 − (−12)*w3
1 0 0 −4911
0 1 0 2911
0 0 1 311
12 paź 22:40
Bartek: Trivial, na prawdę dzięki. Policzyłem to sobie i chyba już wiem o co biega. Dziś już może nie,
bo trzeba jutro wstać,ale jutro zrobię tego więcej. Chyba już rozumiem o co chodzi. Dzięki
jeszcze raz.
12 paź 23:01
Trivial:
To była eliminacja w stylu Jordana − w górę i dół na raz.
Można wyeliminować też najpierw w dół, a potem w górę − w stylu Gaussa.
12 paź 23:08
Bartek: Właściwie to zauważyłem, że w tej redukcji panuje taka kolejność na przemian: 1 0 1 0 1 0 , mam
rację? albo 0 1 0 1 0.
Tzn. gdy śledziłem twoje obliczenia, to zauważyłem, że najpierw osiągasz 0 a potem 1 potem
znowu 0 i znowu 1.
12 paź 23:14
Trivial:
Daj większy przykład, to zobaczysz.

Program wszystko wchłonie.
12 paź 23:21
Bartek: A ten program ty sam napisałeś? Czy z netu ściągany? Wiesz, ja jestem (może na razie z
programowanie kiepski, bo dopiero się uczę), ale generalnie jestem fascynatem takich rzeczy. W
tej chwili jestem w trakcie czytania php.net oraz javascript. Kiedyś uczyłem się podstaw
programowania obiektowego c++.
12 paź 23:25
Trivial: Kiedyś napisałem jak mi się nudziło.
12 paź 23:26
Bartek: Podziwiam takie rzeczy. Po prostu podziwiam. Jedni idą na panienki jak im się nudzi. Inni (a
feee..) na panów. A tu proszę, gościowi się nudziło i zrobił program do redukcji macierzy.
Co tu dużo pisać − szacun!
12 paź 23:30
Bartek: A w czym ten program napisałeś? W c++ ?
12 paź 23:30
Trivial:
Tak. Sam algorytm redukcji jest prosty.
12 paź 23:33
Bartek: No widzisz, a mnie się w dziedzinie programowania marzy programowanie pod windows. Słyszałem o
książce Pecolda, ale wiesz...po pierwsza kasa, a po drugie

...trudno mówić o nauce
programowania, gdy się w ciągu dnia robi mnóstwo innych rzeczy. Patrz dzisiaj: ćwiczenie
redukcji macierzy.
12 paź 23:36
Trivial:
Dopisałem redukcję w stylu Gaussa.

1 3 2 4
2 4 5 3
5 10 7 6
w2 := w2 − (2)*w1
w3 := w3 − (5)*w1
1 3 2 4
0 −2 1 −5
0 −5 −3 −14
w3 := w3 − (
52)*w2
1 3 2 4
0 −2 1 −5
0 0 −
112 −
32
Kolumna 4 oznaczona jako wolna
w3 := w3/(−
112)
1 3 2 4
0 −2 1 −5
0 0 1
311
w2 := w2 − (1)*w3
w1 := w1 − (2)*w3
1 3 0
3811
0 −2 0 −
5811
0 0 1
311
w2 := w2/(−2)
1 3 0
3811
0 1 0
2911
0 0 1
311
w1 := w1 − (3)*w2
1 0 0 −
4911
0 1 0
2911
0 0 1
311
12 paź 23:40
Bartek: Kolejny przykład. Wyszło mi, że układ nie ma rozwiązań, bo na samym końcu w wierszu czwartym
jest : 0 + 0 + 0 −38 przy czym −38 to wyraz wolny. Dlatego moim zdaniem układ musi być
sprzeczny, bo 0≠ −38.
Przykład:
2x +y +3z =4
x +3y +z = 3
4x + 2y + 3z = 5
−x + 5y + 2z = −3
13 paź 00:08
Trivial:
2 1 3 4
1 3 1 3
4 2 3 5
−1 5 2 −3
w2 := w2 − (12)*w1
w3 := w3 − (2)*w1
w4 := w4 − (−12)*w1
2 1 3 4
0 52 −12 1
0 0 −3 −3
0 112 72 −1
w4 := w4 − (115)*w2
2 1 3 4
0 52 −12 1
0 0 −3 −3
0 0 235 −165
w4 := w4 − (−2315)*w3
2 1 3 4
0 52 −12 1
0 0 −3 −3
0 0 0 −395
Układ sprzeczny.
13 paź 00:33
Bartek: Trivial, dlaczego na samej górze jest:
w2 := w2 − (1/2)*w1

Przecież w tym równaniu w ogóle nie ma takiego współczynnika, jak 1/2.
13 paź 12:10
Bartek: Triiiiiviaaaal
13 paź 12:30
Trivial:
Po kolei w pierwszej kolumnie:
Przez co pomnożyć 2 żeby było równe 1? przez
12.
Przez co pomnożyć 2 żeby było równe 4? przez 2.
Przez co pomnożyć 2 żeby było równe −1? przez −
12.
| | y | |
Przez co pomnożyć x żeby było równe y? przez |
| . |
| | x | |
13 paź 12:37
Bartek: No oczywiście ta ja też to zauważyłem, ale wydawało mi się, że mnożyć można tylko przez
istniejące współczynniki.
Czyli jeśli mam:
2 1 3 4
1 3 1 3
4 2 3 5
−1 5 2 −3
to myślałem, że np. W1 − 2*W2, bo w pierwszym wierszu mam współczynnik 2 (na samym początku z
resztą).
Wydawało mi się, że tych liczb do mnożenia nie można sobie brać tak z choinki
13 paź 12:55
Trivial: Można.
13 paź 13:03
Trivial: Każda liczba ≠ 0 jest OK.
13 paź 13:03
Bartek: Trivial, a znasz może jakieś miejsce w internecie, gdzie można o zasadach tej redukcji
poczytać? Tzn. nie chodzi mi o konkretne przykłady, bo metodę Gaussa w wikipedi znalazłem.
Chodzi mi raczej o zasady teoretyczne, czyli o jakieś takie teoretyczne reguły. I to sprawa
pierwsza.
Sprawa druga:
2 1 3 4
1 3 1 3
4 2 3 5
−1 5 2 −3
Dlaczego w tym przykładzie nie policzyłeś tak, by ta pierwsza dwójka zamieniła się na jedynkę?
Przecież można było zrobić: W1 − W2 i miałbyś od razu w pierwszym wierszu na samym początku
jedynkę. Czy tu może jest jakaś taka dowolność tych obliczeń
13 paź 13:09
Trivial:
Zasady są tylko 3, więc je po prostu napiszę. Dozwolone operacje to:
1. Pomnożenie wiersza przez liczbę c ≠ 0.
wi ← c*wi
2. Dodanie do wiersza wielokrotności innego wiersza (c ≠ 0).
wi ← wi + c*wj
3. Zamiana dwóch wierszy.
wi ↔ wj
Można eliminować w dowolny sposób, tak aby dojść do rozwiązania. Mój program eliminuje w sposób
"tradycyjny", czyli po prostu od góry do dołu (otrzymuje się trójkąt zer pod przekątną
macierzy).
13 paź 13:14
13 paź 13:26
Bartek: Ale chyba dzielić też można np. Wi <−−Wi:c gdzie c≠0 ?
13 paź 13:29
Trivial:
| | 1 | |
Dzielenie to mnożenie przez odwrotność. x : c = |
| *x |
| | c | |
13 paź 13:41
Bartek: Okej, taki przykład. Nie wiem czy dobrze zrobiłem, ale doszedłem do tego,że jest sprzeczny:
1 2 1 | 5
2 1 2 | 3
4 −2 −3 | 3
5 3 4 | 2
W2 − 2W1
W3 − 4W1
W4 − 5W1 i otrzymałem:
1 2 1 5
0 −3 0 −7
0 −10 −7 −7
0 −7 −1 −8
w2:(−3)
1 2 1 5
0 1 0 7/3
0 −10 −7 − 7
0 −7 −1 −8
W3 + 10W2
W4 + 7W2
1 2 1 5
0 1 0 7/3
0 0 −7/2 49/3
0 0 −1 25/3
No okej, i co ja mam z tym teraz zrobić? czy ja to w ogóle poprawnie policzyłem?
13 paź 13:50
Bartek: Tzn. sory, tak naprawdę nie wiem czy jest sprzeczny. Chodzi raczej o to, że nie wiem co z nim
dalej robić.
13 paź 13:54
Bartek: Okej, poszedłem dalej:
W1 − 2W2
1 0 1 1/3
0 1 0 7/3
0 0 −7/2 49/3
0 0 −1 25/3
W1 + W4
W4 *(−1)
1 0 0 1/3
0 1 0 7/3
0 0 −7/2 49/3
0 0 1 −25/3
W3 (−2/7)
1 0 0 1/3
0 1 0 7/3
0 0 1 −14/3
0 0 1 −25/3
Jak wół wychodzi, że jest sprzeczny. Nie może być x3= −14/3 i x3=−25/3 jednocześnie. Chyba,
że się gdzieś walnąłęm.
13 paź 14:07
Bartek: Trivial, bo w sumie nie jestem sam na tym forum. Może prześlij mi ten twój program (proszę), to
będę sobie to wszystko sam sprawdzał. Co ty na to? Podałbym maila.
13 paź 14:33
Trivial:
Ten program nie ma interfejsu użytkownika.

Macierze są wpisywane sztywnie do kodu programu.
I jakoś nie chce mi się tego zmieniać. Ale kod mogę wrzucić.
http://pastebin.com/GB5gabw8
kod nie jest najwyższej jakości − wszędzie się powtarza. Trudno...
13 paź 14:49
Bartek: Żałuję, że poprosiłem

Sory....
Miałem po prostu nadzieję, że właśnie ten interfejs jest, (choćby z wiersza poleceń)bo tak to w
tym kodzie tylko namieszam.
13 paź 14:56
13 paź 15:01
Bartek: Okej, ale gdzie ten kod odpalić? Jak go przekopiuje np. do visual c+ express to po prostu
uruchomić i zadziała?
13 paź 15:06
Bartek: Czy może devc++ byś w tym przypadku raczej sugerował?
13 paź 15:07
Trivial:
To nie ma znaczenia. Wystarczy skompilować. A nawiasem, wynik jest taki:
1 2 1 5
2 1 2 3
4 −2 −3 3
5 3 4 2
w2 := w2 − (2)*w1
w3 := w3 − (4)*w1
w4 := w4 − (5)*w1
1 2 1 5
0 −3 0 −7
0 −10 −7 −17
0 −7 −1 −23
w3 := w3 − (103)*w2
w4 := w4 − (73)*w2
1 2 1 5
0 −3 0 −7
0 0 −7 193
0 0 −1 −203
w4 := w4 − (17)*w3
1 2 1 5
0 −3 0 −7
0 0 −7 193
0 0 0 −537
Czyli układ sprzeczny.
13 paź 15:09
Trivial:
A DevC++ odradzam zdecydowanie. Muszę z tego korzystać jednych na zajęciach i zawsze są z nim
problemy (np. nagle przestaje działać, projekt się zapisuje ale już nie otwiera, itd...)
13 paź 15:12
Trivial:
Tymczasem muszę już lecieć. Możesz też wypróbować opcję szukania wszystkich wymiernych
pierwiastków dowolnego wielomianu o współczynnikach wymiernych.
Rational as[6] = { 2, 2, 1, 5, 3, 1 };
tryRational(as, 5);
Zobacz co się stanie.

Na razie.
13 paź 15:24
Bartek: Dzięki wielkie. Na prawdę bardzo mi pomogłeś.
13 paź 15:42
Bartek: Niestety mistrzu. Usiłowałem uruchomić debagowanie w visual c++ express i cały czas wyskakują
błędy. Także nie wiem, może podaj mi jak będziesz miał chwilę wskazówki jak ty ten kod
odpalasz.
13 paź 17:24
Bartek: Dobra, udało mi się go odpalić na kompilatorze online. Wciąż jednak nie wiem dlaczego pojawiają
się błędy w moim visualu. No nic, pewnie jakąś głupotę robię.
Taki o to error mi wyskakuje:
macierze.cpp
1>d:\macierze\macierze\macierze\macierze.cpp(355): error C2668: 'sqrt' : ambiguous call to
overloaded function
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(589): could
be 'long double sqrt(long double)'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(541): or
'float sqrt(float)'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(127): or
'double sqrt(double)'
1> while trying to match the argument list '(int)'
========== Build: 0 succeeded, 1 failed, 0 up−to−date, 0 skipped ==========
13 paź 17:31
Trivial:
Zamień linijkę 355 z:
for (i = 1; i < sqrt(n); i++) {
na:
for (i = 1; i < sqrt((double)n); i++) {
13 paź 20:46
Bartek: Okej

Słuchaj,a tak przy okazji, co ty właściwie studiujesz?

Jeśli to nie tajemnica oczywiście.
13 paź 21:21
Trivial: Studiuję turystykę religijną.
13 paź 21:25
Bartek: 
Taki żart...

To na turystyce religijnej uczą takich rzeczy?
13 paź 21:30
Trivial:
13 paź 21:31
Bartek: To chyba dobra alternatywa dla tych z polibudy.
13 paź 21:44
Trivial: Jasne.

A ty co studiujesz?
13 paź 21:50
Bartek: Informatykę. Właściwie dopiero zacząłem. Ale tak w ogóle to wpienia mnie jedna rzecz. Był czas
(kilka ładnych miesięcy), że dotarłem do programowania obiektowego c++. I uczyłem się go, ale
później tak mi się ułożyło, że musiałem przestać się tego uczyć i zabrałem się za co innego.
A chętnie bym do tego języka wrócił. Tylko nie wiem jak to zrobię, bo teraz uczę się php i
javascript.
Rozumiesz...po prostu doba za krótka.
13 paź 21:59
Bartek: Bo ja bym chciał: c++, php i javascript. Może też sama java. Mówię. Doba za krótka.
13 paź 22:00
Bartek: O, a właśnie. Jesteś w stanie polecić mi jakąś książkę (bez błędów w kodach) do c++? Słyszam,
że thinking in c++ jest dobra.
13 paź 22:01
Trivial:
Przeczytałem Thinking in c++ tom pierwszy i część tomu drugiego. Nie widziałem ani jednego
błędu w kodzie (w tekście się zdarzały, ale rzadko). Polecam Ci wybrać sobie jeden język na
początek i nauczyć się go dobrze. Gdy już osiągniesz odpowiedni poziom, możesz poświęcić te 7
dni na php i javascript. (tyle było mi potrzebne, żeby ogarnąć php i javascript w stopniu
pozwalającym zbudować realistyczną stronę internetową).
13 paź 22:05
Bartek: Właśnie. Co do javascript. Są tacy, którzy biorą się za analizowanie kodu jquery. Oj jak bym
chciał..., ale niestety jeszcze za mała wiedza i za małe skrzydła.
13 paź 22:16
Bartek: Dobra Trivial

Idę spać, bo jutro trza do roboty. Może wrócę do c++. Fajny język.
13 paź 22:21
Trivial: Dobranoc.
13 paź 22:41
Bartek: Trivial, wpisałem taką macierz i errory są:
1 3 −1 2 4
2 6 3 2 3
−1 −3 3 2 6
Skompilowałem ten twój program i błędy mi jakieś wychodzą.
27 paź 12:14
Bartek: Triiiiiviaaal, help
27 paź 12:40
Trivial: "Jakieś błędy" to bardzo konkretne.
27 paź 23:00