Prawie bezmasowy kot upuszczany jest w przestrzeń (nie martw się, z skafandrem i wszystkim) w punkcie (x, y, z)
z prędkością (vx, vy, vz)
. W tym punkcie znajduje się stała, nieskończenie gęsta planeta (o objętości 0) (0, 0, 0)
i przyciąga obiekty z odległości r
z przyspieszeniem 1/r^2
. Zgodnie z grawitacją Newtona, dokąd obiekt zmierza po czasie t
?
Prawie bezmasowa w tym przypadku oznacza, że wyprowadzasz wartość lim (mass --> 0) <position of cat>
. Na masę ma wpływ grawitacja planety, ale grawitacja kota nie ma wpływu na planetę. Innymi słowy, ciało centralne jest nieruchome.
Jest to nieco podobne do Code Golf: Jaki jest los statku kosmicznego? [wersja zmiennoprzecinkowa] , ale jest inaczej, ponieważ mierzy dokładność.
Możesz wdrożyć rozwiązanie oparte na symulacji, które musi działać w mniej niż 3 sekundy, LUB możesz wdrożyć program, który podaje dokładną wartość (musi również działać w mniej niż 3 sekundy). Zobacz szczegóły punktacji poniżej. Jeśli wdrożysz symulację, nie musi ona być dokładna, ale twój wynik będzie niższy z powodu niedokładności.
Dane wejściowe : x y z vx vy vz t
niekoniecznie liczby całkowite reprezentujące współrzędne x, y, z, prędkość odpowiednio w kierunkach x, y i z. Gwarantuje się, że prędkość kota jest ściśle mniejsza niż prędkość ucieczki na tej wysokości. Dane wejściowe można pobierać z dowolnego miejsca, w tym parametrów do funkcji. Program musi działać na moim laptopie w mniej niż trzy sekundy t < 2^30
, co oznacza, że jeśli prowadzisz symulację, musisz odpowiednio dostosować swój czas. Jeśli planujesz osiągnąć 3-sekundowy limit dla każdego przypadku testowego, upewnij się, że istnieje parametr dostrajający, który może uczynić go bardziej dokładnym / mniej dokładnym dla przyrostów prędkości, dzięki czemu mogę uruchomić go w ciągu trzech sekund na moim komputerze.
Wyjście : x y z
pozycja po czasie t
.
Ponieważ problem dwóch ciał można idealnie rozwiązać, teoretycznie możliwe jest uzyskanie idealnej, poprawnej odpowiedzi.
Punktacja : dla każdego przypadku testowego błąd jest definiowany jako odległość między twoimi danymi wyjściowymi a „prawdziwymi” danymi wyjściowymi. Prawdziwe dane wyjściowe są zdefiniowane jako generowane przez fragment kodu przypadku testowego. Jeśli błąd jest mniejszy niż 10^(-8)
, błąd jest zaokrąglany w dół do zera. Twój wynik to średni błąd w 100 (lub więcej) losowych przypadkach testowych. Jeśli napiszesz idealnie dokładną odpowiedź, powinieneś otrzymać wynik 0; wygrywa najniższy wynik, a remisy zostaną zerwane przez długość kodu.
Przypadki testowe :
1 0 0 0 -1 0 1000000000 --> 0.83789 -0.54584 0
W tym przypadku orbita jest idealnie okrągła z okresem 2 * pi, więc po okrążeniu 159154943 razy kot kończy w przybliżeniu (0,83789, -0,54584). To nie jest przypadek testowy, na którym zostanie przetestowany kod; jeśli prześlesz idealnie dokładną odpowiedź, możesz chcieć ją przetestować.
Poniższy fragment kodu generuje losowe dodatkowe przypadki testowe i będzie używany do oceny zgłoszeń; daj mi znać, jeśli występuje w tym błąd:
źródło
t
podawany w sekundach? Jeśli tak, to czy prędkość byłaby podawana w jednostkach na sekundę, czy może coś mniejszego?t
jest podawany w jednostkach czasu, cokolwiek to jest, a prędkość użyje tej samej jednostki. Czy to w sekundach, czy godzinach, odpowiedź będzie taka sama.nearly massless cat
Jaka byłaby dokładna masa kota? Czy powinniśmy użyć0
jako wartości masy tego kota?Odpowiedzi:
Python 3.5 + NumPy, dokładny, 186 bajtów
To jest dokładne rozwiązanie, wykorzystując formułę opracowaną przeze mnie na podstawie Jespera Göranssonhisa, „Symetria problemu Keplera”, 2015 . Wykorzystuje binarne wyszukiwanie do rozwiązania równania transcendentalnego Ax + B cos x + C sin x = D, które nie ma rozwiązania w formie zamkniętej.
Funkcja oczekuje, że pozycja i prędkość zostaną przekazane jako tablice NumPy:
źródło
@
zrobić?numpy.dot
(iloczyn iloczynu / macierzy). Zobacz PEP 465.JavaScript
To tylko po to, aby piłka się potoczyła, ponieważ nikt nie wydaje odpowiedzi. Oto bardzo naiwny, prosty sposób, który można znacznie poprawić:
Testowanie:
Hej, to całkiem nieźle. Ma błąd około 3,333 * 10 ^ (- 6), co nie wystarcza do zaokrąglenia w dół ... jest blisko.
Dla żartu:
No cóż; więc to nie jest najlepsze.
I na losowym przypadku testowym z generatora:
Z błędem tylko około 0,32305!
Można to znacznie poprawić, stosując coś takiego jak integracja Verleta lub jakiś wymyślny algorytm. W rzeczywistości algorytmy te mogą nawet uzyskać doskonałe wyniki, mimo że są symulacjami.
źródło