Solver pro soustavu Hamiltonových rovnic.

Nebudu se tady zabývat tím, co to jsou Hamiltonovy rovnice, na to je teoretická mechanika. Pro tento účel je to soustava diferenciálních rovnic, převedených do tvaru $$ \dot q_1 = f_1 (q_1, p_1, ..., q_i, p_i) $$ $$ ... $$ $$ \dot q_i = f_i (q_1, p_1, ..., q_i, p_i) $$ $$ \dot p_1 = g_1 (q_1, p_1, ..., q_i, p_i) $$ $$ ... $$ $$ \dot p_i = g_i (q_1, p_1, ..., q_i, p_i) $$ kde $ \dot q_i, \dot p_i $ jsou derivace zobecněných souřadnic a hybností podle času. Celkově je to tedy sudý počet rovnic 2*i. Tyto rovnice zapíšeme jednoduše ve správném pořadí a se správným pořadím proměnných ve tvaru, který používá javascript, stanovíme 2*i počátečních podmínek a stanovíme co se má vykreslit. Osy to nemá, každý graf jde od minima do maxima, je to jen pro představu, jak funkce vypadá. Objekt, vstupující do rovnic má tvar {t:t, w:[q1, q2 ... qn, p1, p2, ... pn]}, t značí čas. Default příklad je harmonický oscilátor, lze použít i nelineární oscilátor nebo pro příklad Lorenzův atraktor a nakonec railgun s disipací energie. Stačí kliknout na zvýrazněný text a stisknout tlačítko Submit. Parametry simulace lze jednoduše měnit. Připadá mi to o hodně jednodušší popsat takto problém textem než vymýšlet celé IDE s mnoha parametry. Parametry funkce solve (krok, počet_kroků, počáteční_podmínky, seznam_funkcí), plot (výsledek_ze_solve, popis_os, barva). Objekt popis_os má tvar {x:[list], y:[list]}, přičemž list je buď 't' nebo 'w', číslo_proměnné.

Vlastní solver používá metodu Runge-Kutta 4.řádu, je poměrně přesná a není to o moc složitější než prostý Euler. Pokud hledáte ty Hamiltonovy rovnice, pomůže tento skript, jeho výstup je pak zhruba tento. A to je vše.