Niebezpieczeństwo złożonej arytmetyki w obliczeniach naukowych


11

Kompleks iloczyn skalarny dwa różne definicje ustalone przez konwencje: ˂ u, T, V lub u T ˂ v . W BLAS znalazłem procedury cdotu, zdotu i cdotc, zdotc. Dwie poprzednie procedury faktycznie obliczają u T v (fałszywy produkt wewnętrzny!), A dwie ostatnie procedury koniugują pierwszy wektor w produkcie wewnętrznym. Ponadto, według jednej z definicji (koniugat U lub V ) U , V = Ż V , U u,vu¯T.vuT.v¯uT.vuvu,v=v,u¯z koniugacją! Ponadto, jak wskazano w komentarzu, wybór głównych wartości dla złożonych funkcji wielowartościowych może być zależny od konwencji.

Moje pytanie brzmi: czy ta komplikacja powoduje prawdziwe zagrożenie dla stosowania złożonej arytmetyki w obliczeniach naukowych? Kwestię tę podkreślają autorzy rozdania.ii, którzy sugerują zawsze dzielenie liczb zespolonych na część rzeczywistą i część urojoną i stosowanie wyłącznie prawdziwej arytmetyki. Ale nigdy nie uważałem, że podejście dzielenia jest wygodne. Pomyśl na przykład o PML dla harmonicznych czasowych równań Maxwella.

Wydaje się, że zmartwienie związane ze stosowaniem liczb zespolonych jest powszechne w większości programów FEM typu open source, z wyjątkiem FreeFem ++ i libmesh. Ale nawet w przypadku dwóch wyjątków złożona arytmetyka jest mniej testowana niż rzeczywista.

Moje ostatnie pytanie brzmi: czy zawsze powinniśmy unikać używania liczb zespolonych?


3
Czy ktoś naprawdę wie, który rdzeń to ja, a który - ja ? Wydaje się, że twórca oprogramowania powinien dołączyć mały zestaw przykładów testowych do swojego zestawu regresji, aby uchronić się przed włączaniem niespójnych koniugacji w dowolnym długim łańcuchu złożonych obliczeń arytmetycznych. -1ja-ja
hardmath

@hardmath Dziękujemy! Dodałem to w pytaniu.
Hui Zhang

@hardmath: „mały zestaw przykładów testowych” - w większości bibliotek, które kompleksowo realizują operacje algebry liniowej, prawdopodobnie istniałyby dziesiątki lub setki miejsc, w których pobierane są produkty wewnętrzne. Potrzeba setek testów, aby zweryfikować ich poprawność, prawdopodobnie ich wdrożenie zajmie miesiące. Oczywiście nie jest to niemożliwe, a niektóre biblioteki to zrobiły. To po prostu dużo pracy i nie wszyscy autorzy bibliotek są pewni, że dobrze to zrobili :-(
Wolfgang Bangerth

@WolfgangBangerth, może mógłbyś wyjaśnić decyzję dotyczącą projektu. Ii?
Bill Barth

3
Czy powinniśmy zawsze unikać używania liczb zespolonych? Proszę nie. Uważam, że każdy naukowiec obliczeniowy potrzebuje na przykład niesymetrycznego rozkładu wartości własnej.
Federico Poloni

Odpowiedzi:


2

Mówisz, że problem ze złożoną arytmetyką polega na tym, że istnieją różne sposoby definiowania iloczynu skalarnego dla złożonych wektorów, w porównaniu z tylko jednym sposobem w prawdziwym przypadku. Myślę, że prawdziwym problemem ze złożonym iloczynem skalarnym jest inny, który jest jednak ściśle związany z twoją obserwacją.

W złożonej arytmetyki kolejność argumentów iloczynu skalarnego ma znaczenie, podczas gdy w prawdziwej arytmetyki nie. Wiele algorytmów jest zasadniczo takich samych w złożonej i rzeczywistej arytmetyce, co oznacza, że ​​musisz je tylko raz napisać, a następnie użyć tego samego kodu do złożonej i rzeczywistej arytmetyki. (Na przykład w C ++ możesz użyć do tego celu szablonów). Po zakończeniu pisania kodu zwykle go testujesz. Aby odkryć błędy w porządkowaniu argumentów w niektórych produktach skalarnych, musisz przetestować swój kod w przypadku testowym o złożonej wartości.

Często dostajesz kod o wartości rzeczywistej dla algorytmu za darmo, gdy masz działający kod na złożone problemy. Po przetestowaniu kodu w przypadku testu o złożonej wartości kod często jest również poprawny dla liczb rzeczywistych. Przekształcenie kodu o wartościach rzeczywistych w złożony wymaga jednak dodatkowej pracy. Dlatego jest tylko więcej kodów, które po prostu działają (i są dokładnie testowane) w przypadku problemów o wartości rzeczywistej niż w przypadku problemów o złożonej wartości.

Moje pytanie brzmi: czy ta komplikacja powoduje prawdziwe zagrożenie dla stosowania złożonej arytmetyki w obliczeniach naukowych?

Powiedziałbym „Tak” w następujący sposób. Kiedy kod nie jest dobrze przetestowany pod kątem problemów o złożonej wartości, istnieje większe prawdopodobieństwo błędów w kodzie, ale zależy to od konkretnego kodu, na który patrzysz. Kiedy kod jest dobrze przetestowany, nie ma problemu.

Moje ostatnie pytanie brzmi: czy zawsze powinniśmy unikać używania liczb zespolonych?

Jak już wspomniano, istnieją problemy, których nie można rozwiązać za pomocą liczb rzeczywistych. Na przykład obliczanie wartości własnych macierzy niesymetrycznych. Dlatego potrzebujemy złożonej arytmetyki.


-1

Ten artykuł jest odpowiedni:

Odcięcia gałęzi dla elementarnych złożonych funkcji lub dużo hałasu o bit znaku nic.

http://people.freebsd.org/~das/kahan86branch.pdf


5
Witamy w SciComp! Być może mógłbyś wyjaśnić więcej, dlaczego papier, który łączysz, jest odpowiedni? Podsumowanie sprawi, że twoja odpowiedź będzie bardziej wartościowa i bardziej prawdopodobne, że zostanie oceniona. Zwykle odradzamy odpowiedzi, które dodają linki bez wystarczającego kontekstu.
Geoff Oxberry
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.