2022-04-07 18:46:57 +02:00

455 lines
66 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Description\n",
"\n",
"This notebook intends to gather all the functionalities you'll have to implement for assignment 2.2.\n",
"\n",
"# Load libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import igl\n",
"import meshplot as mp\n",
"import time\n",
"\n",
"import sys as _sys\n",
"_sys.path.append(\"../src\")\n",
"from elasticsolid import *\n",
"from elasticenergy import *\n",
"from matplotlib import gridspec\n",
"import matplotlib.pyplot as plt\n",
"\n",
"shadingOptions = {\n",
" \"flat\":True,\n",
" \"wireframe\":False, \n",
"}\n",
"\n",
"rot = np.array(\n",
" [[1, 0, 0 ],\n",
" [0, 0, 1],\n",
" [0, -1, 0 ]]\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load mesh\n",
"\n",
"Several meshes are available for you to play with under `data/`: `ball.obj`, `dinosaur.obj`, and `beam.obj`. You can also uncomment the few commented lines below to manipulate a simple mesh made out of 2 tetrahedra."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "fb09ceba0f474ff6a670b5386fe53817",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-1.987469…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
" v, _, _, t, _, _ = igl.read_obj(\"../data/dinosaur.obj\")\n",
"#v, _, _, t, _, _ = igl.read_obj(\"../data/beam.obj\")\n",
"\n",
"# t = np.array([\n",
"# [0, 1, 2, 3],\n",
"# [1, 2, 3, 4]\n",
"# ])\n",
"# v = np.array([\n",
"# [0., 0., 0.],\n",
"# [1., 0., 0.],\n",
"# [0., 1., 0.],\n",
"# [0., 0., 1.],\n",
"# [2/3, 2/3, 2/3]\n",
"# ])\n",
"\n",
"be = igl.edges(igl.boundary_facets(t))\n",
"e = igl.edges(t)\n",
"\n",
"aabb = np.max(v, axis=0) - np.min(v, axis=0)\n",
"length_scale = np.mean(aabb)\n",
"\n",
"p = mp.plot(v @ rot.T, t, shading=shadingOptions)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Linear/Non-Linear Elastic Solid\n",
"\n",
"## Instantiation\n",
"\n",
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"rho = 131 # [kg.m-3]\n",
"young = 10e6 # [Pa] \n",
"poisson = 0.2\n",
"force_mass = np.zeros(shape = (3,))\n",
"force_mass[2] = - rho * 9.81\n",
"\n",
"minX = np.min(v[:, 0])\n",
"pin_idx = np.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]\n",
"\n",
"lin_ee = LinearElasticEnergy(young, poisson)\n",
"neo_ee = NeoHookeanElasticEnergy(young, poisson)\n",
"\n",
"lin_solid = ElasticSolid(v, t, lin_ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n",
"neo_solid = ElasticSolid(v, t, neo_ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n",
"\n",
"solid = neo_solid\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Deform the mesh\n",
"\n",
"This should now involve elastic forces computation."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/notebooks/assignment_2_2/notebook/../src/elasticenergy.py:145: RuntimeWarning: invalid value encountered in log\n",
" self.logJ = np.log(np.linalg.det(jac))\n",
"/opt/notebooks/assignment_2_2/notebook/../src/elasticenergy.py:131: RuntimeWarning: invalid value encountered in log\n",
" j = np.log(np.linalg.det(jac))\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "327564baf8ad4d3fb73b223d8fd921f9",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-0.865849…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v_def = v.copy()\n",
"v_def[:, 0] *= 2.\n",
"solid.update_def_shape(v_def)\n",
"\n",
"p = mp.plot(solid.v_def @ rot.T, solid.t, shading=shadingOptions)\n",
"p.add_points(solid.v_def[solid.pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
"p.add_lines(solid.v_def @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Find equilibrium\n",
"\n",
"We compare different methods: number of steps, computation time."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"n_steps = 1000\n",
"thresh = 1.\n",
"v_init = v.copy()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gradient descent"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "59861d218fad43e6b57b45bed934c9a3",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-1.987468…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"report_GD = equilibrium_convergence_report_GD(solid, v_init, n_steps, 5e-5, thresh=thresh)\n",
"energies_el_GD = report_GD['energies_el']\n",
"energies_ext_GD = report_GD['energies_ext']\n",
"energy_GD = energies_el_GD + energies_ext_GD\n",
"residuals_GD = report_GD['residuals']\n",
"times_GD = report_GD['times']\n",
"idx_stop_GD = report_GD['idx_stop']\n",
"v_def_GD = solid.v_def.copy()\n",
"\n",
"# Lastly, plot the resulting shape\n",
"p = mp.plot(v_def_GD @ rot.T, solid.t, shading=shadingOptions)\n",
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
"p.add_lines(v_def_GD @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
"p.add_points(v_def_GD[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## BFGS\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4fac36847fef413586d1026fc645eeae",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-3.283369…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"report_BFGS = equilibrium_convergence_report_BFGS(solid, v_init, n_steps, 1e-7, thresh=thresh)\n",
"energies_el_BFGS = report_BFGS['energies_el']\n",
"energies_ext_BFGS = report_BFGS['energies_ext']\n",
"energy_BFGS = energies_el_BFGS + energies_ext_BFGS\n",
"residuals_BFGS = report_BFGS['residuals']\n",
"times_BFGS = report_BFGS['times']\n",
"idx_stop_BFGS = report_BFGS['idx_stop']\n",
"v_def_BFGS = solid.v_def.copy()\n",
"\n",
"# Lastly, plot the resulting shape\n",
"p = mp.plot(v_def_BFGS @ rot.T, solid.t, shading=shadingOptions)\n",
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
"p.add_lines(v_def_BFGS @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
"p.add_points(v_def_BFGS[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compare the different algorithms"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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57LpAonIV4m//gS8SesVeFc3/jxyvb/N1XhFdB3wSGM/dzGcl84Ry+rF2sT57o43xFyBVxie7sf7p4ht+uD12pX5r+dpMMEeb1jwPbwibR3evK8L/HWDgVcjYv8OuCzZ/7b10iseL3MuqGkN8eF3R090zu1sZkXAN865hsMhmNn9wMfOuUf8z28BlzvnPk1kvCKSXObdn+odoItzbkVyo2l/zLtD/SLgROfcc8mOR6S1a9VztBpyzq3Du9rpF+DNS4mYLPkC3nBL6BfBQLx754iIyBYys/3N7Egz6+8P8T2D1xOoqRkiUWjVhZaZPY03TDHIzBaa2a/xbsr4azObAkzHu4EeeGP7K81sBt7/Zi91zq1MRtwiIu1IJnAj3lzAl/CGtvd1zq1PalQibUSrHzoUERERaatadY+WiIiISFumQktEREQkIK32PlqdO3d2/fr1C7SN9evXk5/f6A2t271UzT1V8wblrtxTS6rmDco9Wbl//vnnK5xzmz06qtUWWv369eOzzz5recOtUFpaSklJSaBttFapmnuq5g3KXbmnllTNG5R7snL3b8i7GQ0dioiIiAREhZaIiIhIQFRoiYiIiAREhZaIiIhIQFrtZHgREQlOdXU1CxcupKKiItmhBKK4uJiZM2cmO4ykUO7B5J6enk6HDh3o3LkzaWnR91Op0BIRSUELFy6ksLCQfv36YWbJDifuysrKKCwsTHYYSaHc45+7c47q6mqWLl3KwoUL6dOnT9T7auhQRCQFVVRU0KlTp3ZZZInEm5mRlZXFtttuy/r1sT3mU4WWiEiKUpElEptYhgzD+wQQh4iIiIigQktERFJUv379ePPNNwG4+eabOeuss5IcUdu2fPlyBg0alPQLLN577z0GDRq0Rfsec8wxvPbaa3GNR4WWiIi0OuPHj2ePPfYgPz+frl27sscee3DvvffinAukvSuvvJKHHnpoq48zd+5czIyampomt7n22mvJzMyksLCQwsJCBg4cyAUXXMDixYu3uv2gmBnfffdds9vccsstnHHGGeTk5ADw7LPPsvfee5OXl9foY3G++uorRowYQV5eHiNGjOCrr76qt/6vf/0r3bt3p7i4mDPPPJPKysrwulWrVnH00UeTn59P3759eeqpp8LrfvrTn/LNN9+EP0cW1C25/PLLueqqq6LaNloqtBpRXlPB0oq1yQ5DRCQl3XHHHVx44YVceumlLFmyhKVLl3L//ffzwQcfUFVV1eg+tbW1CY5y65xwwgmUlZWxatUqnn/+eZYsWcKIESNadbHVnMrKSh599FFOOeWU8LJtttmGiy66iMsvv3yz7auqqjjyyCM55ZRTWL16NaeddhpHHnlk+Pv7+uuvc8stt/DWW28xd+5c5syZwzXXXBPe//zzzycrK4ulS5fy5JNPcu655zJ9+vStzmPUqFGsW7curs9aVqHViNM+vIcjSm9NdhgiIiln7dq1jB07lnvvvZfjjjuOwsJCzIzhw4fz5JNPkp2dDcDpp5/Oueeey6GHHkp+fj7vvPMOL7/8MsOHD6eoqIjBgwdz7bXX1jv2448/Tt++fenUqRM33XRTvXXXXnttvSLh448/Zu+996ZDhw4MGzaM0tLS8LqSkhKuvvpq9tlnHwoLCznooINYsWIFAPvuuy8AHTp0oKCggI8++qjZfDMzMxkyZAjPPPMMXbp04Y477givmzhxIrvuuisdOnRg7733ZurUqeF1t956K9tuuy2FhYUMGjSIt956C/AKzttvv50BAwZQWFjIiBEjWLBgAQCzZs3iwAMPZJtttmHQoEE8++yz4eOdfvrpnH/++Rx22GEUFhayxx578P3339fLadiwYRQUFPDMM89slsfkyZPp0KEDvXr1Ci874IADOP744+nZs+dm25eWllJTU8NFF11EdnY2v//973HO8fbbbwPw6KOP8utf/5ohQ4bQsWNHrr76ah555BEA1q9fz3PPPccNN9xAQUEBP/nJTxgzZgyPP/54+NihOE499VTmz5/PEUccQUFBAbfddhsVFRWccsopdOrUiQ4dOrD77ruzdOnSet/fl19+udnvWyx0H61GLNiwMtkhiIgkzL0X/Yvvp8wNtI0Bw/px3p1ntLjdRx99RGVlJUceeWSL2z711FO88sorTJw4kaqqKj7++GMee+wxhgwZwuTJkznqqKPYddddOeqoo5gxYwbnnnsur7zyCnvssQdXXHEFCxcubPS4P/74I4cddhiPP/44Bx98MG+99RbHHnsss2bNokuXLuG2X331VXr37s0hhxzC7bffzi233MKkSZPYbrvtWLNmDRkZ0f+JTU9P58gjj+T1118H4IsvvuDMM8/kpZdeYuTIkTzxxBOMGTOGb775hrlz53L33Xfz6aef0rNnT+bOnRvu0Rs3bhwTJkzglVdeYeDAgUydOpW8vDzWr1/PgQceyPXXX8+rr77K1KlTOeiggxgyZAhDhgwB4Omnn+a1115jt91247TTTuOqq65i/PjxTJo0CTNjypQpbL/99o3G//XXX8c0L2r69OkMHTq03pWvQ4cOZfr06Rx88MFMnz693s/AsGHDWLp0KStXrmT+/Pmkp6czcODAeuvffffdzdp5/PHHee+993jooYc44IADAPjHP/7B2rVrWbBgAdnZ2Xz11Vfk5uaG9xk8eDDvv/9+1Lm0RD1aIiLSaqxYsYLOnTvXK1JCPUu5ublMmjQpvPzII49kn332IS0tjZycHEpKSthll11IS0tj55135sQTTwz/8Z0wYQKHH344++67L9nZ2dxwww1NXqr/xBNPcOihh3LooYeSlpbGgQceyMiRI3nllVfC25xxxhkMHDiQ3Nxcjj/++M3mF22Jnj17smrVKgAefPBBzjnnHPbYYw/S09M57bTTyM7O5uOPPyY9PZ3KykpmzJhBdXU1/fr1Y8CAAQA89NBDXH311QwaNAgzY9iwYXTq1ImJEyfSr18/zjjjDDIyMthtt9049thjmTBhQrj9Y445hlGjRpGRkcHJJ58cU05r1qyJ6Uah5eXlFBcX11tWXFxMWVlZo+tD78vKylrctyWZmZmsXLmS7777jvT0dEaMGEFRUVF4fWFhIWvWrIk6l5aoR0tEJMVF09OUKJ06dWLFihXU1NSEi60PP/wQgF69elFXVxfetnfv3vX2nTx5MpdffjnTpk2jqqqKyspKfvGLXwCwaNGietvn5+fTqVOnRmOYN28e//73v3nppZfCy6qrqxk9enT4c/fu3cPv8/LyKC8v39KUw3788Ue22WabcAyPPvoof//738Prq6qqWLRoEfvttx933nkn1157LdOnT+fnP/8548aNo2fPnixYsIDtttuu0ZxCw3shNTU1nHrqqXHJqWPHjlEXOgAFBQWsW7eu3rJ169aFi7WG60PvCwsLW9y3JaeeeioLFizgl7/8JWvWrOGUU07hpptuIjMzE/CKucjztLXUoyUiIq3GXnvtRXZ2Ni+++GKL2za84epJJ53EmDFjWLBgAQsXLuS3v/1t+CrFHj16hOcqAWzYsIGVKxufJtK7d29OPfVU1qxZE36tX7++0UndLcUUrbq6Ol566SV++tOfhmO46qqr6sWwYcMGTjzxxHCu77//PvPmzcPM+NOf/hTe74cffmg0p/3226/e8crLy7nvvvu2KN6Ghg4dyuzZs6PefsiQIUydOrXeVaRTp04ND2MOGTKEKVOmhNdNmTKFbt260alTJwYOHEhNTQ3ffvttvfWhfRtq+D3JzMzkmmuuYcaMGXz44YdMnDiRxx57LLx+5syZDBs2LOpcWqJCS0REWo0OHTpwzTXXcN555zFhwgTKy8upq6vjq6++avHRJ2VlZWyzzTbk5OTw2Wef1bvk/7jjjmPixIm8//77VFVVMXbs2Hq9Y5FOOeUUXnrpJV5//XVqa2upqKigtLS0yTldkbp06UJaWhpz5syJKt/q6mpmzpzJiSeeyJIlS7j44osBOPvss7n//vuZPHkyzjnWr1/Pyy+/TFlZGd988w1vv/02lZWV5OTkkJubS3p6OgBnnXUWN954I99++y3OOaZOncrKlSs5/PDDmT17No8//jjV1dVUV1fz6aefRv0A5m7dujWb06hRo1izZg0//vhjeFno3NXU1FBXV0dFRQXV1dWAN+E8PT2du+66i8rKSu6++24A9t9/fwB+9atf8c9//pMZM2awevVqbrzxRk4//XTA64085phjGDt2LOvXr+eDDz7gxRdfrNc711zs77zzDl9//TW1tbUUFRWRmZkZPn8A7777LoccckhU5yUaKrRERKRVueyyyxg3bhy33XYbXbt2pVu3bpxzzjnceuut7L333k3ud++99zJ27FgKCwu59dZbOf7448PrhgwZwj333MNJJ51Ejx496NixY70r5CL17t2bF198kZtvvpkuXbrQu3dv/vKXvzRZmEXKy8vjqquuYp999qFDhw58/PHHjW73zDPPUFBQQIcOHRgzZgydOnXi888/D1+hN3LkSB588EEuuOACOnbsyPbbbx++6q6yspLLL7+czp070717d5YtW8bNN98MwMUXX8zRRx/NQQcdRFFREb/+9a/ZuHEjhYWFvPHGG4wfP56ePXvSvXt3/vSnP9W7N1Vzrr32Wk477TQ6dOhQ72rFkKysLE4//XSeeOKJ8LLHH3+c3Nxczj33XN577z1yc3M5++yzw9u/8MILPPbYY3To0IGHH36YF154gaysLAAOPvhgLrvsMkaPHk3fvn3p27cv1113XfjY9957Lxs3bqRr166ceOKJ3HfffU32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dj46/Hlt1YaExC8isiWcc7z44ousXr2awYMHN7tthw4duOaaazjvvPN44YUXKC8vp66ujq+++or16zdNCf7Tn/7EtGnTqKmpoaysjPvuu4/tt9+eTp06bXbMXr16scMOO/DJJ5umftTV1VFRUUF1dTXOOSoqKsJXNA4cOJBdd92V6667joqKCp5//nmmTp3KscceC8DJJ5/MSy+9xHvvvcf69esZO3YsxxxzTLgX5le/+hU33ngjq1evZtasWTz44IOcfvrpjebbrVs35syZE/786aefMnnyZKqrq8nPzycnJyd8KwiAd999t8lJ/xKchBVazrmvnHMjnXNDnXNHOedWJ6rtaD3+wyQu//LJ8Ge32eymTSrqqshNz0pEWPXs2XkHAP7x7Zs8Pe8DAD5e8S3j533ArHWLuGTwEQwo7N7icc7I9Lo9b50R/f/8REQS5YgjjqCgoICioiKuuuoqHn300SZ7diJddtlljBs3jjvvvJOuXbvSrVs3zjnnHG699dbwJPQNGzZw9NFH06FDB/r378+8efOave1B6HYMIZMmTSI3N5dDDz2U+fPnk5uby0EHHRReP378eD777DM6duzI5ZdfzoQJE+jSxZsPO2TIEO6//35OPvlkunbtSllZGffee2943+uuu44BAwbQt29f9ttvPy699FIOPvjgRuO68MILmTBhAh07duT3v/8969at4+yzz6ZPnz707duXTp06cckllwDeXLMZM2Zw1FFHtXgOJb4SNUerzXh76fTw++ZuqLCxtjophdZZA/bn6zXzWVe9keP67ElJ15349/yPGFzci/4FXemR2zGq42yX5m335pKvuZkTgwxZRCQmc+fObXZ9czcXBa/XaMyYMU3O1fn73/8eUzxnnXUWw4cPZ/HixfTo0YOSkpJmRzz69evX7GTpk046iZNOOqnRddnZ2Tz88MM8/PDDjR43st299tqL2bNn19tm6tSpjc5Tuv3227nyyivJykr8361Up0KrGc452HwIHICKmipy0jMTGxDefK17dv91vWVnbf+zmI+TYxlkp2Wya8e+8QpNRKRdys7Ojuo+Xq3ZHXfckewQUpaedbiFNtYmZ+gwnoYU99Ld6UVERAKkQqsZzc/Rqk5Kj1Y8FWTmUFZTkewwRERE2i0VWs1odo5WTdvv0SrMyKW8WoWWiIhIUFRoNaPZ2zvUVpPT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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"cmap = plt.get_cmap('viridis')\n",
"colors = cmap(np.linspace(0., 1., 4))\n",
"\n",
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
"fig = plt.figure(figsize=(10, 6))\n",
"\n",
"axTmp = plt.subplot(gs[0, 0])\n",
"axTmp.plot(times_GD[:idx_stop_GD+1], residuals_GD[:idx_stop_GD+1], c=colors[0], \n",
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], residuals_BFGS[:idx_stop_BFGS+1], c=colors[2], \n",
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
"y_lim = axTmp.get_ylim()\n",
"axTmp.set_title(\"Residuals as optimization goes\", fontsize=14)\n",
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
"axTmp.set_ylabel(\"Force residuals [N]\", fontsize=12)\n",
"axTmp.set_ylim(y_lim)\n",
"plt.legend(fontsize=12)\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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8eLF9a8ji+7WXHXVVUydOjWqZdtCxZh0Ojt06cZO4V5srtLNw0VS0R133MHFF1/M5ZdfzurVq1mzZg333nsv7777LpWVTd8yraampoOj3D4//vGPKSkpYePGjfzjH/9g9erVjBo1KqELspZUVFTw8MMPc8opp9RP69atG7/85S+56qqrvrd8ZWUlkyZN4pRTTmHTpk2cdtppTJo0qf79ffnll7n55pt5/fXXWbZsGUuXLuWaa66pX/+CCy4gKyuLNWvW8Pjjj3Peeecxf/787c5jzJgxbNmyhU8++WS7txVJxZh0SnmZOboArEgK2rx5M9OmTePuu+9m8uTJ5OXlYWaMHDmSxx9/nOzsbACmTJnCeeedx5FHHklubi5vvvkmL774IiNHjqRr167079+f3/72tw22/eijjzJgwAC6d+/OTTfd1GDetdde26CQ+OCDDxg3bhwFBQWMGDGCWbNm1c8bP348V199Nfvvvz95eXkcdthhrF/vXSjgwAMPBKCgoIBwOMz777/fYr6ZmZkMHz6cJ598kp49e3LHHXfUz3vhhRfYa6+9KCgoYNy4ccydO7d+3i233MIOO+xAXl4eQ4cO5fXXXwe8ovT2229n8ODB5OXlMWrUKJYvXw7AokWLOPTQQ+nWrRtDhw7l73//e/32pkyZwgUXXMBRRx1FXl4eY8eO5euvv26Q04gRIwiHwzz55JPfy+PDDz+koKCAfv361U875JBD+NGPfkTfvn2/t/ysWbOorq7ml7/8JdnZ2fziF7/AOccbb7wBwMMPP8yZZ57J8OHDKSws5Oqrr+ahhx4CoKysjGeeeYYbbriBcDjMD37wA4499lgeffTR+m3XxXHqqafy7bffcswxxxAOh7n11lspLy/nlFNOoXv37hQUFLDPPvuwZs2aBu/viy++2OL71laBXvRVpL26ZuawraaS3y18kYuGTiQjLT3okESS2t2//Ctfz1kW130MHjGQ839/eovLvP/++1RUVDBp0qRWt/fEE0/w0ksv8cILL1BZWckHH3zAI488wvDhw5k3bx6HHHIIY8eO5bjjjmPBggWcd955vPTSS4wdO5Zf//rXrFixosntrly5kqOOOopHH32UiRMn8vrrr3PiiSeyaNEievbsWb/vf/7zn/Tv358jjjiC22+/nZtvvpnZs2ez0047UVxcTEZG9F/B6enpTJo0iZdffhmAzz77jDPOOIOZM2cyevRoHnvsMY499lgWL17MsmXLuOuuu/j444/p27cvy5Ytq28ZvPPOO3n66ad56aWXGDJkCHPnzqVLly6UlZVx6KGHcv311/PPf/6TuXPncthhhzF8+HCGDx8OwN/+9jf+9a9/sffee3PaaacxdepUpk+fzuzZszEz5syZw84779xk/F988UWbxmnNnz+fPffcs8HZiXvuuSfz589n4sSJzJ8/v8FnYMSIEaxZs4YNGzbw7bffkp6ezpAhQxrMf+utt763n0cffZS3336bBx54gEMO8W4W9Oc//5nNmzezfPlysrOz+fzzz8nJyalfZ9iwYbzzzjtR5xINtYxJpzSm+85kp2Xyt2/eZd7m5UGHIyIdZP369fTo0aNBIVPXQpWTk8Ps2bPrp0+aNIn999+ftLQ0QqEQ48ePZ4899iAtLY0999yTyZMn139BP/300xx99NEceOCBZGdnc8MNNzR7wdvHHnuMI488kiOPPJK0tDQOPfRQRo8ezUsvvVS/zOmnn86QIUPIycnhRz/60ffGO7VH37592bhxIwD3338/5557LmPHjiU9PZ3TTjuN7OxsPvjgA9LT06moqGDBggVUVVUxcOBABg8eDMADDzzA1VdfzdChQzEzRowYQffu3XnhhRcYOHAgp59+OhkZGey9996ceOKJPP300/X7P+GEExgzZgwZGRmcfPLJbcqpuLi4TVe+Ly0tJT8/v8G0/Px8SkpKmpxf97ykpKTVdVuTmZnJhg0b+Oqrr0hPT2fUqFF07dq1fn5eXh7FxcVR5xINtYxJp7R7QX+m/+Bijp99O9+WrWevwoFBhySS1Fprseoo3bt3Z/369VRXV9cXZO+99x4A/fr1o7b2v5e86d+/f4N1P/zwQ6666irmzZtHZWUlFRUV/M///A8Aq1atarB8bm4u3bt3bzKGb775hqeeeoqZM2fWT6uqqmLChAn1r3v37l3/vEuXLpSWlrY35XorV66kW7du9TE8/PDD/N///V/9/MrKSlatWsVBBx3E73//e6699lrmz5/P4Ycfzp133knfvn1Zvnw5O+20U5M51XUl1qmurubUU0+NSU6FhYVRF0MA4XCYLVu2NJi2ZcuW+oKu8fy653l5ea2u25pTTz2V5cuX85Of/ITi4mJOOeUUbrrppvqLIJeUlDQ4TrGgljHptHrnFJBh6fxu0Yt8W6YbN4ikgv3224/s7GxmzJjR6rKNL8D505/+lGOPPZbly5ezefNmzjjjjPqzL/v06VM/dgpg69atbNiwocnt9u/fn1NPPZXi4uL6R1lZWZMD0VuLKVq1tbXMnDmTAw44oD6GqVOnNohh69atnHTSSfW5vvPOO3zzzTeYGVdeeWX9ev/5z3+azOmggw5qsL3S0lLuueeedsXb2J577smSJUuiXn748OHMnTu3wdmxc+fOre8yHT58OHPmzKmfN2fOHIqKiujevTtDhgyhurqaL7/8ssH8unUba/yeZGZmcs0117BgwQLee+89XnjhBR555JH6+QsXLmTEiBFR5xINFWPSaaVbGifuOIay6gpeXPlZ0OGISAcoKCjgmmuu4fzzz+fpp5+mtLSU2tpaPv/8c8rKylpct6SkhG7duhEKhfjoo4946qmn6udNnjyZF154gXfeeYfKykqmTZvWoJUt0imnnMLMmTN5+eWXqampoby8nFmzZjU7xixSz549SUtLY+nSpVHlW1VVxcKFCznppJNYvXo1l1xyCQBnn3029957Lx9++CHOOcrKynjxxRcpKSlh8eLFvPHGG1RUVBAKhcjJySE93RtXe9ZZZ3HjjTfy5Zdf4pxj7ty5bNiwgaOPPpolS5bw6KOPUlVVRVVVFR9//DELFy6MKs6ioqIWcxozZgzFxcWsXLmyflrdsauurqa2tpby8nKqqqoAb5B8eno6f/zjH6moqOCuu+4C4OCDDwbgZz/7GX/5y19YsGABmzZt4sYbb2TKlCmA16p5wgknMG3aNMrKynj33XeZMWNGg1a+lmJ/8803+eKLL6ipqaFr165kZmbWHz+At956iyOOOCKq4xItFWPSqV067Bh6hfJZW76l9YVFJClcccUV3Hnnndx666306tWLoqIizj33XG655RbGjRvX7Hp3330306ZNIy8vj+uvv57jjz++ft7w4cP505/+xE9/+lP69OlDYWFhgzP/IvXv358ZM2bw29/+lp49e9K/f39uu+22Zou3SF26dGHq1Knsv//+FBQU8MEHHzS53JNPPkk4HKagoIBjjz2W7t278+mnn9afeTh69Gjuv/9+LrzwQgoLC9l5553rzyasqKjgqquuokePHvTu3Zu1a9fWnzl6ySWXcPzxx3PYYYfRtWtXzjzzTLZt20ZeXh6vvPIK06dPp2/fvvTu3Zsrr7yywbW7WnLttddy2mmnUVBQ0OAszDpZWVlMmTKFxx57rH7ao48+Sk5ODueddx5vv/02OTk5nH322fXLP/fcczzyyCMUFBTw4IMP8txzz5GVlQXAxIkTueKKK5gwYQIDBgxgwIABXHfddfXbvvvuu9m2bRu9evXipJNO4p577mm2ZezXv/41N954IwUFBdx+++2sXr2ayZMn07VrV4YNG8ZBBx1Ufybtxx9/TG5uLmPGjInquETL4nWBvHgbPXq0i/V1PhqbNWtWkxeiSwWdKfczP7iXL4q/5fejTmNcz/ZdVTlSZ8o9llI1b1DuTeW+cOFChg0b1vEBdaCSkpI2DSpPFkHlvW7dOg444AD+/e9/Nzg7sSNtb+4nnngiZ555JkceeWSzyzT3u2NmnzrnRje1jgbwS6d3eJ8RfFH8LQ8tfSsmxZiIiMRez549WbRoUdBhbJdnnonPbfhUjEmn96MB+zFn0zIWbVkVdCgiIiJtpjFjkhQKs8Is37qBx/8T2wvxiYiIxJuKMUkKBxZ5/fP3fvlq3G4ULCIiEg8qxiQpjOm+MxcOmUhFbRXbapq+UbCIiEgiUjEmSaMwKxeAOxa+oNYxERHpNFSMSdIYUTgAgJkrP6W4quWLP4qIiCQKFWOSNHbM7cHte3tXWF64eWUrS4uIiCQGFWOSVHbs4t3Y95efPsz6iuhvSisi0l4VFRXsttturF69OtA4vv32W8LhMDU1NW1e95JLLuHee++NQ1QSDRVjklQGhntx2k4HAbCsdG3A0YhIPAwcOJCcnBzC4TCFhYUcddRRDW7yPWXKFLKysgiHw/WPJ598sn7+9OnTGTt2LL1796ZXr16MHTuWu+++u36s6YoVKzjxxBPp0aMH+fn57LHHHvW3GmrKfffdx4EHHkjv3r0B796GEyZMID8/n4EDB35v+WXLljFhwgS6dOnCrrvuymuvvdZg/hNPPMGAAQPIzc3luOOOY+PGjfXzKioqOOOMM+jatSu9e/fmzjvvrJ+34447UlpaWn8fxfHjx/PAAw9EdUwvv/xybrrpJiordQJUEFSMSdKZ2HcEAMvK1gUciYjEy8yZMyktLeW7776jqKiIiy66qMH8K664gtLS0vrHj3/8YwDuuOMOLr74Yi6//HK+/PJL1qxZw7333su7775bX4iceuqp9O/fn2+++YYNGzbwyCOPUFRU1Gwsf/7znxvchDo3N5czzjiD2267rcnlTzrpJEaOHMmGDRu46aabmDx5MuvWeX+v5s+fz7nnnsujjz7KmjVr6NKlC+eff379utdeey1ffvkl33zzDW+++Sa33nor//rXv9p3ECP06dOHXXfdleeff367tyVtp2JMkk737K4A3Lrgeb4pVUEmksxCoRCTJ09mwYIFrS67efNmpk2bxt13383kyZPJy8vDzBg5ciSPP/442dnZgHcz6ClTppCbm0tGRgYjR47kiCOOaHKb3377LV9//TVjx46tnzZmzBhOPfVUBg0a9L3llyxZwmeffcZ1111HTk4OJ554InvssUf9bXYef/xxjjnmGA488EDC4TA33HADzz77LCUl3rCLRx55hKuvvprCwkKGDRvG2WefXd9qt2zZMsyM6upqpk6dyttvv82FF15IOBzmwgsvxDnHr371KwYNGkR+fj577rkn8+bNq49t/PjxvPjii9EdeIkp3Q5Jkk5BVhem7n4CN817lmu/eIoH9v056ab/O0S2x50LX2DJlu/iuo8hXftwybCj27TO1q1befLJJ9l3331bXfb999+noqKCSZMmtbjcvvvuywUXXMBFF13EuHHj2HHHHZtd9osvvmDQoEFkZET3dTp//nwGDRrU4GbVI0aMYP78+fXzx40bVz9v8ODBZGVlsWTJEgYNGsSqVasYMWJEg3Wfe+657+3npptu4t133+WUU07hrLPOAuDll19m9uzZfPbZZ/Tr149FixZRUFBQv86wYcPidu9FaZm+oSQpHbvDKIpC+czfvILFumelSNI57rjjKCgooGvXrrz66qtcfvnlDebffvvtFBQUUFBQQI8ePQBYv349PXr0aFA4jRs3joKCAnJycpg9ezYATz31FAcccAA33HADO+20E3vttRcff/xxk3EUFxc3KKxaU1paSn5+foNp+fn59S1fLc0vLS2tf93Uuq3JzMykpKSEJUuW4Jxj2LBh9OnTp35+Xl4excXFUecisaOWMUlKZsbvR03hpHf/wEUfP8irP/wNaWodE2m3trZYxdtzzz3HIYccQk1NDTNmzOCggw5iwYIF9YPoL7vsMm688cYG63Tv3p3169dTXV1dX5C99957APTr14/a2loACgsLufnmm7n55ptZv349l112GccddxwrVqzAzBpss7CwMOpiCCAcDrNly5YG07Zs2VJf0LU0PxwO178OhULfW7c1Bx98MBdeeCGXXXYZK1as4Pjjj+f222+na1dvaEdJSUmDljLpOPp2kqQ1KNyLQ3rvQUl1OcvLNgQdjojEQXp6OieccALp6em88847LS673377kZ2dzYwZM6Lefo8ePbjssstYtWpVg7Ma6+y5554sXbqU6urqqLY3fPhwli5d2qCAmzNnDsOHD6+fP2fOnPp5S5cupaKigiFDhlBYWEifPn0azI9ct7HGhSPAL37xC2bPns38+fNZsmRJg5MMFi5c2KALVDqOijFJWmbGmYMPZp/ug6morQo6HBGJA+ccM2bMYNOmTQwbNqzFZQsKCrjmmms4//zzefrppyktLaW2tpbPP/+csrL/3rXjyiuvZN68eVRXV1NSUsI999zDzjvvTPfu3b+3zX79+rHLLrvw0Ucf1U+rra2lvLycqqoqnHOUl5fXn6k5ZMgQ9tprL6677jrKy8v5xz/+wdy5cznxxBMBOPnkk5k5cyZvv/02ZWVlTJs2jRNOOKG+9etnP/sZN954I5s2bWLRokXcf//9TJkypcl8i4qKWLp0af3rjz/+mA8//JCqqipyc3MJhUL1l8EAeOutt5o9UUHiS92UktQG5xXxp33ODDoMEYmxY445hvT0dMyMAQMG8PDDDzfbQhTpiiuuYIcdduDWW29l3rx55ObmMmjQIG655Zb6gfNbt27l+OOP57vvviMnJ4exY8e2eMmHuktR1K0/e/ZsJkyYUD8/JyeHgw46iFmzZgHedc6mTJlCYWEhO+64I08//TQ9e/YEvJaxe++9l5NPPpkNGzZwyCGH8Ne//rV+W9dddx3nnXceAwYMICcnhyuvvJKJEyc2GdfFF1/Maaedxj333MOpp57KpEmT+NWvfsXSpUsJhUIcfvjhXHbZZQB89913LFiwgOOOO67VYyixZ531hsqjR492n3zySVz3MWvWLMaPHx/XfSQq5T4+6DA6XKrmDcq9qdwXLlzYaktTZ1dSUtKmwffNqaioYOTIkbz++usNBsQnqqbyvvTSSxk8eHCDa5olo1i95y1p7nfHzD51zo1uah21jImIiGyH7OzsqK5zlsjuuOOOoENIaRozJiIiIhIgFWMiIiIiAVIxJiIiTeqsY4pFgtLe3xkVYyIi8j3p6elUVemSMCJtUVVVFfWtsSKpGBMRke8pKChgzZo19VelF5GW1dbWsmbNmu/dzioaOptSRES+p0ePHqxYsYLFixcHHUrclJeX199WKJWkat4Q/9xzc3Pr74XaFirGRETke9LS0thxxx2DDiOuZs2axciRI4MOo8Olat6QuLmrm1JEREQkQCrGRERERAKkYkxEREQkQCrGRERERALUaW8UbmbrgG/ivJsewPo47yNRKffUk6p5g3JX7qklVfOGYHMf4Jzr2dSMTluMdQQz+6S5O6wnO+Weermnat6g3JV7aknVvCFxc1c3pYiIiEiAVIyJiIiIBEjFWMvuCzqAACn31JOqeYNyT1Wpmnuq5g0JmrvGjImIiIgESC1jIiIiIgFSMdYMM5toZovN7CszuyroeOLFzPqb2ZtmttDM5pvZxf70bmb2qpl96f8sDDrWeDGzdDP7t5m94L9OidzNrMDMnjazRf77v18q5G5mv/I/6/PM7G9mFkrWvM3sQTNba2bzIqY1m6uZ/dr/m7fYzA4PJurYaCb32/zP+1wz+4eZFUTMS+rcI+ZdZmbOzHpETEv63M3sIj+/+WZ2a8T0hMhdxVgTzCwd+BNwBLAbcJKZ7RZsVHFTDVzqnBsG7Atc4Od6FfC6c24X4HX/dbK6GFgY8TpVcv8D8C/n3K7ACLxjkNS5m9kOwC+A0c653YF04Cckb94PARMbTWsyV//3/ifAcH+du/2/hZ3VQ3w/91eB3Z1zewJLgF9DyuSOmfUHDgW+jZiW9Lmb2QRgErCnc244cLs/PWFyVzHWtDHAV865pc65SmA63huZdJxz3znnPvOfl+B9Ie+Al+/D/mIPA8cFEmCcmVk/4CjggYjJSZ+7mXUFDgT+AuCcq3TOFZMCuQMZQI6ZZQBdgFUkad7OudnAxkaTm8t1EjDdOVfhnPsP8BXe38JOqancnXOvOOeq/ZcfAP3850mfu+93wBVA5GDxVMj9POBm51yFv8xaf3rC5K5irGk7AMsjXq/wpyU1MxsIjAQ+BIqcc9+BV7ABvQIMLZ5+j/fHqTZiWirkPghYB/zV76J9wMxySfLcnXMr8f4r/hb4DtjsnHuFJM+7keZyTbW/e2cA//SfJ33uZnYssNI5N6fRrKTPHRgCHGBmH5rZW2a2jz89YXJXMdY0a2JaUp92amZh4Bngl865LUHH0xHM7GhgrXPu06BjCUAGsDdwj3NuJFBG8nTNNcsfHzUJ2AnoC+Sa2SnBRpUwUubvnplNxRui8XjdpCYWS5rczawLMBWY1tTsJqYlTe6+DKAQbyjO5cDfzcxIoNxVjDVtBdA/4nU/vK6MpGRmmXiF2OPOuWf9yWvMrI8/vw+wtrn1O7H9gWPNbBleV/TBZvYYqZH7CmCFc+5D//XTeMVZsud+CPAf59w651wV8CwwjuTPO1JzuabE3z0zOw04GjjZ/ffaTsme+2C8f0Dm+H/v+gGfmVlvkj938HJ81nk+wusJ6UEC5a5irGkfA7uY2U5mloU3wO/5gGOKC/+/g78AC51zd0bMeh44zX9+GjCjo2OLN+fcr51z/ZxzA/He4zecc6eQGrmvBpab2VB/0g+BBSR/7t8C+5pZF/+z/0O8cZLJnnek5nJ9HviJmWWb2U7ALsBHAcQXN2Y2EbgSONY5tzViVlLn7pz7wjnXyzk30P97twLY2/87kNS5+54DDgYwsyFAFt7NwhMnd+ecHk08gCPxzrb5GpgadDxxzPMHeM2yc4HP/ceRQHe8M62+9H92CzrWOB+H8cAL/vOUyB3YC/jEf++fw2vGT/rcgeuARcA84FEgO1nzBv6GNzauCu8L+MyWcsXryvoaWAwcEXT8ccj9K7wxQnV/6+5NldwbzV8G9EiV3PGKr8f83/nPgIMTLXddgV9EREQkQOqmFBEREQmQijERERGRAKkYExEREQmQijERERGRAKkYExEREQmQijERSWlmdoCZLe6gfZ1sZq90wH4Gmpkzs1IzOyeK5d8ws3IzeyfesYnI96kYE5EmmdlPzewT/wv9OzP7p5n9IOi4IpnZeDNb0cZ1nJntXPfaOfe2c25oS+u0M7a6gigjYl+PO+cOi/W+WlDgnLuvtYWccwcDP++AeESkCSrGROR7zOwSvJuo/xYoAnYE7sa7r6OIiMSQijERacDM8oHrgQucc88658qcc1XOuZnOucv9ZbLN7Pdmtsp//N7Msv15481shZldYWZr/Va148zsSDNbYmYbzex/I/Z3rZk9bWZPmlmJmX1mZiMi5jdoyTKzh8zsRjPLBf4J9PVb70rNrK+ZjTGz982s2N/3Xf5tzTCz2f5m5vjL/7hx65qZDTOzWf76883s2Eb7/pOZvejH+qGZDW7mUNbtq9jf135mNiWyK9DP7Xwz+9Lf3g1mNtiPf4uZ/b0udn/5o83scz+298xszza8rz3M7AV/3Y1m9raZ6TtAJAHoF1FEGtsPCAH/aGGZqcC+eLdUGgGMAX4TMb+3v40dgGnA/cApwCjgAGCamQ2KWH4S8BTQDXgCeM68G9g3yzlXBhwBrHLOhf3HKqAG+BXejYD3w7v/5Pn+Ogf6q4/wl38ycpv+PmcCrwC9gIuAxyPu4QlwEt4tlQrxbq9zUzMh1u2rwN/X+80sNxHvuOwLXAHcB5yMdwPj3f39YWZ7Aw8C5+Ld0ujPwPN1RXAULsW7PUxPvNbO/8W7FZqIBEzFmIg01h1Y75yrbmGZk4HrnXNrnXPr8IqTUyPmVwE3OeeqgOl4hdEfnHMlzrn5wHwgslXnU+fc0/7yd+IVcvu2J3jn3KfOuQ+cc9XOuWV4RctBUa6+LxAGbnbOVTrn3gBewC+IfM865z7yj8/jeAXp9rjFObfFPy7zgFecc0udc5vxWv5G+sudDfzZOfehc67GOfcwUEH0x6kK6AMM8Fs633a6H55IQlAxJiKNbQB6RA48b0Jf4JuI19/40+q34Zyr8Z9v83+uiZi/Da/oqbO87olzrhavBSdye1EzsyF+d9xqM9uCN+6tR5Sr9wWW+zHU+Qavha/O6ojnW2mYR3s0Pi7NHacBwKV+N2OxmRXjtZ5Fe5xuw2vJe8XMlprZVdsXtojEiooxEWnsfaAcOK6FZVbhFQd1dvSntVf/uif+OKZ+EdvbCnSJWLZ3xPOmWnbuARYBuzjnuuJ1x1mUcawC+jcaS7UjsDLK9SPFutVpOV5rY0HEo4tz7m9RBeO1Sl7qnBsEHANcYmY/jHGMItIOKsZEpAG/e2wa8Cd/4H0XM8s0syPM7FZ/sb8BvzGznmbWw1/+se3Y7SgzO8FvjfslXvfbB/68z4Gfmlm6mU2kYZfjGqC7f9JBnTxgC1BqZrsC5zXa1xpgEE37ECgDrvBzHo9XuExvR07rgNoW9tVW9wM/N7Ox5sk1s6PMLC+alf3B/zubmeEdnxr/ISIBUzEmIt/jnLsTuARvUP46vFaZC4Hn/EVuBD4B5gJfAJ/509prBvBjYBPe2LMT/PFjABfjFUTFeGPV6mLAObcIrzBc6nfd9QUuA34KlOAVMA0G6QPXAg/7y/+oUd6VwLF4Jwasx7ucx8/8/bSJc24r3uD+d/19tWsMXMT2PsEbN3YX3nH6CpjShk3sArwGlOK1ft7tnJu1PTGJSGyYxm+KSJDM7FpgZ+fcKUHHkizMbACwGK+7+XLn3P2tLP8q3okAHznn1HUp0sFaGqArIiKdkHPuG7wzUqNd/tA4hiMirVA3pYiIiEiA1E0pIiIiEiC1jImIiIgESMWYiIiISIBUjImIiIgESMWYiIiISIBUjImIiIgESMWYiIiISID+PydaubzH8GeNAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
"fig = plt.figure(figsize=(10, 6))\n",
"\n",
"axTmp = plt.subplot(gs[0, 0])\n",
"axTmp.plot(times_GD[:idx_stop_GD+1], energy_GD[:idx_stop_GD+1], c=colors[0], \n",
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], energy_BFGS[:idx_stop_BFGS+1], c=colors[2], \n",
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
"y_lim = axTmp.get_ylim()\n",
"axTmp.set_title(\"Total energy as optimization goes\", fontsize=14)\n",
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
"axTmp.set_ylabel(\"Energy [J]\", fontsize=12)\n",
"axTmp.set_ylim(y_lim)\n",
"plt.legend(fontsize=12)\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.7"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}