{ "cells": [ { "cell_type": "markdown", "id": "a7a8eeb0", "metadata": {}, "source": [ "## SVD pseudo inverse\n", "\n", "The pseudoinverse gives a “least squared error, minimum-norm” solution: Out of all $\\dot{q}$ vectors at your current $q$, the vector \n", "\n", "$$\\dot{q}_{s} = J^{+}(q)\\dot{p}_{\\text{in}}$$\n", "\n", "satisfies two conditions:\n", "\n", "1. Least squared error: There is no $\\dot{q}$ vector which will get closer to $\\dot{p}$ when passed through $J(q)$. (I.e. for $\\dot{p}_{s} = J(q)\\dot{q}_{s}$, the normed difference $\\lvert \\dot{p}_{\\text{in}}-\\dot{p}_{s} \\rvert$ is smaller than any other $\\lvert \\dot{p}_{\\text{in}} - \\dot{p} \\rvert$.\n", "\n", "2. Minimum-norm: Out of all $\\dot{q}$ that satisfy the first condition, $\\dot{q}_{s}$ is the smallest of those vectors. (I.e. $\\lvert \\dot{q_{s}}\\rvert$ is smaller than $\\lvert \\dot{q} \\rvert$ for all $\\dot{q}$ that minimize error in $\\dot{p}$.\n", "\n", "At the singularity, the set of achievable velocities loses one dimension (so that there are $\\dot{p}$ that cannot be exactly produced by a $\\dot{q}$), but for any $\\dot{p}_{\\text{in}}$ there is a set of $\\dot{q}$ that all come equally close to producing $\\dot{p}_{\\text{in}}$, and the pseudoinverse picks the smallest (in $\\dot{q}$-space) of these vectors." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }