jak sugeruje tytuł, próbuję obliczyć całkę kompaktowo obsługiwanej funkcji (kwintyczny wielomian Wendlanda) na trójkącie. Zauważ, że środek funkcji znajduje się gdzieś w przestrzeni 3D. Integruję tę funkcję na dowolnym, ale małym trójkącie ( ). Obecnie używam integracji opisanej przez Dunavant, 1985 (p = 19).
Wydaje się jednak, że te reguły kwadraturowe nie są odpowiednie dla problemów wspieranych w sposób kompaktowy. Potwierdza to fakt, że gdy całkuję (czyli funkcja 1 w okręgu o promieniu 1) na płaszczyźnie, która jest dyskretyzowana za pomocą trójkątów, moje (znormalizowane) wyniki są pomiędzy 1,001 i 0,897.
Więc moje pytanie brzmi: czy istnieje specjalistyczna reguła kwadraturowa dla tego rodzaju problemu? Czy lepiej byłoby zastosować regułę integracji złożonej niższego rzędu?
Niestety ta procedura jest bardzo ważna w moim kodzie, więc precyzja jest kluczowa. Z drugiej strony muszę wykonać tę integrację „kilka razy” dla jednego kroku czasowego, aby koszt obliczeniowy nie był zbyt wysoki. Równoległość nie stanowi problemu, ponieważ sama integracja zostanie wykonana szeregowo.
Dzięki z góry za odpowiedzi.
EDYCJA: Kwintyczny wielomian Wendlanda daje przy r0R3
EDIT2: Jeśli jest dwuwymiarowym trójkątem, to chcę obliczyć z . Więc w nigdy nie będzie mniejsze niż 0. Zauważ, że całka jest całką powierzchniową nad powierzchnią 2-D w
EDYCJA 3: Mam rozwiązanie analityczne dla problemu 1-D (linia). Możliwe jest również obliczenie jednego dla 2-D (trójkąta).
źródło
Odpowiedzi:
Ponieważ funkcja jest gładka wewnątrz , ale nie od ustalonego stopnia (w płaszczyźnie, która jest), chciałbym zaproponować za pomocą prostego systemu adaptacyjnego, np trapezów z metoda romberga w obu wymiarach.q≤2
To znaczy, jeśli twój trójkąt jest zdefiniowany przez wierzchołki , i , a masz procedurę, która integruje się wzdłuż linii od do , możesz wykonać następujące czynności (w notacji Matlab):y z ∈ R 3x y z∈R3
romb(f,a,b)
f
a
b
W
romb
, nie używaj stałej liczby punktów, ale powiększaj tabelę, dopóki różnica między dwoma kolejnymi przekątnymi nie spadnie poniżej wymaganej tolerancji. Ponieważ twoja funkcja jest płynna, powinno to być dobre oszacowanie błędu.Jeśli części trójkąta znajdują się poza domeną , możesz spróbować dostosować granice integracji w powyższym kodzie.W(q)
To może nie być najskuteczniejszy pod względem obliczeniowym sposób rozwiązania twojego problemu, ale adaptacja da ci znacznie większą niezawodność niż reguła o stałym stopniu.
źródło
Aby uzyskać dobry przegląd reguł kubatury, patrz „R. Cools, An Encyclopaedia of Cubature Formulas J. Complexity, 19: 445-453, 2003”. Korzystanie ze stałej reguły może dać przewagę polegającą na tym, że niektóre reguły dokładnie integrują wielomiany (tak jak kwadratura Gaussa w jednym wymiarze).
Cools jest także jednym z głównych autorów CUBPACK , pakietu oprogramowania do kubatury numerycznej.
źródło
Reguły integracji zakładają, że funkcja jest lokalnie dobrze przybliżona przez wielomian niskiego stopnia. Twój problem nie ma nic wspólnego z kompaktową obsługą. Kompaktowo obsługiwane funkcje podstawy radialnej są gładkie na granicy podparcia, a zasady kwadratury do rzędu gładkości mogą być używane bez problemów. (Reguły wyższego rzędu nie pomagają, dlatego prawdopodobnie nie powinieneś używać reguły, która integruje dokładnie wielomiany stopnia 5).
W twoim przypadku niedokładność wynika z faktu, że założenie dobrej przybliżalności wielomianowej zawodzi w twoim przypadku dla trójkątów w pobliżu , nawet jeśli nie zawierają one .r 0r0 r0
q q r r → r 0 r rW jest gładkie w funkcji , ale jest niepłynną funkcją , z gradientem, który staje się nieskończony w granicy prawo w prawo . Całkowanie jest ponad , a funkcja złożona jest funkcją nie gładką .q q r r→r0 r r
Jeśli trójkąt nie zawiera , funkcją jest ale to nie pomaga, ponieważ wyższa pochodna rośnie bardzo szybko blisko , a błąd metody wysokiego rzędu jest proporcjonalny do pochodnej wysokiego rzędu, a zatem bardzo duży !C i n f r 0r0 Cinf r0
Prostym lekarstwem jest podzielenie każdego trójkąta T na liczbę N_T pod trójkątów. Możesz wziąć daleko od , a blisko . Możesz dowiedzieć się offline, jak duże musi być dla trójkątów o danej średnicy i odległości od aby osiągnąć pożądaną dokładność. Ponadto powinieneś używać formuł niskiego rzędu w pobliżu .r 0 N T ≫ 1 r 0 N T r 0 r 0NT=1 r0 NT≫1 r0 NT r0 r0
Gdy całkujesz przez trójkąt, ale jest trójwymiarowy, trójkąt najwyraźniej znajduje się w .R 3r0 R3
W związku z tym szybszy środek zaradczy przedstawiłby całkę dla jako funkcję współrzędnych trójkąta (znormalizowanych przez obrócenie jej w 2-wymiarową płaszczyznę taki sposób, że jeden wierzchołek leży na osi i odzwierciedlenie jej w taki sposób, że druga wierzchołek leży nad nim). Ta tabela musi być wystarczająco szczegółowa, aby interpolacja liniowa lub kwadratowa była wystarczająco dokładna. Ale możesz użyć powolnej metody opisanej w pierwszej kolejności, aby utworzyć tę tabelę.x y xr0=0 xy x
Innym sposobem na pozbycie się problemu jest użycie kompaktowo obsługiwanej funkcji podstawy radialnej, która jest wielomianem w zamiast . Jest to płynne wszędzie i łatwe do zintegrowania. qq2 q
źródło