Calculator/Hamilton/index.html
2023-12-02 14:12:25 +01:00

63 lines
3.7 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SOLVER</title>
<style>
tr, td { border-collapse: collapse; }
table { width:100%; border-collapse: collapse; text-align: center; }
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
textarea.emscripten { font-family: monospace; font-size: 16px; width: 100%; overflow-x: scroll; white-space: pre; background: black; color: rgb(0,255,0);}
.frame1 { width: 96%; margin: 0; padding: 10px; background-color: #FFFFC0; border: 10px solid #F0C0F0; }
.canvas { width: 100%; height: 65vh; background-color: black; }
.a {color:#800080;}
</style>
</head>
<body>
<script type="text/javascript" src="index.js"></script>
<div class="frame1"><canvas id="canvas" class="canvas"></canvas></div>
<div class="frame1"><input id="buttonTest" type="button" value="Submit"></div>
<div class="frame1">
<table><tr>
<td width="40%"><textarea class="emscripten" id="input" rows="25" spellcheck="false"></textarea></td>
<td><textarea readonly class="emscripten" id="stdout" rows="25" spellcheck="false"></textarea></td>
</tr></table>
</div>
<script type="text/x-mathjax-config">MathJax.Hub.Config({
extensions: ["tex2jax.js"],
jax: ["input/TeX","output/HTML-CSS"],
tex2jax: {inlineMath: [['$','$']]},
displayAlign: "left"});
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js"></script>
<div class="frame1">
<h2>Solver pro soustavu Hamiltonových rovnic.</h2>
<p>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
<a class="a" onclick="getFile('nvcr.txt');">nelineární oscilátor</a> nebo pro příklad
<a class="a" onclick="getFile('lorenz.txt');">Lorenzův atraktor</a> a nakonec
<a class="a" onclick="getFile('railgun.txt');">railgun</a> 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é.
</p>
<p>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 <a href="lagrange.html" target="_blank">skript</a>,
jeho výstup je pak zhruba <a href="equations.html" target="_blank">tento</a>.
</p>
</div>
</body>
</html>