Skip to content

Instantly share code, notes, and snippets.

@Paddy3118
Created March 24, 2021 17:38
Using Sympy for linear interpolation.
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "guided-relationship",
"metadata": {},
"source": [
"# Using Sympy for linear interpolation\n",
"\n",
"I don't use [Sympy](https://www.sympy.org/en/index.html) for much so decided to read a bit more and use it to help me create a function for a particular linear interpolation problem I had.\n",
"\n",
"## The Linear interpolation problem\n",
"\n",
"I simulate a mechanism and track a position on it at the same increments of time and need to know when the position goes from positive values to exactly zero. The movement is smooth but not linear and my simulation, in general gives a number of preceding positive positions of the point and then a position less-than or equal to zero at a particular time.\n",
"If the (time_increment, value) where we first go negative or zero is called (x_neg, y_neg); we can the previous time increment in which the position was positive (x_neg - 1, y_pos).\n",
"\n",
"I was just using x_neg as the time increment for when y is zero, as a stop gap as I new that I could get a better estimate by assuming that between the computed time steps, the y value changed linearly and computing an adjustment to x_neg\n"
]
},
{
"cell_type": "markdown",
"id": "alien-correction",
"metadata": {},
"source": [
"```\n",
" (x_neg - 1, y_pos)\n",
" ╲\n",
" ╲\n",
" ───────────────────── (better_intercept, 0)\n",
" ╲\n",
" ╲\n",
" ╲\n",
" ╲\n",
" (x_neg, y_neg)\n",
"```\n",
"\n",
"I want a function that returns that better intercept from the other values, something like:\n",
"```python\n",
"def zero_at(y_pos, y_neg, x_neg):\n",
" return # What goes here?\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "comparative-finder",
"metadata": {},
"source": [
"## The maths.\n",
"I was lazy so just looked up my starting point for [linear interpolation](https://en.wikipedia.org/wiki/Linear_interpolation#Linear_interpolation_between_two_known_points) Which gave me: \n",
"\n",
"$$\n",
"y = y_0 + (x-x_0)\\frac{y_1 - y_0}{x_1 - x_0}\n",
"$$\n",
"\n",
"\n",
"I will switch to sympy to show further steps."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "equipped-lancaster",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"import sympy as sy\n",
"from sympy import *\n",
"\n",
"sy.init_session(quiet=1)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "demographic-sitting",
"metadata": {},
"outputs": [],
"source": [
"x, y, x0, y0, x1, y1 = symbols('x, y, x0, y0, x1, y1', real=True)"
]
},
{
"cell_type": "markdown",
"id": "fitted-michael",
"metadata": {},
"source": [
"### Linear equation"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "saving-singapore",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle y = y_{0} + \\frac{\\left(x - x_{0}\\right) \\left(- y_{0} + y_{1}\\right)}{- x_{0} + x_{1}}$"
],
"text/plain": [
" (x - x₀)⋅(-y₀ + y₁)\n",
"y = y₀ + ───────────────────\n",
" -x₀ + x₁ "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eq1 = Eq(y, y0 + (x - x0)*(y1 - y0) / (x1 - x0))\n",
"eq1"
]
},
{
"cell_type": "markdown",
"id": "tough-chick",
"metadata": {},
"source": [
"### Set y to zero"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "prerequisite-arena",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle 0 = y_{0} + \\frac{\\left(x - x_{0}\\right) \\left(- y_{0} + y_{1}\\right)}{- x_{0} + x_{1}}$"
],
"text/plain": [
" (x - x₀)⋅(-y₀ + y₁)\n",
"0 = y₀ + ───────────────────\n",
" -x₀ + x₁ "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eq2 = eq1.subs(y, 0)\n",
"eq2"
]
},
{
"cell_type": "markdown",
"id": "floating-divorce",
"metadata": {},
"source": [
"### Solve for x at y=0"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "boolean-belle",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAFsAAAAiCAYAAAAwG6WQAAADWElEQVR4nO3ZS4jdVBzH8c8UwYW7ihTsogtXSqUI6k4Zi/hAhYKPwQc6C3cigg+QIjpUQVpUpoKgIMWFIPhAUEFR0bsbqRQHXyDqRhxFcCqiC6vFujgnkqT3niTXOYlD7xfCzTnJuf/f/5/kJPllbmlpyYx+2DK0gA3kBSwNrCHJtMW+Acewo9R3EN9iW8PY73Fvre98/IHzptTThcG0T1vs1/AZHort+3EzrsJPDWNXcFGtbxnP48sp9XRhMO3TFvsE9mIRD+JhXIOvS/tci69i350JwXtwAR6J7dfxC16dUlsTbbRP0tCkfVLOqBb7sSgktcyX9n8XH8dxC3G94DQ8hd1RzAM4M277COdgK07HE9iH9bj9IG6vCx3DXvxeWm4d03fJhLEp7SkNKe2pnIk7FCzjxYYEvyut78YuzDn58rsYX2Attt/GFXgJR/AnLoyijuOZ0tiR6kGdxLN4udTeH+M9XepbM56U9pSGlPZUzqgW++e4tGGXcKndLVyCj+PK0vazVRNdw/a4fgyf4DrcgVvwV8u4ZY7GpeC32P7mP2pPkdKeyhnVYrdlh3DUnsQhHManwpkwavkfK7gH7+GtKTRMy6Dau94gt+IdvCnMVfA5XhHOkIIfVI/q9thXsIq/nfwYlZO22ptYNV57U86dz+yjOHdM/0KtfRg7Y8BfcTUeLW2/Dc8Jc9xGsdiwva32JiZpb8p5qmmkDcdxHz4Urp4DwqPUNqEoO3HThLHvC/PqGcJLxI3CpdsndQ0Lwr1g0WTt43JeL++Qq9jwRlwK5vGB8Bx6vVD8cVyeUVNb6hrm8aNm7fWcK+Qsdp2RzevFjGyA9s2a/KZkVuweKaaRE4OqOEUoij03qIpThNzTyNDe9dDxK+Qu9tDe9dDxK/Rd7D2q/m9uho5fIXexm7zrpNke6eqzd4mf+0NFhdwvNSn/tzDbLxO8hCNC8uu1/1jWzWdvG5/wkeCQYJdmJ3exU/5vo9ke6eKzd4lP+w8VG0IfLzUruCv+lv3fRrM9c/ze6aPYq/r3rv9P8f+lj2JP8n8bzfbM8Xsn15y9BWdJ+7+NZnvm+L2Tq9iXavauG832zPHp+UNFrmKPtJuikmZ7D/F7/VAxs1h7ZFbsHpkVu0dmxe6RfwDsfDADY31jlwAAAABJRU5ErkJggg==\n",
"text/latex": [
"$\\displaystyle \\frac{- x_{0} y_{1} + x_{1} y_{0}}{y_{0} - y_{1}}$"
],
"text/plain": [
"-x₀⋅y₁ + x₁⋅y₀\n",
"──────────────\n",
" y₀ - y₁ "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s1 = solve(eq2, x)[0] # (Take first and only result from solution list)\n",
"s1"
]
},
{
"cell_type": "markdown",
"id": "unable-agreement",
"metadata": {},
"source": [
"Result as Python expression"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "fresh-plasma",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(-x0*y1 + x1*y0)/(y0 - y1)\n"
]
}
],
"source": [
"print(pycode(s1))"
]
},
{
"cell_type": "markdown",
"id": "unlike-virgin",
"metadata": {},
"source": [
"### Substitute function argument names."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "corporate-frederick",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$\\displaystyle \\frac{x_{neg} y_{pos} - y_{neg} \\left(x_{neg} - 1\\right)}{- y_{neg} + y_{pos}}$"
],
"text/plain": [
"x_neg⋅yₚₒₛ - y_neg⋅(x_neg - 1)\n",
"──────────────────────────────\n",
" -y_neg + yₚₒₛ "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_pos, y_neg, x_neg = symbols('y_pos, y_neg, x_neg', real=True)\n",
"s2 = s1.subs([\n",
" (x0, x_neg - 1),\n",
" (y0, y_pos),\n",
" (x1, x_neg),\n",
" (y1, y_neg)])\n",
"s2"
]
},
{
"cell_type": "markdown",
"id": "adjusted-remove",
"metadata": {},
"source": [
"### Final Python expression"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "subsequent-brother",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(x_neg*y_pos - y_neg*(x_neg - 1))/(-y_neg + y_pos)\n"
]
}
],
"source": [
"print(pycode(s2))"
]
},
{
"cell_type": "markdown",
"id": "entertaining-rebound",
"metadata": {},
"source": [
"## Final Python function "
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "imported-helmet",
"metadata": {},
"outputs": [],
"source": [
"def zero_at(y_pos, y_neg, x_neg):\n",
" return (x_neg*y_pos - y_neg*(x_neg - 1))/(-y_neg + y_pos)"
]
},
{
"cell_type": "markdown",
"id": "psychological-alfred",
"metadata": {},
"source": [
"## End bit\n",
"\n",
"Yes I could have done this by hand, (or searched in more depth and found it coded). I have probably done the maths before and coded it up decades before in Pascal or whatever, but I am not fluent in Sympy and there are many maths problems that I would not be able to approach without the aid of Sympy."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "caring-alert",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.8"
},
"toc-autonumbering": false,
"toc-showcode": false,
"toc-showmarkdowntxt": true,
"toc-showtags": true
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment