Created
February 20, 2022 19:18
-
-
Save WASDi/34a63232538c44cdd413e3bd6195aa0f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "from scipy.optimize import minimize_scalar\n", | |
| "import matplotlib.pyplot as plt" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "class Projectile:\n", | |
| " def __init__(self, theta, x_0=0, y_0=0, power=10, g=10):\n", | |
| " self.x_0 = x_0\n", | |
| " self.y_0 = y_0\n", | |
| " self.dx_0 = np.cos(theta) * power\n", | |
| " self.dy_0 = np.sin(theta) * power\n", | |
| " self.g = 10\n", | |
| " \n", | |
| " # x' = dx_0\n", | |
| " # x = x_0 + dx_0*t\n", | |
| " def x(self, t):\n", | |
| " return self.x_0 + self.dx_0*t\n", | |
| " \n", | |
| " # y' = dy_0 - g*t\n", | |
| " # y = y_0 + dy_0 * t - g/2*t^2\n", | |
| " def y(self, t):\n", | |
| " return self.y_0 + self.dy_0*t - self.g/2*t**2\n", | |
| "\n", | |
| "\n", | |
| "class MovingTarget:\n", | |
| " def __init__(self, theta, x_0=0, y_0=0, speed=2):\n", | |
| " self.x_0 = x_0\n", | |
| " self.y_0 = y_0\n", | |
| " self.dx = np.cos(theta) * speed\n", | |
| " self.dy = np.sin(theta) * speed\n", | |
| " \n", | |
| " def x(self, t):\n", | |
| " return self.x_0 + self.dx*t\n", | |
| " \n", | |
| " def y(self, t):\n", | |
| " return self.y_0 + self.dy*t" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def distance(t, projectile, target):\n", | |
| " px = projectile.x(t)\n", | |
| " py = projectile.y(t)\n", | |
| " mx = target.x(t)\n", | |
| " my = target.y(t)\n", | |
| "\n", | |
| " dx = mx-px\n", | |
| " dy = my-py\n", | |
| "\n", | |
| " return np.sqrt(dx**2 + dy**2)\n", | |
| "\n", | |
| "def d_distance2(p, m):\n", | |
| " # (a+bx+cx^2)^2 ==>\n", | |
| " # a^2 + 2 a b x + 2 a c x^2 + b^2 x^2 + 2 b c x^3 + c^2 x^4\n", | |
| " \n", | |
| " # (Δx)^2 = ((x2 + dx2*t) - (x1 + dx1*t))^2\n", | |
| " # (Δx)^2 = (x2 + dx2*t - x1 - dx1*t)^2\n", | |
| " # (Δx)^2 = (x2-x1 + (dx2-dx1)*t)^2 ==> c1=x2-x1, c2=dx2-dx1\n", | |
| " # (Δx)^2 = (c1 + c2*t)^2\n", | |
| " # (Δx)^2 = c1^2 + 2*c1*c2*t + c2^2*t^2\n", | |
| " # (Δx)^2' = 2*c1*c2 + 2*c2^2*t\n", | |
| " \n", | |
| " # (Δy)^2 = ((y2 + dy2*t) - (y1 + dy1*t - g/2*t^2))^2\n", | |
| " # (Δy)^2 = (y2 + dy2*t - y1 - dy1*t + g/2*t^2)^2\n", | |
| " # (Δy)^2 = (y2-y1 + (dy2-dy1)*t + g/2*t^2)^2 ==> c1=y2-y1, c2=dy2-dy1\n", | |
| " # (Δy)^2 = (c1 + c2*t + g/2*t^2)^2\n", | |
| " # (Δy)^2 = c1^2 + 2*c1*c2*t + 2*c1*g/2*t^2 + c2^2*t^2 + 2*c2*g/2*t^3 + g^2/4*t^4\n", | |
| " # (Δy)^2' = 2*c1*c2 + 4*c1*g/2*t + 2*c2^2*t + 6*c2*g/2*t^2 + g^2*t^3\n", | |
| " \n", | |
| " xc1 = m.x_0 - p.x_0\n", | |
| " xc2 = m.dx - p.dx_0\n", | |
| " yc1 = m.y_0 - p.y_0\n", | |
| " yc2 = m.dy - p.dy_0\n", | |
| " \n", | |
| " p0 = 2*xc1*xc2 + 2*yc1*yc2\n", | |
| " p1 = 2*xc2**2 + 4*yc1*p.g/2 + 2*yc2**2\n", | |
| " p2 = 6*yc2*p.g/2\n", | |
| " p3 = p.g**2\n", | |
| " \n", | |
| " return np.polynomial.Polynomial([p0, p1, p2, p3])\n", | |
| "\n", | |
| "\n", | |
| "def closest_points(projectile, target):\n", | |
| " extrema = d_distance2(projectile, target).roots()\n", | |
| " extrema = np.unique(extrema[np.isreal(extrema)].real.clip(0))\n", | |
| " minimum_t = extrema[np.argmin(distance(extrema, projectile, target))]\n", | |
| " return minimum_t, extrema" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Optimize scenario" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "target = MovingTarget(np.pi/8, 3, -1, speed=4)\n", | |
| "\n", | |
| "def closest_point(theta):\n", | |
| " projectile = Projectile(theta)\n", | |
| " minimum_t, _ = closest_points(projectile, target)\n", | |
| " return distance(minimum_t, projectile, target)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "x = np.linspace(0, np.pi/2, num=200)\n", | |
| "plt.plot(x, np.vectorize(closest_point)(x))\n", | |
| "plt.plot([x[0], x[-1]], [0,0], c='grey')\n", | |
| "plt.xlabel('theta')\n", | |
| "plt.ylabel('min distance')\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| " fun: 6.303267105187358e-06\n", | |
| " message: 'Solution found.'\n", | |
| " nfev: 16\n", | |
| " status: 0\n", | |
| " success: True\n", | |
| " x: 0.9595076611513058" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "opt = minimize_scalar(closest_point, method='bounded', bounds=(0.8, np.pi/2))\n", | |
| "#opt = minimize_scalar(closest_point)\n", | |
| "projectile = Projectile(opt.x)\n", | |
| "opt" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Plot it" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(1.4679185859539938, 6.303267105187358e-06)" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "minimum_t, extrema = closest_points(projectile, target)\n", | |
| "minimum_t, distance(minimum_t, projectile, target)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 1008x360 with 2 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "t = np.linspace(0, 2, num=100)\n", | |
| "t_ = np.linspace(min(t), max(t), 6)\n", | |
| "\n", | |
| "fig, ax = plt.subplots(1, 2, figsize=(14,5))\n", | |
| "\n", | |
| "ax[0].plot(projectile.x(t), projectile.y(t))\n", | |
| "ax[0].plot(target.x(t), target.y(t))\n", | |
| "ax[0].set_title('Theta = %.2f' % opt.x)\n", | |
| "ax[0].set_xlabel('x')\n", | |
| "ax[0].set_ylabel('y')\n", | |
| "\n", | |
| "ax[0].scatter(projectile.x(t_), projectile.y(t_), marker='x')\n", | |
| "ax[0].scatter(target.x(t_), target.y(t_), marker='x')\n", | |
| "\n", | |
| "ax[0].scatter(projectile.x(minimum_t), projectile.y(minimum_t), c='red')\n", | |
| "ax[0].scatter(target.x(minimum_t), target.y(minimum_t), c='red')\n", | |
| "\n", | |
| "ax[1].plot(t, distance(t, projectile, target), c='green')\n", | |
| "ax[1].plot([t[0], t[-1]], [0,0], c='grey')\n", | |
| "ax[1].scatter(t_, distance(t_, projectile, target), c='green', marker='x')\n", | |
| "ax[1].scatter(extrema, distance(extrema, projectile, target), c='red')\n", | |
| "ax[1].set_xlabel('time')\n", | |
| "ax[1].set_ylabel('distance')\n", | |
| "\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.7.12" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 4 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment