62 lines
3.7 KiB
HTML
62 lines
3.7 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>CALC</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: 67vh; background-color: black; }
|
|
.b { 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 p_1 = g_1 (q_1, p_1, ..., q_i, p_i) $$
|
|
$$ ... $$
|
|
$$ \dot q_i = f_i (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
|
|
<b class="b" onclick="getFile('nvcr.txt');">nelineární oscilátor</b> nebo pro příklad
|
|
<b class="b" onclick="getFile('lorenz.txt');">Lorenzův atraktor</b> a nakonec
|
|
<b class="b" onclick="getFile('railgun.txt');">railgun</b> 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>. A to je vše.
|
|
</p>
|
|
</div>
|
|
</body>
|
|
</html>
|