blog/public/posts/pyphy-mulrienjin-1pyeon-gib.../index.html

35 lines
22 KiB
HTML

<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>파이썬으로 구현한 뉴턴의 방정식과 적분방정식 | Morgan's Blog</title><meta name=keywords content><meta name=description content="우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다."><meta name=author content="Me"><link rel=canonical href=http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/><meta name=google-site-verification content="XYZabc"><meta name=yandex-verification content="XYZabc"><meta name=msvalidate.01 content="XYZabc"><link crossorigin=anonymous href=/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css integrity="sha256-MVJ6EpI2B/M8HKyWNqL6dV9q3nxVhmvbluRMa8r2z7s=" rel="preload stylesheet" as=style><script defer crossorigin=anonymous src=/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA=" onload=hljs.initHighlightingOnLoad()></script>
<link rel=icon href=https://blog.morgan.kr/favicon.ico><link rel=icon type=image/png sizes=16x16 href=http://blog.morgan.kr/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=http://blog.morgan.kr/favicon-32x32.png><link rel=apple-touch-icon href=https://blog.morgan.kr/favicon.ico><link rel=mask-icon href=https://blog.morgan.kr/favicon.ico><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><script type=application/javascript>var doNotTrack=!1;doNotTrack||(function(e,t,n,s,o,i,a){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,i=t.createElement(n),a=t.getElementsByTagName(n)[0],i.async=1,i.src=s,a.parentNode.insertBefore(i,a)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-123-45","auto"),ga("send","pageview"))</script><meta property="og:title" content="파이썬으로 구현한 뉴턴의 방정식과 적분방정식"><meta property="og:description" content="우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다."><meta property="og:type" content="article"><meta property="og:url" content="http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/"><meta property="og:image" content="http://blog.morgan.kr"><meta property="article:section" content="posts"><meta property="article:published_time" content="2021-05-21T13:18:27+00:00"><meta property="article:modified_time" content="2021-05-21T13:18:27+00:00"><meta property="og:site_name" content="Morgan's Blog"><meta name=twitter:card content="summary_large_image"><meta name=twitter:image content="http://blog.morgan.kr"><meta name=twitter:title content="파이썬으로 구현한 뉴턴의 방정식과 적분방정식"><meta name=twitter:description content="우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다."><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":2,"name":"Posts","item":"http://blog.morgan.kr/posts/"},{"@type":"ListItem","position":3,"name":"파이썬으로 구현한 뉴턴의 방정식과 적분방정식","item":"http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"파이썬으로 구현한 뉴턴의 방정식과 적분방정식","name":"파이썬으로 구현한 뉴턴의 방정식과 적분방정식","description":"우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다.","keywords":[],"articleBody":"우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다.뉴턴의 가속도 법칙은 $ F = \\frac{dp}{dt} $ 로 표현할 수 있습니다. 이 법칙에 의하면, 질량의 변화가 없는 물체에서, $ a $ 는 $ F$ 에 비례합니다. 따라서 각 순간 물체에 작용하는 힘의 크기를 안다면, 그 물체의 가속도를 알 수 있겠죠?\n이때, 가속도와 속도, 변위의 정의를 이용하면 $ a = \\frac{dv}{dt} $ 이고, $ v = \\frac{dx}{dt} $입니다.가속도를 안다면 적분을 통해 속도를 알 수 있고, 속도를 안다면 변위를 알 수 있죠.정상상태에서는 물체에 작용하는 힘의 방정식을 구할 수 있습니다. 이것을 질량으로 나눠 가속도를 얻을 수 있고, 속도와 변위의 방정식을 얻을 수 있습니다.\n하지만, 컴퓨터는 대수적으로 적분할 수 없습니다. (물론 할 수 있는 알고리즘도 있지만 불완전하죠)그렇다면 어떻게 각 시점에서 가속도의 값을 알고, 속도와 변위의 값을 알 수 있을까요?이렇게 미분방정식을 통해서 각 시점의 이산적인 변수값을 알 수 있도록 하는 것이 오일러 근사법입니다.오일러 근사법을 통틀어 이렇게 수치적으로 방정식을 해석하는 학문을 통틀어 수치해석학이라고 합니다.이렇게 물리를 시뮬레이션 하거나 컴퓨터로 해를 구할 때는 수치해석학을 사용합니다.\n오일러 방정식이란, $$ \\frac{dy}{dx} = f(x) $$라고 표현되어지는 미분 방정식이 있을 때, 오일러 근사법을 이용하면 일정한 지점의 $y$ 값을 근사로 구할 수 있습니다.\n$$ y_{n+1} = y_n + \\frac{dy}{dx}|_{x_n} \\Delta x $$ 라는 식으로 말이죠.\n이 식을 이용하면 특정 원점으로부터 $\\Delta x$만큼의 일정한 간격을 띄어가며 $y$ 를 근사할 수 있습니다.\n이 방법으로 물체에 작용하는 힘을 알 때 변위와 속도를 구할 수 있습니다. 특정 $\\Delta t$를 기준으로 $\\Delta$의 $n$배만큼의 시점에서 구할 수 있습니다.\n$$ v_{n+1} = v_n + \\frac{dv}{dt}|_{t_n} \\Delta t $$\n$$ x_{n+1} = x_n + \\frac{dx}{dt}|_{t_n} \\Delta t $$\n으로 말이죠..\n이제 파이썬으로 오일러 근사법을 구현해 봅시다. 이렇게 데이터의 배열끼리의 연산을 취급할 때에는 파이썬의 수치분석 모듈인 Numpy를 사용합니다. 하지만, 간단한 시뮬레이션에서는 파이썬 기본으로도 충분합니다. 그래프를 표현하기 위해 matplotlib과 수식을 위해 math를 이용합니다.\nimport matplotlib.pyplot as plt import math x0 = 0.0 y0 = 1.0 dx = 0.01 step = 1000 dydx = lambda x, y: 1/y x = [x0 + dx*i for i in range(step)] y = [y0] for n in range(step-1): y.append(y[n] + dydx(x[n],y[n]) * dx) plt.plot(x, y) plt.grid() plt.xlabel(\"x\") plt.ylabel(\"y\") plt.legend() plt.show() $ \\frac{dy}{dx} = \\frac{1}{y} $\n","wordCount":"398","inLanguage":"en","datePublished":"2021-05-21T13:18:27Z","dateModified":"2021-05-21T13:18:27Z","author":{"@type":"Person","name":"Me"},"mainEntityOfPage":{"@type":"WebPage","@id":"http://blog.morgan.kr/posts/pyphy-mulrienjin-1pyeon-gibon-aidieo/"},"publisher":{"@type":"Organization","name":"Morgan's Blog","logo":{"@type":"ImageObject","url":"https://blog.morgan.kr/favicon.ico"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><script type=text/x-mathjax-config>
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [['$$','$$']],
},
"HTML-CSS": {
scale: 80
},
});
</script><script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><header class=header><nav class=nav><div class=logo><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=http://blog.morgan.kr/categories/ title=Categories><span>Categories</span></a></li><li><a href=http://blog.morgan.kr/tags/ title=Tags><span>Tags</span></a></li><li><a href=http://blog.morgan.kr/posts/ title=Posts><span>Posts</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=http://blog.morgan.kr>Home</a>&nbsp;»&nbsp;<a href=http://blog.morgan.kr/posts/>Posts</a></div><h1 class=post-title>파이썬으로 구현한 뉴턴의 방정식과 적분방정식</h1><div class=post-meta><span title='2021-05-21 13:18:27 +0000 UTC'>May 21, 21000</span>&nbsp;·&nbsp;398 words&nbsp;·&nbsp;Me</div></header><div class=post-content><p>우리의 세계에서 물체의 역학적 운동을 지배하는, 지배방정식이 있죠.뉴턴의 법칙, 방정식입니다.뉴턴의 법칙은 총 세개의 방정식이 있죠. 이 세가지 법칙만을 이용해서 물체의 운동을 계산할 수 있습니다.이것을 바탕으로 만들어진 역설이 라플라스의 역설이죠. 만약 모든 분자의 가속도, 속도, 위치 세가지 정보를 알고 있다면, 뉴턴의 법칙에 근거하여 그 다음 상황을 예측할 수 있고, 따라서 이 세상, 아니면 그것을 넘어서서 모든 분자의 정보를 알 수 있습니다.우리가 여기서 분석할 것은 가장 쉬운 법칙, 뉴턴의 제 2법칙, 가속도의 법칙입니다.뉴턴의 가속도 법칙은 $ F = \frac{dp}{dt} $ 로 표현할 수 있습니다. 이 법칙에 의하면, 질량의 변화가 없는 물체에서, $ a $ 는 $ F$ 에 비례합니다. 따라서 각 순간 물체에 작용하는 힘의 크기를 안다면, 그 물체의 가속도를 알 수 있겠죠?</p><p>이때, 가속도와 속도, 변위의 정의를 이용하면 $ a = \frac{dv}{dt} $ 이고, $ v = \frac{dx}{dt} $입니다.가속도를 안다면 적분을 통해 속도를 알 수 있고, 속도를 안다면 변위를 알 수 있죠.정상상태에서는 물체에 작용하는 힘의 방정식을 구할 수 있습니다. 이것을 질량으로 나눠 가속도를 얻을 수 있고, 속도와 변위의 방정식을 얻을 수 있습니다.</p><p>하지만, 컴퓨터는 대수적으로 적분할 수 없습니다. (물론 할 수 있는 알고리즘도 있지만 불완전하죠)그렇다면 어떻게 각 시점에서 가속도의 값을 알고, 속도와 변위의 값을 알 수 있을까요?이렇게 미분방정식을 통해서 각 시점의 이산적인 변수값을 알 수 있도록 하는 것이 오일러 근사법입니다.오일러 근사법을 통틀어 이렇게 수치적으로 방정식을 해석하는 학문을 통틀어 수치해석학이라고 합니다.이렇게 물리를 시뮬레이션 하거나 컴퓨터로 해를 구할 때는 수치해석학을 사용합니다.</p><h3 id=오일러-방정식이란>오일러 방정식이란,<a hidden class=anchor aria-hidden=true href=#오일러-방정식이란>#</a></h3><p>$$ \frac{dy}{dx} = f(x) $$라고 표현되어지는 미분 방정식이 있을 때, 오일러 근사법을 이용하면 일정한 지점의 $y$ 값을 근사로 구할 수 있습니다.</p><p>$$ y_{n+1} = y_n + \frac{dy}{dx}|_{x_n} \Delta x $$ 라는 식으로 말이죠.</p><p>이 식을 이용하면 특정 원점으로부터 $\Delta x$만큼의 일정한 간격을 띄어가며 $y$ 를 근사할 수 있습니다.</p><p>이 방법으로 물체에 작용하는 힘을 알 때 변위와 속도를 구할 수 있습니다. 특정 $\Delta t$를 기준으로 $\Delta$의 $n$배만큼의 시점에서 구할 수 있습니다.</p><p>$$ v_{n+1} = v_n + \frac{dv}{dt}|_{t_n} \Delta t $$</p><p>$$ x_{n+1} = x_n + \frac{dx}{dt}|_{t_n} \Delta t $$</p><p>으로 말이죠..</p><h3 id=이제-파이썬으로-오일러-근사법을-구현해-봅시다>이제 파이썬으로 오일러 근사법을 구현해 봅시다.<a hidden class=anchor aria-hidden=true href=#이제-파이썬으로-오일러-근사법을-구현해-봅시다>#</a></h3><p>이렇게 데이터의 배열끼리의 연산을 취급할 때에는 파이썬의 수치분석 모듈인 Numpy를 사용합니다. 하지만, 간단한 시뮬레이션에서는 파이썬 기본으로도 충분합니다. 그래프를 표현하기 위해 matplotlib과 수식을 위해 math를 이용합니다.</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-python data-lang=python><span class=line><span class=cl><span class=kn>import</span> <span class=nn>matplotlib.pyplot</span> <span class=k>as</span> <span class=nn>plt</span>
</span></span><span class=line><span class=cl><span class=kn>import</span> <span class=nn>math</span>
</span></span><span class=line><span class=cl><span class=n>x0</span> <span class=o>=</span> <span class=mf>0.0</span>
</span></span><span class=line><span class=cl><span class=n>y0</span> <span class=o>=</span> <span class=mf>1.0</span>
</span></span><span class=line><span class=cl><span class=n>dx</span> <span class=o>=</span> <span class=mf>0.01</span>
</span></span><span class=line><span class=cl><span class=n>step</span> <span class=o>=</span> <span class=mi>1000</span>
</span></span><span class=line><span class=cl><span class=n>dydx</span> <span class=o>=</span> <span class=k>lambda</span> <span class=n>x</span><span class=p>,</span> <span class=n>y</span><span class=p>:</span> <span class=mi>1</span><span class=o>/</span><span class=n>y</span>
</span></span><span class=line><span class=cl><span class=n>x</span> <span class=o>=</span> <span class=p>[</span><span class=n>x0</span> <span class=o>+</span> <span class=n>dx</span><span class=o>*</span><span class=n>i</span> <span class=k>for</span> <span class=n>i</span> <span class=ow>in</span> <span class=nb>range</span><span class=p>(</span><span class=n>step</span><span class=p>)]</span>
</span></span><span class=line><span class=cl><span class=n>y</span> <span class=o>=</span> <span class=p>[</span><span class=n>y0</span><span class=p>]</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=k>for</span> <span class=n>n</span> <span class=ow>in</span> <span class=nb>range</span><span class=p>(</span><span class=n>step</span><span class=o>-</span><span class=mi>1</span><span class=p>):</span>
</span></span><span class=line><span class=cl> <span class=n>y</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>y</span><span class=p>[</span><span class=n>n</span><span class=p>]</span> <span class=o>+</span> <span class=n>dydx</span><span class=p>(</span><span class=n>x</span><span class=p>[</span><span class=n>n</span><span class=p>],</span><span class=n>y</span><span class=p>[</span><span class=n>n</span><span class=p>])</span> <span class=o>*</span> <span class=n>dx</span><span class=p>)</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>plot</span><span class=p>(</span><span class=n>x</span><span class=p>,</span> <span class=n>y</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>grid</span><span class=p>()</span>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>xlabel</span><span class=p>(</span><span class=s2>&#34;x&#34;</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>ylabel</span><span class=p>(</span><span class=s2>&#34;y&#34;</span><span class=p>)</span>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>legend</span><span class=p>()</span>
</span></span><span class=line><span class=cl><span class=n>plt</span><span class=o>.</span><span class=n>show</span><span class=p>()</span>
</span></span></code></pre></div><figure><img loading=lazy src=https://blog.kakaocdn.net/dn/KMPAl/btq9fmV0ntZ/HPdiTkaknSISR4yGvxKUSK/img.png alt="$ \frac{dy}{dx} = \frac{1}{y} $"><figcaption><p>$ \frac{dy}{dx} = \frac{1}{y} $</p></figcaption></figure></div><footer class=post-footer><ul class=post-tags></ul><nav class=paginav><a class=prev href=http://blog.morgan.kr/posts/cryptography/><span class=title>« Prev</span><br><span>Cryptography</span></a>
<a class=next href=http://blog.morgan.kr/posts/what-i-wanted-to-do/><span class=title>Next »</span><br><span>What I wanted to do.</span></a></nav><br></footer></article></main><footer class=footer><span>&copy; 2023 <a href=http://blog.morgan.kr>Morgan's Blog</a></span>
<span>Powered by
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html>