You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: metnum_lab4.md
+8
Original file line number
Diff line number
Diff line change
@@ -38,6 +38,7 @@ Aby nie pomylić się w następnych krokach, należy najpierw zrefaktoryzować (
38
38
- Zmienna `fix` jest globalna.
39
39
40
40
# Element po elemencie
41
+
41
42
Skopiuj funkcję do mnożenia macierz-wektor i nazwij kopię `SMult`.
42
43
W funkcji `SMult` będziemy chcieli napisać funkcję mnożącą przez globalną macierz sztywności $S$ nie używając samej tej macierzy. Chcemy wykonać operację $r=Sx$, tzn: $r_i = \sum_jS_{ij}x_j$.
43
44
@@ -53,6 +54,7 @@ Analogicznie jeśli dodamy do elementu $S_{ij}$ liczbę $w$, to tak jak byśmy d
53
54
Jako, że macierz $S$ konstruujemy właśnie przez dodawanie do kolejnych jej elementów, możemy całość mnożenia przez nią zapisać w powyższej postaci.
54
55
55
56
### Zadanie
57
+
56
58
Przekopiuj fragment kodu funkcji `main` odpowiedzialny za konstrukcję macierzy $S$. Następnie, każde wystąpienie
57
59
58
60
`S[i,j] += cos;`
@@ -67,14 +69,17 @@ Nawiasem mówiąc, takie rozwiązanie może się okazać nieco bardziej wydajne
67
69
Wynika to z faktu, że korzystając z alokowanego na stosie bufora dokonujemy mniejszej liczby dostępów (operacji `+=`) do tablicy `r`, która zaalokowana jest na stercie.
68
70
69
71
### Zadanie
72
+
70
73
Co z częścią, która zamieniała wybrane wiersze na wiersze macierzy diagonalnej?
71
74
Jeśli w macierzy $S$ $i$-ty wiersz zamienimy na same zera i $1$ na przekątnej, to tak jak byśmy postawili $r_i = x_i$.
72
75
Zamień pętlę wycinającą $i$ty wiersz, na `r[i]=x[i]`
73
76
74
77
### Zadanie 8
78
+
75
79
Jeśli nie zrobiłeś tego w poprzednim ćwiczeniu, napisz trywialny preconditioner `Precond_I(int N, double **A, double *r, double *p)` przepisujący tablicę reszt wskazywaną przez `r` na tablicę poprawek wskazywaną przez `p`.
76
80
77
81
# A teraz na poważnie
82
+
78
83
Na tym etapie nigdzie w kodzie nie potrzebujemy macierzy $S$.
79
84
Możemy ją całkowicie wyeliminować.
80
85
Funkcję `Solve` będziemy chcieli jednak używać dla różnych macierzy --- dlatego jako argument, zamiast macierzy `double ** A` będziemy przekazywać funkcję mnożenia `void (*mult)(double *, double *)`.
@@ -86,7 +91,10 @@ A w miejscu mnożenia przez macierz $r=Ax$ będziemy mieli `mult(x,r);`. Teraz f
86
91
87
92
Na koniec możesz spróbować przerobić funkcję `Solve` tak, aby także preconditioner przyjmowany był jako argument (wskaźnik do funkcji) i wywołać ją z preconditionerem Jacobiego.
88
93
94
+
Pamiętaj aby *zamurować* stopnie swobody.
95
+
89
96
# Równoległość\*
97
+
90
98
W tej części laboratorium zajmiemy się paralelizacją (zrównolegleniem) napisanego dotychczas kodu.
91
99
Plik nagłówkowy z funkcjami ułatwiającymi pisanie równoległego kodu:
Copy file name to clipboardexpand all lines: metnum_lab7.md
+20-22
Original file line number
Diff line number
Diff line change
@@ -13,30 +13,34 @@ Na dzisiejszych zajęciach dobierzemy wektor grubości elementów $\theta=\text{
13
13
A dokładniej: macierz sztywności jest sumą macierzy elementów przemnożonych przez elementy $\theta$. Dla późniejszej poprawy zbieżności dołożymy potęgę $\gamma=3$ do tej zależności:
14
14
\[S(\theta) = \sum_i\theta_k^\gamma K^k\]
15
15
16
-
Będziemy chcieli zoptymalizować przesunięcie węzła w którym przyłożyliśmy siłę. Stwórzmy wektor $g$, który ma $-1$ w miejscu tego przemieszczenia, a resztę wartości ma zerową. Teraz nasza funkcja celu to $J = -\langle x, g \rangle$. Potraktujmy nasze równanie statyki jako więz i rozpiszmy funkcję celu powiększoną o mnożniki Lagrange:
Będziemy chcieli zoptymalizować przesunięcie węzła w którym przyłożyliśmy siłę. Stwórzmy wektor wag $g$, który ma $-1$ w miejscu tego przemieszczenia, a resztę wartości ma zerową. Teraz nasza funkcja celu to $J = -\langle x, g \rangle$. Potraktujmy nasze równanie statyki jako więz i rozpiszmy funkcję celu powiększoną o mnożniki Lagrange'a:
Zwróćmy uwagę, że w punkcie optymalnym kierunek gradientu funkcji celu jest równoległy do kierunku gradientu ograniczeń, $\nabla_x J || \nabla_x \lambda (S(\theta)x - F)$. Mnożniki Lagrange'a, $\lambda_j$, mogą być więc interpretowane jako *intesywność kary* zmuszającej do spełnienia $j$-tego ograniczenia.
29
30
31
+
Trzecie równanie to równanie na gradient funkcji Lagrange'a względem parametrów $\theta$:
32
+
\[\frac{d}{d\theta_k} L = \sum_{ij}\lambda_j \frac{\partial}{\partial \theta_k}S_{ji}(\theta)x_i = \gamma\theta_k^{\gamma-1}\sum_{ij}K^k_{ji}(\theta)\lambda_jx_i\]
30
33
31
-
### Zadanie
34
+
35
+
### Zadanie 1
32
36
33
37
Wprowadź w funkcji mnożącej przez macierz sztywności `SMult` parametr $\gamma=3$ (`gamma`) podnosząc `thick` do potęgi `gamma`. Zdefiniuj zmienną `frac = 0.5` i ustaw początkowe $\theta$ (`thick`) na równe `frac`.
34
38
35
-
### Zadanie
39
+
### Zadanie 2
36
40
37
41
Zdefiniuj wektor $g$ i rozwiąż równanie sprzężone (zauważ że $S$ jest symetryczna).
38
42
39
-
### Zadanie
43
+
### Zadanie 3
40
44
41
45
Zdefiniuj funkcję `calc_grad(int n, double * x, double * lambda, double * grad)`. Skopiuj do niej zawartość funkcji mnożącej `SMult` i zmień:
42
46
@@ -54,38 +58,32 @@ Gradient wskazuje nam w jakim kierunku powinniśmy przesuwać nasze wartości pa
54
58
55
59
`thick[i] += grad[i];`
56
60
57
-
### Zadanie
61
+
### Zadanie 4
58
62
59
63
Dodaj gradient do parametrów `thick[i] += grad[i];`. Iteruj taką procedurę, oglądając wyniki.
60
64
61
-
62
65
Tak ustawiony problem optymalizacyjny jest nieograniczony. Chcemy jednak uzyskać najmniejsze ugięcie przy ustalonej ,,masie'' belki. Tzn: chcemy zachować sumę parametrów $\theta$: $\sum_i\text{thick[i]} = \text{frac*mx*my}$. Możemy łatwo nałożyć ten więz na `grad`:
63
66
64
-
65
-
### Zadanie
67
+
### Zadanie 5
66
68
67
69
Odejmij od wektora `grad` jego sumę.
68
70
69
-
70
71
W kolejnych iteracjach grad ma różną skalę. Na początku jest duży, a później mały. Typową techniką w takich wypadkach jest normalizacja:
71
72
72
-
73
-
### Zadanie
73
+
### Zadanie 6
74
74
75
75
Zdefiniuj zmienną `move = 0.05`. Podziel `grad` przez jego największy element i pomnóż przez `move*5`.
76
76
77
+
Na nasz projekt musimy jednak narzucić bardziej istotne warunki. Po pierwsze nigdzie grubość nie może przekroczyć $1$, i musi być powyżej $0$. Ponadto zazwyczaj chcemy, by zmiana w pojedynczej iteracji nie przekroczyła `move`. Te warunki dość trudno pogodzić z warunkiem stałej sumy elementów.
77
78
78
-
Na nasz projekt musimy jednak narzucić bardziej istotne warunki. Po pierwsze nigdzie grubość nie może przekroczyć $1$, i musi być powyżej $0$. Ponadto zazwyczaj chcemy, by zmiana w pojedynczej iteracji nie przekroczyła `move`. Te warunki dość trudno pogodzić z warunkiem stałej sumy elementów.
79
-
80
-
81
-
### Zadanie
79
+
### Zadanie 7
82
80
83
81
Wynik dodania gradientu do parametrów wstaw do nowego wektora `nt[i] = thick[i] + grad[i];`. Dla danego parametru `scale` oblicz `thick[i] = scale * nt[i];`. Na tak obliczone `thick` narzuć powyżej opisane 4 warunki, obcinając za duże, bądź za małe wartości.
84
82
85
-
### Zadanie
83
+
### Zadanie 8
86
84
87
85
Zsumuj wartości `thick` po poprzedniej procedurze. Dobierz `scale` metodą bisekcji tak by $\sum_i\text{thick[i]} = \text{frac*mx*my}$.
88
86
89
-
### Zadanie
87
+
### Zadanie 9
90
88
91
89
Przetestuj program dla różnych obciążeń, ustawień parametru `move` i ustawień maksymalnej liczby iteracji w metodze gradientów sprzężonych.
0 commit comments