Mam dwuwymiarową funkcję której wartości chciałbym próbkować. Ta funkcja jest bardzo droga do obliczenia i ma złożony kształt, więc muszę znaleźć sposób, aby uzyskać jak najwięcej informacji o jej kształcie, używając najmniejszej liczby punktów próbkowania.
Jakie są dobre metody, aby to zrobić?
Co mam do tej pory
Zaczynam od istniejącego zestawu punktów, w którym już obliczyłem wartość funkcji (może to być kwadratowa sieć punktów lub coś innego).
Następnie obliczam triangulację tych punktów według Delaunaya.
Jeśli dwa sąsiednie punkty w triangulacji Delaunaya są wystarczająco daleko ( ), a wartość funkcji różni się w nich wystarczająco ( ), wówczas wstawiam między nimi nowy punkt. Robię to dla każdej sąsiedniej pary punktów.
Co jest nie tak z tą metodą?
Cóż, działa stosunkowo dobrze, ale na funkcjach podobnych do tej nie jest idealny, ponieważ punkty próbkowe mają tendencję do „przeskakiwania” grzbietu i nawet nie zauważenia, że tam jest.
Daje takie wyniki (jeśli rozdzielczość początkowej siatki punktów jest wystarczająco przybliżona):
Powyższy wykres pokazuje punkty, w których obliczana jest wartość funkcji (faktycznie komórki Voronoi wokół nich).
Powyższy wykres pokazuje interpolację liniową wygenerowaną z tych samych punktów i porównuje ją z wbudowaną metodą próbkowania Mathematiki (dla mniej więcej tej samej rozdzielczości początkowej).
Jak to poprawić?
Myślę, że głównym problemem jest to, że moja metoda decyduje, czy dodać punkt uściślenia, czy nie na podstawie gradientu.
Lepiej byłoby wziąć pod uwagę krzywiznę lub przynajmniej drugą pochodną podczas dodawania punktów uściślenia.
Pytanie
Jaki jest bardzo prosty do wdrożenia sposób uwzględnienia drugiej pochodnej lub krzywizny, gdy położenie moich punktów w ogóle nie jest ograniczone? (Niekoniecznie mam kwadratową sieć punktów początkowych, najlepiej powinien być ogólny).
Lub jakie są inne proste sposoby optymalnego obliczenia pozycji punktów uściślenia?
Zamierzam to zaimplementować w Mathematica, ale to pytanie dotyczy głównie metody. W przypadku bitu „łatwego do wdrożenia” liczy się jednak to, że używam Mathematiki (tj. Było to do tej pory łatwe, ponieważ ma pakiet do triangulacji Delaunaya)
Do jakiego problemu praktycznego się odnoszę
Obliczam diagram fazowy. Ma złożony kształt. W jednym regionie jego wartość wynosi 0, w innym regionie między 0 a 1. Nastąpił gwałtowny skok między dwoma regionami (jest nieciągły). W regionie, w którym funkcja jest większa od zera, występują zarówno pewne płynne zmiany, jak i kilka nieciągłości.
Wartość funkcji jest obliczana na podstawie symulacji Monte Carlo, więc czasami można się spodziewać niepoprawnej wartości funkcji lub szumu (jest to bardzo rzadkie, ale dzieje się tak w przypadku dużej liczby punktów, np. Gdy stan ustalony nie jest osiągnięty z powodu jakiś czynnik losowy)
Ja zapytałem to już na Mathematica.SE ale nie mogę się połączyć z nim dlatego, że wciąż jest w prywatnej beta. To pytanie dotyczy metody, a nie implementacji.
Odpowiedz na @suki
Czy sugerujesz taki podział, np. Umieszczenie nowego punktu pośrodku trójkątów?
Obawiam się tutaj, że wydaje się, że wymaga specjalnego traktowania na krawędziach regionu, w przeciwnym razie da bardzo długie i bardzo cienkie trójkąty, jak pokazano powyżej. Poprawiłeś to?
AKTUALIZACJA
Problem, który pojawia się zarówno w metodzie, którą opisuję, jak i w sugestii @ suki, aby umieścić podział na podstawie trójkątów i umieścić punkty podziału wewnątrz trójkąta, polega na tym, że gdy występują nieciągłości (jak w moim problemie), ponowne obliczenie triangulacji Delaunaya po kroku może spowodować zmianę trójkątów i być może pojawienie się dużych trójkątów, które mają różne wartości funkcji w trzech wierzchołkach.
Oto dwa przykłady:
Pierwszy pokazuje wynik końcowy przy próbkowaniu wokół prostej nieciągłości. Drugi pokazuje rozkład punktu próbkowania dla podobnego przypadku.
Jakie są proste sposoby, aby tego uniknąć? Obecnie po prostu dzielę te egdy, które znikają po ponownej aranżacji, ale wydaje mi się, że to hack i należy to zrobić ostrożnie, ponieważ w przypadku siatek symetrycznych (jak kwadratowa siatka) istnieje kilka ważnych triangulacji Delaunaya, stąd krawędzie mogą się zmienić losowo po retriangulacji.