Skip to content

Commit 5336ba2

Browse files
committed
typos
1 parent f9bf80f commit 5336ba2

File tree

2 files changed

+28
-22
lines changed

2 files changed

+28
-22
lines changed

metnum_lab4.md

+8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Aby nie pomylić się w następnych krokach, należy najpierw zrefaktoryzować (
3838
- Zmienna `fix` jest globalna.
3939

4040
# Element po elemencie
41+
4142
Skopiuj funkcję do mnożenia macierz-wektor i nazwij kopię `SMult`.
4243
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$.
4344

@@ -53,6 +54,7 @@ Analogicznie jeśli dodamy do elementu $S_{ij}$ liczbę $w$, to tak jak byśmy d
5354
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.
5455

5556
### Zadanie
57+
5658
Przekopiuj fragment kodu funkcji `main` odpowiedzialny za konstrukcję macierzy $S$. Następnie, każde wystąpienie
5759

5860
`S[i,j] += cos;`
@@ -67,14 +69,17 @@ Nawiasem mówiąc, takie rozwiązanie może się okazać nieco bardziej wydajne
6769
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.
6870

6971
### Zadanie
72+
7073
Co z częścią, która zamieniała wybrane wiersze na wiersze macierzy diagonalnej?
7174
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$.
7275
Zamień pętlę wycinającą $i$ty wiersz, na `r[i]=x[i]`
7376

7477
### Zadanie 8
78+
7579
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`.
7680

7781
# A teraz na poważnie
82+
7883
Na tym etapie nigdzie w kodzie nie potrzebujemy macierzy $S$.
7984
Możemy ją całkowicie wyeliminować.
8085
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
8691

8792
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.
8893

94+
Pamiętaj aby *zamurować* stopnie swobody.
95+
8996
# Równoległość\*
97+
9098
W tej części laboratorium zajmiemy się paralelizacją (zrównolegleniem) napisanego dotychczas kodu.
9199
Plik nagłówkowy z funkcjami ułatwiającymi pisanie równoległego kodu:
92100

metnum_lab7.md

+20-22
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,34 @@ Na dzisiejszych zajęciach dobierzemy wektor grubości elementów $\theta=\text{
1313
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:
1414
\[S(\theta) = \sum_i\theta_k^\gamma K^k\]
1515

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:
17-
\[-\sum_i x_i g_i + \sum_j\lambda_j (\sum_iS_{ji}(\theta)x_i - F_j)\]
16+
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:
17+
\[L = -\sum_i x_i g_i + \sum_j\lambda_j (\sum_iS_{ji}(\theta)x_i - F_j)\]
1818
Optymalne rozwiązanie powinno zerować pochodne po $x$, $\lambda$ i $\theta$:
1919
\[\begin{cases}
20-
-g_i + \sum_j\lambda_j S_{ji} (\theta) &= 0\\
2120
\sum_i S_{ji}(\theta)x_i - F_j &= 0\\
21+
-g_i + \sum_j\lambda_j S_{ji} (\theta) &= 0\\
2222
\sum_{ij}\lambda_j \frac{\partial}{\partial \theta_k}S_{ji}(\theta)x_i &= 0
2323
\end{cases}\]
2424

25-
Drugie równanie to nasze równanie statyki. Pierwsze równanie to równanie sprzężone (adjoint):
25+
Pierwsze równanie to równanie statyki, opisuje ograniczenia jakie muszą być spełnione.
26+
27+
Drugie równanie to równanie sprzężone (adjoint):
2628
\[S^T(\theta)\lambda = g\]
27-
Trzecie równanie to równanie ma gradient funkcji celu względem parametrów:
28-
\[\frac{d}{d\theta_k}J = \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\]
29+
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.
2930

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\]
3033

31-
### Zadanie
34+
35+
### Zadanie 1
3236

3337
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`.
3438

35-
### Zadanie
39+
### Zadanie 2
3640

3741
Zdefiniuj wektor $g$ i rozwiąż równanie sprzężone (zauważ że $S$ jest symetryczna).
3842

39-
### Zadanie
43+
### Zadanie 3
4044

4145
Zdefiniuj funkcję `calc_grad(int n, double * x, double * lambda, double * grad)`. Skopiuj do niej zawartość funkcji mnożącej `SMult` i zmień:
4246

@@ -54,38 +58,32 @@ Gradient wskazuje nam w jakim kierunku powinniśmy przesuwać nasze wartości pa
5458

5559
`thick[i] += grad[i];`
5660

57-
### Zadanie
61+
### Zadanie 4
5862

5963
Dodaj gradient do parametrów `thick[i] += grad[i];`. Iteruj taką procedurę, oglądając wyniki.
6064

61-
6265
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`:
6366

64-
65-
### Zadanie
67+
### Zadanie 5
6668

6769
Odejmij od wektora `grad` jego sumę.
6870

69-
7071
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:
7172

72-
73-
### Zadanie
73+
### Zadanie 6
7474

7575
Zdefiniuj zmienną `move = 0.05`. Podziel `grad` przez jego największy element i pomnóż przez `move*5`.
7676

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.
7778

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
8280

8381
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.
8482

85-
### Zadanie
83+
### Zadanie 8
8684

8785
Zsumuj wartości `thick` po poprzedniej procedurze. Dobierz `scale` metodą bisekcji tak by $\sum_i\text{thick[i]} = \text{frac*mx*my}$.
8886

89-
### Zadanie
87+
### Zadanie 9
9088

9189
Przetestuj program dla różnych obciążeń, ustawień parametru `move` i ustawień maksymalnej liczby iteracji w metodze gradientów sprzężonych.

0 commit comments

Comments
 (0)