number | course | material | author | title |
---|---|---|---|---|
7 |
Metody Numeryczne |
Instrukcja 7 |
Ł. Łaniewski-Wołłk |
Topologiczna optymalizacja z użyciem równań sprzeżonych |
Na dzisiejszych zajęciach dobierzemy wektor grubości elementów
[S(\theta)x = F]
A dokładniej: macierz sztywności jest sumą macierzy elementów przemnożonych przez elementy
Będziemy chcieli zoptymalizować przesunięcie węzła w którym przyłożyliśmy siłę. Stwórzmy wektor wag
Pierwsze równanie to równanie statyki, opisuje ograniczenia jakie muszą być spełnione.
Drugie równanie to równanie sprzężone (adjoint):
[S^T(\theta)\lambda = g]
Zwróćmy uwagę, że w punkcie optymalnym kierunek gradientu funkcji celu jest równoległy do kierunku gradientu ograniczeń,
Trzecie równanie to równanie na gradient funkcji Lagrange'a względem parametrów
Wprowadź w funkcji mnożącej przez macierz sztywności SMult
parametr gamma
) podnosząc thick
do potęgi gamma
. Zdefiniuj zmienną frac = 0.5
i ustaw początkowe thick
) na równe frac
.
Zdefiniuj wektor
Zdefiniuj funkcję calc_grad(int n, double * x, double * lambda, double * grad)
. Skopiuj do niej zawartość funkcji mnożącej SMult
i zmień:
r[♦] += x[♠]*pow(thick[♣],gamma)*♥;
na:
grad[♣] += gamma*pow(thick[♣],gamma-1)*lambda[♦]*x[♠]*♥;
Wyświetl tak policzony gradient. Pamiętaj, że gradient ma taką samą długość jak thick
, czyli mx*my
. Pamiętaj także by wyzerować grad
i wyciąć część murującą stopnie swobody.
Gradient wskazuje nam w jakim kierunku powinniśmy przesuwać nasze wartości parametrów by uzyskać lepszy wynik. Pierwszym nasuwającym się schematem postępowania byłoby:
thick[i] += grad[i];
Dodaj gradient do parametrów thick[i] += grad[i];
. Iteruj taką procedurę, oglądając wyniki.
Tak ustawiony problem optymalizacyjny jest nieograniczony. Chcemy jednak uzyskać najmniejsze ugięcie przy ustalonej ,,masie'' belki. Tzn: chcemy zachować sumę parametrów grad
:
Odejmij od wektora grad
jego sumę.
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:
Zdefiniuj zmienną move = 0.05
. Podziel grad
przez jego największy element i pomnóż przez move*5
.
Na nasz projekt musimy jednak narzucić bardziej istotne warunki. Po pierwsze nigdzie grubość nie może przekroczyć move
. Te warunki dość trudno pogodzić z warunkiem stałej sumy elementów.
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.
Zsumuj wartości thick
po poprzedniej procedurze. Dobierz scale
metodą bisekcji tak by $\sum_i\text{thick[i]} = \text{fracmxmy}$.
Przetestuj program dla różnych obciążeń, ustawień parametru move
i ustawień maksymalnej liczby iteracji w metodze gradientów sprzężonych.