optymalizacja rozwiązania układu równań liniowych

0

Problem jest taki, że standardowe metody rozwiązywania układów równań liniowych dla n zmiennych wymagają n^2 pamięci na zapisanie macierzy .
Moje układy są specyficzne, pokaże o co chodzi dla n=5:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

tak więc, bardzo wiele wartości współczynników się powtarza. tak naprawdę w n2 tablicy przechowuje dane które mieszczą się na n*2 komórkach pamięci. Co mogę zrobić aby rozwiązać taki układ nie poświęcając n2 pamięci ?

0

No jeśli te macierze wyglądają tak jak napisałeś to możesz to zrobić w O(1) pamięci, bo wzór na wartość elementu w komórce (x,y) to po prostu x+y

int val(int x, int y){
  return x+y
}

Pytanie tylko jaką metodą chcesz to rozwiązywać? Bo w większości metod i tak gdziesz musisz sobie cząstkowe wyniki zapisywać i przed O(n^2) pamięci nie uciekniesz.

0

to ma mi zwracać wartości zmiennych jakie stoją przy współczynnikach, a nie same współczynniki ;)
a te liczby to symbole, mogłem oznaczyć literkami..

0

@KlyYmek to akurat żadna róznica, bo skoro jesteś w stanie wyznaczyć w prosty sposób która to ma być zmienna to jaki problem potem wybrać jej wartość z jakiejś tablicy/mapy?

0

..
to jest rozwiązywanie równań liniowych.
jak mam macierz n=5 to znaczy że jest 5 niewiadomych i ich właśnie szukam.
Nie ma ich zapisanych gdzieś w programie -__-

"Pytanie tylko jaką metodą chcesz to rozwiązywać? "
właśnie o to pytam w tym wątku.

0

Mam pytanie: co oznacza Twój przykład macierzy podany w pierwszym poście? Moim zdaniem, by pokazać pełny układ równań, potrzebna jest macierz 6x5 (by wskazać wartości po prawej stronie znaku równości).
Jeśli zaś ta wartość po prawej stronie równości jest stała (powiedzmy Z), to przy takim układzie jak powyżej dostaniemy układ:

{ a + 2b + 3c + 4d + 5e = Z
{2a + 3b + 4c + 5d + 6e = Z
{3a + 4b + 5c + 6d + 7e = Z
{4a + 5b + 6c + 7d + 8e = Z
{5a + 6b + 7c + 8d + 9e = Z

A wtedy układ jest dla n > 1 nieoznaczony (możemy z niego uzyskać tylko tyle, że a+b+c+d+e=0).

0

Ax=B.
tak, w pierwszym poscie pominąłem wektor B.
A i B jest dane, x szukam :)
Teraz podam, wszystko:

np.

ax1 + bx2 + cx3 + dx4 = r1
bx1 + cx2 + dx3 + ex4 = r2
cx1 + dx2 + ex3 + fx4 = r3
dx1 + ex2 + fx3 + gx4 = r4

jak widać współczynniki są takie same po przekątnych, co przy dużych n jest marnotractwem pamięci ...

0

A jakiej wielkości masz tą macierz? Jeżeli tak dużą, że zajętość pamięci ma znaczenie, to i tak powinieneś liczyć taki układ jakimś LAPACKiem, czy inną biblioteką. Ogólnie nie przejmuj się tym za bardzo (chyba, że cachowanie jest ważne).

0

ja bym się nie przejmował, ale chodzi o to, że mi każą się przejmować (treść zadania) ;)
używanie gotowych bibliotek też nie wchodzi w grę, sam muszę rozwiązać to w sposób optymalny.

0

Jeżeli chcesz rozwiązać ten układ, to i tak będziesz musiał zapisywać gdzieś wyniki cząstkowe - n^2 to minimum. Ale macierz jest symetryczna, więc może jakiś rozkład (LU, SVD itp.) dałby specyficzne wyniki?

1 użytkowników online, w tym zalogowanych: 0, gości: 1