Szukam szybkiego (ośmielę się powiedzieć optymalnego?) Jawnego liniowego problemu 3x3, , .
Macierz jest ogólna, ale zbliżona do macierzy tożsamości z numerem warunku bliskim 1. Ponieważ to tak naprawdę pomiary czujnika z około 5 cyfrową precyzją, nie mam nic przeciwko utracie kilku cyfr z powodu liczb problemy.
Oczywiście nie jest trudno znaleźć jednoznaczne rozwiązanie oparte na dowolnej liczbie metod, ale jeśli istnieje coś, co okazało się optymalne pod względem liczby FLOPS, byłoby to idealne (w końcu cały problem prawdopodobnie zmieści się w rejestrach FP!).
(Tak, ta rutyna jest często nazywana . Już pozbyłem się nisko wiszących owoców, a to jest następne na mojej liście profilowania ...)
linear-solver
reference-request
Damien
źródło
źródło
Odpowiedzi:
Nie możesz pobić wyraźnej formuły. Możesz zapisać formuły rozwiązania na kartce papieru. Pozwól, aby kompilator zoptymalizował dla Ciebie. Każda inna metoda będzie prawie nieuchronnie zawierać instrukcje lub pętle (np. W przypadku metod iteracyjnych), które spowodują, że Twój kod będzie wolniejszy niż jakikolwiek kod linii prostej.x =ZA- 1b
if
for
źródło
Ponieważ matryca jest tak blisko tożsamości, następujące serie Neumanna zbiegną się bardzo szybko:
W zależności od wymaganej dokładności może być nawet wystarczająco dobra, aby obciąć po 2 warunkach:
Może to być nieco szybsze niż bezpośrednia formuła (jak sugeruje odpowiedź Wolfganga Bangertha), choć z dużo mniejszą dokładnością.
Możesz uzyskać większą dokładność dzięki 3 terminom:
ale jeśli wypiszesz formułę wpis po wpisie dla(3I−3A+A2)b , patrzysz na porównywalną liczbę operacji zmiennoprzecinkowych jak bezpośrednia odwrotna formuła macierzy 3x3 (nie musisz jednak dokonywać podziału, co trochę pomaga).
źródło
Liczba FLOPS na podstawie powyższych sugestii:
LU, bez obrotu:
Eliminacja Gaussa z substytucją wsteczną, bez obrotu:
Reguła Cramera poprzez rozszerzenie kofaktora
Jawne odwrotne, a następnie pomnóż:
Sprawdzanie poprawności koncepcji MATLAB:
Reguła Cramera za pomocą rozszerzenia kofaktora :
LU (bez obrotu) i podstawienie wsteczne:
Jawne odwrotne, a następnie pomnożone:
Eliminacja Gaussa:
Uwaga: dodaj własne metody i liczenie do tego postu.
źródło
Prawdopodobnie Reguła Cramera. Jeśli możesz uniknąć obrotu, być może faktoryzacja LU; to macierz 3x3, więc ręczne rozwijanie pętli byłoby łatwe. Wszystko inne prawdopodobnie będzie wymagało rozgałęzienia i wątpię, aby metoda podprzestrzeni Kryłowa zbiegała się wystarczająco często w 1 lub 2 iteracjach, aby była tego warta.
źródło