313 lines
24 KiB
HTML
313 lines
24 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">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<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/2021/05/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%9C-%EB%89%B4%ED%84%B4%EC%9D%98-%EB%B0%A9%EC%A0%95%EC%8B%9D%EA%B3%BC-%EC%A0%81%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D/">
|
|
|
|
<script type="text/javascript">
|
|
let vh = window.innerHeight * 0.01;
|
|
document.documentElement.style.setProperty('--vh', `${vh}px`);
|
|
</script>
|
|
<link crossorigin="anonymous" href="/assets/css/stylesheet.dde9171333af37b8e856933e0deb815c09f761bbd3ee0e6826d3a1309b808533.css" integrity="sha256-3ekXEzOvN7joVpM+DeuBXAn3YbvT7g5oJtOhMJuAhTM=" 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="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
|
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
|
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" onload="renderMathInElement(document.body);"></script>
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
renderMathInElement(document.body, {
|
|
delimiters: [
|
|
{left: "$$", right: "$$", display: true},
|
|
{left: "$", right: "$", display: false}
|
|
]
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<link rel="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>
|
|
</noscript><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/2021/05/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%9C-%EB%89%B4%ED%84%B4%EC%9D%98-%EB%B0%A9%EC%A0%95%EC%8B%9D%EA%B3%BC-%EC%A0%81%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D/" /><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"/>
|
|
<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/2021/05/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%9C-%EB%89%B4%ED%84%B4%EC%9D%98-%EB%B0%A9%EC%A0%95%EC%8B%9D%EA%B3%BC-%EC%A0%81%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D/"
|
|
}
|
|
]
|
|
}
|
|
</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/2021/05/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%9C-%EB%89%B4%ED%84%B4%EC%9D%98-%EB%B0%A9%EC%A0%95%EC%8B%9D%EA%B3%BC-%EC%A0%81%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D/"
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "Morgan's Blog",
|
|
"logo": {
|
|
"@type": "ImageObject",
|
|
"url": "https://blog.morgan.kr/favicon.ico"
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body class=" dark" id="top"><header class="header">
|
|
</header>
|
|
<script>
|
|
if (localStorage.getItem("pref-theme") === "light") {
|
|
document.body.classList.remove('dark')
|
|
document.getElementById('main-logo').src = "\/favicon-inv.png";
|
|
}
|
|
|
|
</script>
|
|
<main class="main">
|
|
|
|
<article class="post-single">
|
|
|
|
<header class="post-header">
|
|
<h1 class="post-title">
|
|
파이썬으로 구현한 뉴턴의 방정식과 적분방정식
|
|
</h1>
|
|
|
|
<div class="post-meta"><span title='2021-05-21 13:18:27 +0000 UTC'>
|
|
May 21, 2021
|
|
</span>
|
|
</div>
|
|
</header>
|
|
<div class="post-divider"></div>
|
|
<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">"x"</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">"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">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 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="pag-back">
|
|
<a href="#back" onclick="window.history.back()">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;fill: var(--primary);stroke: var(--primary);" stroke-width="1"><polygon points="11.65,3.50 3.80,11.35 11.65,19.20 12.36,18.50 5.71,11.85 20.15,11.85 20.15,10.85 5.71,10.85 12.36,4.20"></polygon></svg>
|
|
</a>
|
|
</nav>
|
|
<br/>
|
|
</footer>
|
|
</article>
|
|
</main>
|
|
|
|
<footer class="footer">
|
|
<a href="/admin/" style="text-decoration: none;">©</a> <span><a href="http://blog.morgan.kr">Morgan</a> · PaperMod</span>
|
|
<br/>
|
|
<span style="">Ver.11081623 </span>
|
|
<a href="#" id="theme-toggle">Toggle Dark Mode</a>
|
|
</footer>
|
|
<button id="top-link" class="top-link" onclick="window.scrollTo({top: 0, behavior: 'smooth'})">
|
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;" fill="currentColor" stroke="white" stroke-width="1"><polygon points="19.35,11.5 11.5,3.65 3.65,11.5 4.35,12.21 11,5.56 11,20 12,20 12,5.56 18.65,12.21"></polygon></svg>
|
|
</button>
|
|
|
|
<script>
|
|
let menu = document.getElementById('menu')
|
|
if (menu) {
|
|
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
|
menu.onscroll = function () {
|
|
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
|
}
|
|
}
|
|
|
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
anchor.addEventListener("click", function (e) {
|
|
e.preventDefault();
|
|
var id = this.getAttribute("href").substr(1);
|
|
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
|
behavior: "smooth"
|
|
});
|
|
} else {
|
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
|
}
|
|
if (id === "top") {
|
|
history.replaceState(null, null, " ");
|
|
} else {
|
|
history.pushState(null, null, `#${id}`);
|
|
}
|
|
});
|
|
});
|
|
|
|
</script>
|
|
<script>
|
|
var mybutton = document.getElementById("top-link");
|
|
window.onscroll = function () {
|
|
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
|
mybutton.style.visibility = "visible";
|
|
mybutton.style.opacity = "1";
|
|
} else {
|
|
mybutton.style.visibility = "hidden";
|
|
mybutton.style.opacity = "0";
|
|
}
|
|
};
|
|
|
|
</script>
|
|
<script>
|
|
document.getElementById("theme-toggle").addEventListener("click", () => {
|
|
if (document.body.className.includes("dark")) {
|
|
document.body.classList.remove('dark');
|
|
localStorage.setItem("pref-theme", 'light');
|
|
document.getElementById('main-logo').src = "\/favicon-inv.png";
|
|
|
|
} else {
|
|
document.body.classList.add('dark');
|
|
localStorage.setItem("pref-theme", 'dark');
|
|
document.getElementById('main-logo').src = "\/favicon.png";
|
|
|
|
}
|
|
})
|
|
|
|
</script>
|
|
<script>
|
|
document.querySelectorAll('pre > code').forEach((codeblock) => {
|
|
const container = codeblock.parentNode.parentNode;
|
|
|
|
const copybutton = document.createElement('button');
|
|
copybutton.classList.add('copy-code');
|
|
copybutton.innerHTML = 'copy';
|
|
|
|
function copyingDone() {
|
|
copybutton.innerHTML = 'copied!';
|
|
setTimeout(() => {
|
|
copybutton.innerHTML = 'copy';
|
|
}, 2000);
|
|
}
|
|
|
|
copybutton.addEventListener('click', (cb) => {
|
|
if ('clipboard' in navigator) {
|
|
navigator.clipboard.writeText(codeblock.textContent);
|
|
copyingDone();
|
|
return;
|
|
}
|
|
|
|
const range = document.createRange();
|
|
range.selectNodeContents(codeblock);
|
|
const selection = window.getSelection();
|
|
selection.removeAllRanges();
|
|
selection.addRange(range);
|
|
try {
|
|
document.execCommand('copy');
|
|
copyingDone();
|
|
} catch (e) { };
|
|
selection.removeRange(range);
|
|
});
|
|
|
|
if (container.classList.contains("highlight")) {
|
|
container.appendChild(copybutton);
|
|
} else if (container.parentNode.firstChild == container) {
|
|
|
|
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
|
|
|
|
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
|
|
} else {
|
|
|
|
codeblock.parentNode.appendChild(copybutton);
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
|
|
</html>
|