Monthly Archive: grudzień 2015

Obliczanie wschodów i zachodów Słońca

Dziś przesilenie zimowe - najkrótszy dzień w roku, a najdłuższa noc. Nie każdemu jednak znany jest fakt, że mimo iż dni będą już coraz dłuższe, to jednak Słońce nadal będzie wschodziło coraz później. Jest to spowodowane kształtem orbity Ziemi, który nie jest idealnie okrągły, a eliptyczny. Teraz zbliża się moment, w którym Ziemia będzie najbliżej Słońca w ciągu swojej rocznej wędrówki, a przez to również porusza się szybciej niż zwykle. To z kolei opóźnia południe słoneczne każdego dnia o kilkanaście sekund, powodując, że godziny wschodów są wciąż coraz późniejsze.

Kiedy zatem mamy najpóźniejszy wschód i najwcześniejszy zachód, jeśli nie w przesilenie? Mógłbym pewnie sprawdzić gdzieś w internecie, ale po co, skoro mogę policzyć sam przy pomocy komputera ;)

Do realizacji zadania wybrałem Haskella - głównie dlatego, że wciąż słabo go ogarniam, a jest to dla mnie bardzo ciekawy i zmieniający sposób myślenia język. Zdecydowałem więc, że warto go poćwiczyć.

(więcej…)

Geometria różniczkowa w Ruście

W ciągu ostatnich paru tygodni pracowałem nieco nad biblioteką, która pozwalałaby na prowadzenie obliczeń w zakresie geometrii różniczkowej w Ruście. Przez geometrię różniczkową mam tu na myśli głównie rachunek tensorowy, tylko w krzywych przestrzeniach bądź czasoprzestrzeniach. Coś tego typu stworzyłem już swego czasu w C++, postanowiłem jednak spróbować wykorzystać niektóre możliwości Rusta do stworzenia ulepszonej wersji w tym języku.

Co Rust mógłby zrobić lepiej?

Tensory do celów obliczeń najwygodniej zapisywać jako tablice liczb. Problem w tym, że sprowadzenie tensora do liczb wymaga wybrania układu współrzędnych w przestrzeni, w której ten tensor jest zdefiniowany. Różne operacje, np. dodawanie dwóch tensorów, mają sens jedynie wtedy, kiedy tensory biorące w niej udział są zdefiniowane w tym samym układzie współrzędnych. Jedyną możliwością zakodowania tej zasady w C++ było zakodowanie układu współrzędnych jako właściwości obiektu tensora i sprawdzanie w kodzie różnych operatorów, czy wszystko się zgadza. W ten sposób, jeśli zrobimy w kodzie jakiś błąd, program wychwyci go w trakcie wykonania.

Ok, czyli błędy były wykrywalne, co tu można zrobić lepiej? Ano można byłoby zrobić tak, żeby tensory zapisane w różnych układach współrzędnych miały nie tylko różną wartość jednej właściwości, ale były wręcz obiektami różnych typów. W ten sposób o błędzie może nas powiadomić jeszcze kompilator, zanim program w ogóle zostanie przekształcony w postać wykonywalną. W C++ nie byłoby to praktyczne, natomiast system typów Rusta pozwala to zrobić o wiele ciekawiej.
EDIT: Zwrócono mi uwagę, że szablony w C++ też pozwalają na coś takiego. Tym niemniej, zrobienie tego w Ruście było ciekawym eksperymentem :)

(więcej…)