2010-05-25 6 views
9

Jakim językiem chcesz zaproponować rozwiązania układu z:Lisp, OCaml lub co z Runge Kutta?

  • pierwszej kolejności równań różniczkowych
  • złożonych zmiennych
  • N wymiarach

pomocą 4 rzędu Runge Kutta lub tym podobne.

prędkości liczy się dużo ale byłoby poświęcić dla:

  • Elegancki (czyste i krótki) Kod
  • Elastyczność + skalowalność

jestem przeważnie między Lisp i SML ale wszelkie inne sugestie są mile widziane.

Dzięki!

Odpowiedz

0

Fortran lub C, może zajrzeć do NAG routines. C byłby bardziej elastyczny i łatwiejszy do zrozumienia, ale Fortran jest zwykle uważany za najlepszy dla liczb.

+0

Model numeryczny C, szczególnie z C99, jest w rzeczywistości lepszy niż model Fortrana. Fortran jest używany do tego rodzaju rzeczy, ponieważ jest łatwy do napisania i ludzie go znają, nie dlatego, że zapewnia lepsze środowisko numeryczne. –

+3

@Stephen - proszę, nie wydawaj takich opinii o "rozpalaniu ognia" bez dostarczenia twardych dowodów na poparcie tego. – Rook

+3

@Idigas: Ok, zrób kopię zapasową. Jeden prosty przykład: Fortran wybiera "zły" znak zero dla wyników, gdy dane wejściowe leżą na przecięciu gałęzi kilku złożonych funkcji (szczególnie pierwiastek kwadratowy i log). Zobacz doskonały artykuł Kahana "Odcięcia gałęzi dla złożonych elementarnych funkcji, lub Wiele hałasu o znak" nic nie znak "na przykładach, gdzie wybór Fortrana jest gorszy od standardu C (co wynika z rekomendacji Kahana). Mówiąc ogólniej, Fortran pozwala na wiele optymalizacji wydajności, które mogą mieć negatywne konsekwencje dla stabilności numerycznej, które domyślnie są zabronione w C. –

1

Trudno powiedzieć, który język będzie najłatwiejsze, istnieje lisp, C++, C# itp bibliotek do osiągnięcia tego celu, tak więc dużo, jeśli ma się do czynienia z osobistymi preferencjami. Spekulowałbym, że Matlab jest najbardziej dopasowanym i eleganckim rozwiązaniem specjalnie dla tego typu zadań, i ma dużo built in support for ODEs ... Lisp może być po powolnej stronie ... i nie mogę mówić o OCaml.

+0

* Dzięki za sugestię GSLL! * Niestety, Matlab byłby zbyt powolny dla moich celów. – Eelvex

2

RK4 jest bardzo podstawową metodą i istnieje wiele doskonałych implementacji, które zostały już napisane. Użyj jednego z nich i poświęć swój wysiłek na inne aspekty projektu.

+0

Właściwie to już zaimplementowałem wszystko w C, ale teraz chcę rozszerzyć projekt, więc ważę moje opcje ... – Eelvex

5

Oto implementacja RK w Common Lisp:

http://github.com/bld/bld-ode/blob/master/rk.lisp

Zaletą Common Lisp jest to, że można zacząć od prostego i eleganckiego kodu, a następnie dokonać krytyczne bity szybko biegać (np przełączając od obliczeń głównie funkcjonalnych do stanowych lub przez deklarowanie typów).

SBCL ma doskonały kompilator kodu rodzimego.

+0

Podoba mi się także natywne funkcje języka CL . –

+0

Czy CL nie jest zgodne z IEEE 754? –

2

Nie znam Runge Kutty, ale OCaml może zapewnić dobrą szybkość i ogólną czytelność, przynajmniej jeśli jesteś trochę ostrożny. W dalszej części aplikacji możesz korzystać z solidnego systemu statycznego typu.

+1

Nie jestem zaznajomiony z OCaml;), ale Runge-Kutta (http://en.wikipedia.org/wiki/Runge_kutta) odnosi się do klasy algorytmów do numerycznego rozwiązywania układów równań różniczkowych. Algorytm Runge_Kutta pierwszego rzędu (RK1) jest również znany jako metoda Eulera (http://en.wikipedia.org/wiki/Euler_method), ale szybko traci dokładność. Dla wielu aplikacji algorytm Runge-Kutta czwartego rzędu (RK4) oferuje dobrą dokładność i wydajność czasową. – andand

2

oprócz cokolwiek innego, możesz napisać wiązania ocaml do istniejącego solge C runge-kutta.

1

Sugerowałbym użycie python + numpy + scipy, ogólne wsparcie matematyczne i numeryczne (superbe wielowymiarowe tablice) jest doskonałe. W każdym razie zależy to od konkretnych potrzeb.

+0

Masz rację, python jest również bardzo dobry, ale niestety jest zbyt wolny. – Eelvex

+0

Patrząc na PyDSTool może być warto. Chociaż jest to bardziej ogólne narzędzie, generuje C solvers z bardziej matematycznej specyfikacji ODE w locie. Dodatkowy bonus: sekcje Poincare (Wydarzenia;)). – mbudisic