{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\nExample performing a sensitivity analysis on a new model. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Deriv prog model was selected because the model can be described as x' = x + dx*dt\nfrom prog_models.models.thrown_object import ThrownObject\nimport numpy as np\n\ndef run_example():\n # Demo model\n # Step 1: Create instance of model\n m = ThrownObject()\n\n # Step 2: Setup for simulation \n def future_load(t, x=None):\n return m.InputContainer({})\n\n # Step 3: Setup range on parameters considered\n thrower_height_range = np.arange(1.2, 2.1, 0.1)\n\n # Step 4: Sim for each \n event = 'impact'\n eods = np.empty(len(thrower_height_range))\n for (i, thrower_height) in zip(range(len(thrower_height_range)), thrower_height_range):\n m.parameters['thrower_height'] = thrower_height\n simulated_results = m.simulate_to_threshold(future_load, threshold_keys=[event], dt =1e-3, save_freq =10)\n eods[i] = simulated_results.times[-1]\n\n # Step 5: Analysis\n print('For a reasonable range of heights, impact time is between {} and {}'.format(round(eods[0],3), round(eods[-1],3)))\n sensitivity = (eods[-1]-eods[0])/(thrower_height_range[-1] - thrower_height_range[0])\n print(' - Average sensitivity: {} s per cm height'.format(round(sensitivity/100, 6)))\n print(\" - It seems impact time is not very sensitive to thrower's height\")\n\n # Now lets repeat for throw speed\n throw_speed_range = np.arange(20, 40, 1)\n eods = np.empty(len(throw_speed_range))\n for (i, throw_speed) in zip(range(len(throw_speed_range)), throw_speed_range):\n m.parameters['throwing_speed'] = throw_speed\n simulated_results = m.simulate_to_threshold(future_load, threshold_keys=[event], options={'dt':1e-3, 'save_freq':10})\n eods[i] = simulated_results.times[-1]\n\n print('\\nFor a reasonable range of throwing speeds, impact time is between {} and {}'.format(round(eods[0],3), round(eods[-1],3)))\n sensitivity = (eods[-1]-eods[0])/(throw_speed_range[-1] - throw_speed_range[0])\n print(' - Average sensitivity: {} s per m/s speed'.format(round(sensitivity/100, 6)))\n print(\" - It seems impact time is much more dependent on throwing speed\")\n\n# This allows the module to be executed directly \nif __name__=='__main__':\n run_example()" ] } ], "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.9" } }, "nbformat": 4, "nbformat_minor": 0 }