Skip to content

Instantly share code, notes, and snippets.

@mariogeiger
Created August 9, 2022 03:19
Show Gist options
  • Save mariogeiger/4f4b292e480e80504719e4fd96af1345 to your computer and use it in GitHub Desktop.
Save mariogeiger/4f4b292e480e80504719e4fd96af1345 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from functools import cache\n",
"from math import factorial\n",
"\n",
"import jax\n",
"import matplotlib.pyplot as plt\n",
"from jax import grad, jit\n",
"from jax import numpy as jnp\n",
"from jax import vmap"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def u(p: int, x: jnp.ndarray) -> jnp.ndarray:\n",
" return (\n",
" 1 - (p + 1) * (p + 2) / 2 * x**p + p * (p + 2) * x ** (p + 1) - p * (p + 1) / 2 * x ** (p + 2)\n",
" )\n",
"\n",
"\n",
"def constraint(x: float, derivative: int, degree: int):\n",
" return [\n",
" 0 if derivative > N else factorial(N) // factorial(N - derivative) * x ** (N - derivative)\n",
" for N in range(degree)\n",
" ]\n",
"\n",
"\n",
"@cache\n",
"def solve_polynomial(constraints) -> jnp.ndarray:\n",
" with jax.ensure_compile_time_eval():\n",
" jax_enable_x64 = jax.config.read(\"jax_enable_x64\")\n",
" jax.config.update(\"jax_enable_x64\", True)\n",
"\n",
" degree = len(constraints)\n",
" A = jnp.array(\n",
" [constraint(x, derivative, degree) for x, derivative, y in sorted(constraints)],\n",
" dtype=jnp.float64,\n",
" )\n",
" B = jnp.array([y for x, derivative, y in sorted(constraints)], dtype=jnp.float64)\n",
" c = jnp.linalg.solve(A, B)\n",
"\n",
" jax.config.update(\"jax_enable_x64\", jax_enable_x64)\n",
" return jit(lambda x: jnp.polyval(c[::-1], x))\n",
"\n",
"\n",
"def poly_envelope(n0: int, n1: int):\n",
" fn = solve_polynomial(\n",
" frozenset(\n",
" {(-0.5, 0, 1.0), (0.5, 0, 0.0)}\n",
" | {(-0.5, derivative, 0.0) for derivative in range(1, n0 + 1)}\n",
" | {(0.5, derivative, 0.0) for derivative in range(1, n1 + 1)}\n",
" )\n",
" )\n",
" return jit(lambda x: fn(x - 0.5))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 360x252 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1, 1, figsize=(5, 3.5))\n",
"\n",
"x = jnp.linspace(0.0, 1.0, 1000)\n",
"\n",
"p = 6\n",
"plt.plot(x, u(p, x), label=f\"$u_{p}(x)$\", lw=2)\n",
"plt.plot(x, poly_envelope(p - 1, 2)(x), \"k--\", lw=1)\n",
"\n",
"p = 2\n",
"plt.plot(x, u(p, x), label=f\"$u_{p}(x)$\", lw=2)\n",
"plt.plot(\n",
" x,\n",
" poly_envelope(p - 1, 2)(x),\n",
" \"k--\",\n",
" label=\"$f_{p-1,2}(x)$\",\n",
" lw=1,\n",
")\n",
"\n",
"plt.legend()\n",
"plt.xlabel(\"$x$\")\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"u.pgf\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 360x252 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1, 1, figsize=(5, 3.5))\n",
"\n",
"n0, n1 = 14, 6\n",
"fn = poly_envelope(n0, n1)\n",
"\n",
"x = jnp.linspace(0.0, 1.0, 1000)\n",
"\n",
"y = fn(x)\n",
"plt.plot(x, y, \"k\", lw=2, zorder=10)\n",
"\n",
"y = vmap(grad(fn))(x)\n",
"plt.plot(x, y / jnp.max(jnp.abs(y)), \"k--\", lw=1)\n",
"\n",
"y = vmap(grad(grad(fn)))(x)\n",
"plt.plot(x, y / jnp.max(jnp.abs(y)), \"--\", lw=1)\n",
"\n",
"y = vmap(grad(grad(grad(fn))))(x)\n",
"plt.plot(x, y / jnp.max(jnp.abs(y)), \"--\", lw=1)\n",
"\n",
"y = vmap(grad(grad(grad(grad(fn)))))(x)\n",
"plt.plot(x, y / jnp.max(jnp.abs(y)), \"--\", lw=1)\n",
"\n",
"y = vmap(grad(grad(grad(grad(grad(fn))))))(x)\n",
"plt.plot(x, y / jnp.max(jnp.abs(y)), \"--\", lw=1)\n",
"\n",
"plt.legend(\n",
" [\n",
" rf\"$f_{{{n0}, {n1}}}(x)$\",\n",
" \"5 first derivatives\",\n",
" ]\n",
")\n",
"plt.yticks([])\n",
"plt.xlabel(\"$x$\")\n",
"plt.ylabel(\"rescaled amplitudes\")\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"poly_envelope.pgf\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 360x252 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1, 1, figsize=(5, 3.5))\n",
"\n",
"x = jnp.linspace(0.0, 1.0, 1000)\n",
"\n",
"\n",
"def pl(n0, n1, xt, yt):\n",
" fn = poly_envelope(n0, n1)\n",
" plt.plot(x, fn(x), lw=1)\n",
" plt.annotate(rf\"$f_{{{n0},{n1}}}$\", (xt - (fn(xt) - yt) / grad(fn)(xt), yt))\n",
"\n",
"\n",
"pl(0, 0, 0.2, 0.8)\n",
"pl(3, 3, 0.4, 0.85)\n",
"pl(6, 3, 0.5, 0.8)\n",
"pl(15, 5, 0.7, 0.8)\n",
"pl(13, 13, 0.5, 0.6)\n",
"pl(0, 15, 0.1, 0.1)\n",
"\n",
"plt.xlabel(\"$x$\")\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"variations.pgf\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 360x252 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(1, 1, figsize=(5, 3.5))\n",
"\n",
"x = jnp.linspace(0.0, 1.0, 1000)\n",
"\n",
"fn = solve_polynomial(\n",
" frozenset(\n",
" {(-0.5, 0, 1.0)} | {(-0.5, d, 0.0) for d in range(1, 10)} | {(0.5, d, 0.0) for d in range(1 + 5)}\n",
" )\n",
")\n",
"plt.plot(x, fn(x - 0.5))\n",
"\n",
"fn = solve_polynomial(\n",
" frozenset(\n",
" {(-0.5, 0, 1.0)}\n",
" | {(-0.5, d, 0.0) for d in range(1, 10)}\n",
" | {(0.2, 0, 0.7), (0.1, 0, 1)}\n",
" | {(0.5, d, 0.0) for d in range(1 + 5)}\n",
" )\n",
")\n",
"plt.plot(x, fn(x - 0.5))\n",
"\n",
"plt.xlabel(\"$x$\")\n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.2 ('base')",
"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.9.2"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "b5e6a81650e2ec12c36e53f44b5573c56b5183943fab134b82eca30c58c300d8"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment