Skip to content

Instantly share code, notes, and snippets.

@Hasenpfote
Created January 22, 2018 01:25
Show Gist options
  • Save Hasenpfote/9930495e79b708f9d6d0752764e06f88 to your computer and use it in GitHub Desktop.
Save Hasenpfote/9930495e79b708f9d6d0752764e06f88 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** 曲線の法線ベクトル **\n",
"$$\n",
"\\begin{align*}\n",
"f(x)&=\\cos{(x)}\\\\\n",
"\\\\\n",
"g(x,y)&=y-f(x)=C\\\\\n",
"&=y-f(x)-C=0\\\\\n",
"\\\\\n",
"\\nabla{g}&=\n",
"\\left(\n",
" \\begin{array}{c}\n",
" \\frac{\\partial}{\\partial x} g(x,y)\\\\\n",
" \\frac{\\partial}{\\partial y} g(x,y)\n",
" \\end{array}\n",
"\\right)=\n",
"\\left(\n",
" \\begin{array}{c}\n",
" sin{(x)}\\\\\n",
" 1\n",
" \\end{array}\n",
"\\right)\n",
"\\end{align*}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nbFtnZUbamQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x217dced0a20>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def f(x):\n",
" return np.cos(x)\n",
"\n",
"def g(x, y):\n",
" return y - f(x)\n",
"\n",
"C = 1.0\n",
"level = 2\n",
"levels = np.linspace(C - level, C + level, level * 2 + 1)\n",
"\n",
"# gradient\n",
"x = np.linspace(0, 2 * np.pi)\n",
"y = np.linspace(-3, 3)\n",
"xx, yy = np.meshgrid(x, y)\n",
"zz = g(xx, yy)\n",
"\n",
"skip = 5\n",
"dgdx, dgdy = np.gradient(zz[::skip, ::skip], axis=(1, 0))\n",
"rx = xx[::skip, ::skip]\n",
"ry = yy[::skip, ::skip]\n",
"\n",
"# plot\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1, 1, 1)\n",
"#m = ax.contourf(xx, yy, zz, levels=levels)\n",
"m = ax.contourf(xx, yy, zz)\n",
"fig.colorbar(m)\n",
"ax.plot(x, f(x) + C, color='y', linestyle='dashed')\n",
"ax.quiver(rx, f(rx) + C, dgdx, dgdy, color='r')\n",
"#ax.quiver(rx, ry + C, dgdx, dgdy, color='r')\n",
"ax.set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** 曲線の法線ベクトル(Sympy) **"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import sympy as sym\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHMAAAAVCAYAAAB17tGhAAAABHNCSVQICAgIfAhkiAAAA95JREFU\naIHt2WloHVUUB/Bf60JjK622SkWo70O1IiKKCxWqJNBacC0qCIK4i4gLiIoWxYgKKm7Qb4IQN2gh\nUkukYFEaLYoWSwOKVRRJrBhtQxu3WjUaP5yJmU7m7ZM2CfnDcN+ce+//nnlnzrnnnmEaUxKtGE5d\nXzbIU0rmdxShVIJXsAuzm+A4W+h1SyEaHToscKCdhvMGtSYd3WjHnQ0uVlKsMc/Fv7i3AK716Mec\nAriKwtVYgy34Rfx3r1cYf5SwTzt6VTFme5PKHYFTcUKTPCPYhEG0FMB1nnjG1QVwFYUeodOv2KG6\nMdPoNs7GLBKnCK98qUDOHejDzAI5m0EbTsYMozZoyJj1PNDleE+EqT/xA97HHZlxJWPDbFpWwloM\nYD8+xaVl1rxJPOS6Mv2bEt6rMvIZyVrDeCrTtxaLsKIM58HGZnytjIfVg1qNeRs24DR04TlsFKHv\nxjrWOwlbhUFfE0Y6PeFuyxm/HP/g4zJ89wvPfRyHpeTP4nrh0Q9m5nyYtBPFmOOCVuXD7Dbhjcfn\n9C3I3JeU98xhPJoZvzKRb8zIZ2MIn1VW+38PvCG5X53cr5P/ss5N+rdW4T0UaNVEmD28joWG8HeO\nfKAOjj48kZG9g+9EcpLGicLb+qtwPoJrxEsyB08mnNcJr83iZxHeF9Wh96RArWH2DZESf4EXsArH\nNbBejwibWezEMRnZ/KTdW4VzJ14U3r8GH+FK/FVhzh5jI8qkR63GfF7sQX24W5zXfhKb9zl1rDdY\nRj6Uo8sfSTurBt7dqd83Y1+V8S0p/imDerLZV7FUeMwleBkXipDWiJdWw66knV9xFNeKhOfH5P6e\nKuNnYl6Kf8qgkbPWoEhWbhXJx7HCqEWjX3jckgpjLk50+Bxn4CtRrqs0Z4k4uvQUouUEQq3GbBN/\nQBYj2W21sNYIhvGB2NsW5/QvQye+FxnxbjwskrqnK/AuTdrNGXmHA7PiSYdas9n1+E2c93qFYS8Q\nddNteHc8lMOboiCwEt+k5GfibZGZrjCa8XaKIsQViX5bcjgvEknYhox85MUeKkLxOrAquWBh0p5v\n9Gg3gPvqJW1V/px5uzDot8IL92A7HsDRmbEllStAeeiWXwE5UiRan6Rki8X+uFeE1iyWJ1x5hYa5\nIvF5K6dvuyh0Z7Pq8Ua7sV9B0ldvhbndJlFtFh4Sep1VANddCdeyjHye8NZnCljjYKJbFWM2+z2z\naMwSR6KuJnlaRD25M6fvMlFIWJjTN9FQ9ntmes/sxWOp+3oqO+OJ/aKa0yZKfL83yFMStdqOnL4u\ntZ1nJwL2OdBO05jGNCY0/gO0nfkbtnJ+TgAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$\\left [ \\sin{\\left (x \\right )}, \\quad 1\\right ]$$"
],
"text/plain": [
"[sin(x), 1]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sym.init_printing()\n",
"\n",
"x, y = sym.symbols(\"x y\")\n",
"\n",
"# y = f(x) = cos(x)\n",
"f = sym.cos(x)\n",
"\n",
"# g(x, y) = y - f(x) = 0\n",
"g = y - f\n",
"\n",
"# ∇g \n",
"grad_g = [sym.diff(g, var) for var in (x, y)]\n",
"\n",
"np_f = sym.lambdify(x, f, 'numpy')\n",
"np_g = sym.lambdify((x, y), g, 'numpy')\n",
"np_grad_g = sym.lambdify((x, y), [c for c in grad_g], 'numpy')\n",
"\n",
"grad_g"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\neMl5PJ5Y8/8BoQkv8KcaJakAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x16f8e289278>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"C = 1.0\n",
"level = 2\n",
"levels = np.linspace(C - level, C + level, level * 2 + 1)\n",
"#\n",
"T = np.linspace(0, 2 * np.pi)\n",
"xx, yy = np.meshgrid(T, np.linspace(-3, 3))\n",
"zz = np_g(xx, yy)\n",
"\n",
"# lambdify を通す場合、定数を含む関数はサイズが縮退する。(例えば微分した後に定数となるような関数なども)\n",
"# よって回避のため、組み合わせを展開する。\n",
"skip = 5\n",
"xx2 = xx[::skip, ::skip]\n",
"yy2 = yy[::skip, ::skip]\n",
"xy = np.concatenate([xx2.reshape(xx2.size, 1), yy2.reshape(yy2.size, 1)], axis=1)\n",
"pv = np.array([(t, np_f(t) + C) for t in T]).transpose()\n",
"rv = np.array([(x, np_f(x) + C) for x, y in xy]).transpose()\n",
"gv = np.array([np_grad_g(x, y) for x, y in xy]).transpose()\n",
"\n",
"# plot\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(1, 1, 1)\n",
"m = ax.contourf(xx, yy, zz)\n",
"#m = ax.contourf(xx, yy, zz, levels=levels)\n",
"fig.colorbar(m)\n",
"ax.plot(pv[0], pv[1], color='y', linestyle='dashed')\n",
"ax.quiver(rv[0], rv[1], gv[0], gv[1], color='r')\n",
"ax.set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment