{ "cells": [ { "cell_type": "markdown", "id": "4c085fd8-7546-46f7-920e-e6a7087b4fa1", "metadata": {}, "source": [ "# Using ParamFitter" ] }, { "cell_type": "markdown", "id": "8c88f1e1-f5f2-4f85-a6eb-cc0e6d5ac428", "metadata": {}, "source": [ "Once a sample has been created, one may want to fit the parameters to match some observed data. This is facilitated by `ParamFitter` class. It uses `scipy`'s `least_square` function to fit. However, internally it takes care of converting between the `ParamDict` and `numpy` vector as well as only varying the non-fixed parameters. " ] }, { "cell_type": "code", "execution_count": 1, "id": "67514e76-92db-4d77-a2f1-b540adfd1a38", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mInit signature:\u001b[0m \u001b[0mpmt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mParamFitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msim_func\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moutput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m \n", "A class to fit parameters of a simulation function to a given output\n", "\n", "Parameters\n", "----------\n", "sim_func : function\n", " A function that takes in a dictionary of parameters and returns a numpy array of the same shape as the output\n", "\n", "output : numpy array\n", " A numpy array of the same shape as the output of the sim_func to be fitted\n", "\n", "params : ParamDict\n", " A dictionary of parameters to be varied\n", "\u001b[0;31mFile:\u001b[0m /usr/local/lib/python3.9/site-packages/pymecht/ParamFitter.py\n", "\u001b[0;31mType:\u001b[0m type\n", "\u001b[0;31mSubclasses:\u001b[0m \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pymecht as pmt\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "\n", "pmt.ParamFitter?" ] }, { "cell_type": "markdown", "id": "0784d0ad-56e2-44d3-b29f-0ca251dca112", "metadata": {}, "source": [ "As we can see, creating an instance of `ParamFitter` requires three main things: \n", "\n", "1) a Python function that takes in parameters, perform the simulation and returns the modeled output\n", "2) the observed output array\n", "3) parameters\n", "\n", "The ability to provide a function for the simulation provides flexibility in how the problem can be setup. In a simple setting it could be just performing a single simulation of a single sample. In more complex scenarios, one can perform multiple simulations of multiple samples and combine their output, potentially through a weighting function. We can start with a simple case" ] }, { "cell_type": "markdown", "id": "75dab553-7763-4a5e-b9fe-9b5c10651a44", "metadata": {}, "source": [ "## Simple fitting" ] }, { "cell_type": "markdown", "id": "10b7748d-063f-4fd1-a873-ac3b2510509c", "metadata": {}, "source": [ "Assume a uniaxial extension experiment, which was force controlled. That is the applied stress was varied linearly and the stretch was observed." ] }, { "cell_type": "code", "execution_count": 2, "id": "9c1aa307-2708-4467-89ec-ff5bdf484c51", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "An object of type UniaxialExtensionwith stretch as input, cauchy as output, and the following material\n", "Material model with 1 component:\n", "Component1: YEOH\n", " ------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 No 1.00e-04 1.00e+03 \n", "A0 1.00 No 1.00e-04 1.00e+03 \n", "c1_0 1.00 No 1.00e-04 1.00e+02 \n", "c2_0 1.00 No 0.00 1.00e+02 \n", "c3_0 1.00 No 0.00 1.00e+02 \n", "c4_0 0.00 No 0.00 1.00e+02 \n", "------------------------------------------------------------------\n", "\n" ] } ], "source": [ "mat = pmt.MatModel('yeoh')\n", "sample = pmt.UniaxialExtension(mat, force_measure='cauchy')\n", "params = sample.parameters\n", "print(sample, params)\n", "\n", "applied_stress = np.linspace(0,50,10)\n", "observed_stretch = np.array([1., 1.09144422, 1.17650268, 1.25077441, 1.31313774, 1.36499585,\n", " 1.40850493, 1.4455964, 1.4777529, 1.50606163])\n", "\n", "def simulate(param_vary):\n", " mod_stretch = sample.force_controlled(applied_stress,param_vary) #make sure that the argument param_vary is used\n", " return mod_stretch\n", " " ] }, { "cell_type": "markdown", "id": "0fac1525-f7ac-4791-aa0c-696fdaf6f04f", "metadata": {}, "source": [ "For stress and stretch, the length and cross-sectional area would not be relevant. Thus, it is best to fix them. We will also fix c4_0. Also, note that when creating the instance of `ParamFitter` it will call the simulation function once to check that it returns an array of same size as the observations. Otherwise, it will raise an error." ] }, { "cell_type": "code", "execution_count": 3, "id": "e9517103-cb48-4084-aab2-af3b86d8d285", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error occured ('Output and simulation results are of different shape', (10,), (9,))\n", "Parameter fitting instance created with the following settings\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "c1_0 1.00 No 1.00e-04 1.00e+02 \n", "c2_0 1.00 No 0.00 1.00e+02 \n", "c3_0 1.00 No 0.00 1.00e+02 \n", "c4_0 0.00 Yes - - \n", "------------------------------------------------------------------\n", "\n", "3 parameters will be fitted.\n" ] } ], "source": [ "params.fix('L0')\n", "params.fix('A0')\n", "params.fix('c4_0')\n", "try:\n", " param_fitter = pmt.ParamFitter(simulate,observed_stretch[:-1],params)\n", "except ValueError as e:\n", " print(\"Error occured\", e)\n", "\n", "param_fitter = pmt.ParamFitter(simulate,observed_stretch,params)" ] }, { "cell_type": "markdown", "id": "ccb86e67-85d1-4415-97e8-27bccacccfdc", "metadata": {}, "source": [ "Once the `ParamFitter` instance has been created successfully, one can just do `.fit()` to perform the fitting." ] }, { "cell_type": "code", "execution_count": 4, "id": "f0b53f88-2a2f-406a-a214-1df1e640a095", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 4.5172e-01 2.56e+01 \n", " 1 2 1.6712e-01 2.85e-01 1.73e+00 4.88e+00 \n", " 2 3 7.2197e-02 9.49e-02 1.72e+00 2.42e+00 \n", " 3 4 8.9118e-03 6.33e-02 3.43e+00 5.76e-01 \n", " 4 5 3.2355e-04 8.59e-03 4.96e+00 2.38e-03 \n", " 5 6 6.3679e-05 2.60e-04 1.34e+00 1.68e-03 \n", " 6 7 4.2171e-05 2.15e-05 7.10e-01 2.86e-03 \n", " 7 8 1.1726e-06 4.10e-05 2.70e+00 6.08e-04 \n", " 8 9 1.7271e-10 1.17e-06 5.48e-01 2.90e-05 \n", " 9 10 3.0903e-16 1.73e-10 5.55e-03 8.86e-09 \n", "`gtol` termination condition is satisfied.\n", "Function evaluations 10, initial cost 4.5172e-01, final cost 3.0903e-16, first-order optimality 8.86e-09.\n", "Fitting completed, with the following results\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "c1_0 10.00 No 1.00e-04 1.00e+02 \n", "c2_0 2.00 No 0.00 1.00e+02 \n", "c3_0 3.00 No 0.00 1.00e+02 \n", "c4_0 0.00 Yes - - \n", "------------------------------------------------------------------\n", "\n" ] }, { "data": { "text/plain": [ " message: `gtol` termination condition is satisfied.\n", " success: True\n", " status: 1\n", " fun: [ 0.000e+00 5.430e-09 3.199e-09 3.850e-10 -2.325e-09\n", " -1.012e-08 -5.783e-09 2.076e-08 -2.431e-09 3.523e-10]\n", " x: [ 1.000e+01 2.000e+00 3.000e+00]\n", " cost: 3.0902897658340763e-16\n", " jac: [[ 0.000e+00 0.000e+00 0.000e+00]\n", " [-8.833e-03 -4.184e-04 -1.487e-05]\n", " ...\n", " [-1.632e-02 -1.753e-02 -1.413e-02]\n", " [-1.540e-02 -1.837e-02 -1.642e-02]]\n", " grad: [-8.290e-11 -8.063e-11 -9.129e-11]\n", " optimality: 8.855302470909847e-09\n", " active_mask: [0 0 0]\n", " nfev: 10\n", " njev: 10" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "param_fitter.fit()" ] }, { "cell_type": "markdown", "id": "bd3d8da6-594e-4381-82f4-cae53c172f94", "metadata": {}, "source": [ "The results have converged, and we can plot to make sure that it is a good fit." ] }, { "cell_type": "code", "execution_count": 5, "id": "aa483f0a-7c3b-4bde-ba4c-fee468921351", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAM8AAACfCAYAAABeD42oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAsTAAALEwEAmpwYAAAUNklEQVR4nO3deXhU5dnH8e+dSYIgmxCkrCLVulRANCCKIooVBEFKKYKAVFHUKoUuVqla9RKhmkoRcQNFQGSRRaB1iYq8KipFECUJGsWt7HtCQkIymdzvH+cEg4ZkksnkZGbuz3XlSs4yM/eQ/HjOPOd5zhFVxRhTeXFeF2BMpLLwGFNFFh5jqsjCY0wVWXiMqSILjzFVFO91AZWVlJSk7dq187oMEyM2bNiwT1WblbUt4sLTrl071q9f73UZJkaIyPfH2xZx4TGmuizfuJ2U1Ex2ZOXTsnFd7ux9BgM7twr68RYeE5OWb9zOhGVp5PsDJOJnexZMWJYGEHSArMPAxKQpb2TQLbCe6QnTWFfn99Qnj3x/gJTUzKCfw1oeEztUYVcafLaAZUfmkZR4iANan1cCF1MHP7nAjqz8oJ/OwmOi36GdkLYYPlsIezLAl0ia73xeOnIR7xZ3wl8qBi0b1w36aS08JjoV5sEXr8JnC+Cb1aDF0LoL9HsMfjmI7Mx8PliWhr84cPQhdRN83Nn7jKBfwsJjIlrpHrNWjeowOTmXS/LegowVUJgDjdrAJX+GjkMh6bSjjxvY2fluvW0mJpX0mDUv2sb4+DUMyl9Dmw/24vfVI6HDIOg0FE7pDnFl94sN7NyqUmH5MQuPiUyBIta9NpuZvMrFdTIIqLCmuAMphUNIb3AJ7wy8KuwlWHhMZMndAxvmwIYXmOTfzra4JB71D2FJ4FL2cBIAkl1cI6VYeEztpwpb/wvrZsLmFVDsh/aXcVf+SJbk/JIAvmN2r0yPWSgsPKb2KjzsdDGvew52p0GdRtDlJugyGpJO58KN21npjhIoUdkes1BYeIynyhxf1iYf1j8PG1+Cgmxofg5cPRU6DoHEE48+tuTDfig9ZqGw8BjPlB5fFkcxZx1aQ9Ly+0E2QVw8nH0NdLkZ2nYDkTKfI9Qes1BYeIxnUlIz8flzuMW3ipHxb9Fa9rFTmzAzfhg3j3sQGjT3usRyWXiMN/IOcG3uXEbVSaWR5PFh4GwmBkbwdvF5BAriubmWBwcsPKam5eyGj56Aj2fxh/jDvBHowvSia0jX9kd3aVVDvWWhsvCYmpG1FT54HD6Z63Q1nzOYVUnD+ePbR8hXb3rLQmXhMeG1/2tYM8UZ0YzAucOg+3ho+nN6AZMbhjab00sWHhMeuzPg/ccg4xXwJULyaOj+B2jU+pjdvOwtC5WFx4Tkx+dpHu5aSM/dcyHzVUisDxeNhQvvgPone11qtQtbeERkFnA1sEdVzylnvy7AR8BQVV0SrnpM9St9nqarfM4dh5fT4700ChMakthzAnQdA/WaeF1m2ISz5ZkNTAfmHm8HEfEBjwBvhrEOEyYpqZm0L/qaexLmcZFvM3u1IZP9w3inTn/e6tnP6/LCLmzhUdX3RKRdBbuNBZYCXcJVhwmTnF2My53K4MT3OEh9HvSPZH6gFwUkItleF1czPPvMIyKtgF8Dl2HhiRyFefDRdFgzlV/HFzCzqC9PFg3kED+MOaupUc1e87LDYCpwl6oWy3HGLZUQkTHAGIC2bduGvzLzU8XFkL4E3n4ADm2HswawutXvmZqaTT6ReZ4mVF6GJxlY6AYnCegrIkWquvzHO6rqDGAGQHJyst0Hsqb9by2k/g22b4AW58KgmdCuO1cCk0+M3PM0ofIsPKp6asnPIjIb+E9ZwTEeOvid09JkvAINWsDAZ6DjtcdcEyCSz9OEKpxd1QuAnkCSiGwD7gcSAFT1mXC9rqkGRw45JzjXPg0SB5fe7ZzgLDWXxoS3t21YJfb9XbjqMOUrfZKzTaNEpp2ZxrlfPQl5+6DTMLj8PmgUmy1LRWyEQQwrfZLz4rg07s2fx5mfbWVfk/NIGr4YWp3ndYm1moUnhqWkZlLXf5B/Jsyin28d/ytuxq2F40k73IMPLDgVsvDEsA6H3mVinVk0II8U/xBmBvpRSAKSfcTr0iKChScW5R2A1+7kmcQlpBW34zr/PXypbY5ujpWTnKGy8MSazNfh3+Mgbz+fnzmW6zK6kaM/nKSOpZOcobKbW8WK/Cx45TZYMBRObAY3r+asoRN5aFBnWjWui+BMf548qEPMnrepLGt5YsFXb8PKsZC7G3rcCT3+CvGJQGyf5AyVhSeaHTkEb94Ln8yBZmfC0HnQ6nyvq4oaFp5o9c3/wYo7nEGc3cdDzwmQcILXVUUVC0+E+/E06Lt7tab/nmfh4+eg6WlwYyq06ep1mVEpqPCIyCCcGZ8nA+J+qao2DGNtpgKlRwgAtMr+hE7/uRWVPUi326HXfZBg3c7hEmxv26PAAFVtpKoNVbWBBcd7KamZ5PsD1KGQ++JfZGHiRIoVbk+cCH0mWXDCLNjDtt2q+nlYKzGVtiMrn+Yc4NnEKZwb9w1zin7FP4qGcaTQPtvUhHLD4x6uAawXkUXAcqCgZLuqLgtfaaYiVzb8nocKHqEeRxhT+EfeLHZms0fK5WojXUUtT/9SP+cBV5ZaVsDC45UNc3jafx9bacrwwr/xlToXE7QRAjWn3PCo6g01VYgJUsAPb0yAj2cS9/PLSf/FRPJW70ZicBq014LtbZsDjFPVLHf5JOAxVb0xjLWZHzu8D14eBd+vca7E2esB+vni6XfBL72uLCYF22HQsSQ4AKp6UEQ6h6ckU6adm2DhdXB4r3MBjo5DvK4o5gXbVR3ntjYAiEgT7ARrzUlfCs9fCVoMN75hwaklgg3AY8BHIrLYXf4tMCk8JZmjigPwzkOw5l/Qphtc+2JUXjA9UgUVHlWdKyLrgcvdVYNUdXP4yjLkZ8HSm2DLW3D+DXDVo0dHQpvaIdgOgxdVdSSwuYx1prrt/RIWDnOum9ZvCnQZ7XVFpgzBHrYd053j3t3AxrZXk9KDOwc3SGeSTiMh8QQY9W845SKvyzPHUW6HgYhMEJEcoKOIHBKRHHd5D7CiRiqMciWDO7dn5XGbbzmPFE7mS38zUrsvtODUchWdJJ0MTBaRyao6oYZqiikpqZkU+/OZnvAMV/vWsjxwEXf7b6bp+zn07u51daY8wR623SMiI4BTVfUhEWkDtFDVdWGsLSYcyMpiZsIUevjSmOwfxrOBqwFhR1a+16WZCgR7nudJ4ELgOnc5111nQlGQw/y6KXSPS+cv/lt4NtAfZ6qUXf4pEgTb8lygqueJyEY4OsLA+k1DkZ8FLw2mE5ncqWNZGuh2dJMN7owMwbY8freHTQFEpBlQHLaqol3eAZg7AHZ8StyQOVzy61vt8k8RKNiWZxrwCnCyiDwMDAbuDVtV0Sx3D8y9BvZ/DUPnwy+uZCBYWCJQheERkTjgW+CvQC+cg/KBNrO0Cg7tgDkDnCvaDH8Z2vf0uiITggrD494z9ElV7Qx8UQM1Raes/8Gc/nB4P4xYaudwokCwn3lWichvpKI775YiIrNEZI+IpB9n+3AR2SQiaSLyoYh0Cva5I87+r+GFvpB/EK5fbsGJEsGG5xZgMVBQaqTBoQoeMxvoU872b4FLVbUD8BDuDXujzt4vneAUHnaG27RO9roiU02CHVXdoLJPrKrviUi7crZ/WGpxLdC6sq9R6+1KdzoHJA5ueA1OPsvrikw1CqrlEZFVwawLwWjg9Wp8Pu/t2AhzrgZfItzwugUnClV06akTgHo4d7Q+iZLT39AQqJa+VRG5DCc8F5ezzxhgDEDbtm2r42XDa+s6mPcbqNsYrl8JTU71uiITBhUdtt0CjAdaAhtKrc8Bpof64iLSEXgOuEpV9x9vP1WdgfuZKDk5WUN93epWekpB34Zf83hgEvGNWjifcRpF39GocVR02PYhcBHwF1VtDzwIpAPvAvNDeWERaYtz3beRqvplKM/lpR+mFORzcdwm/lnwEN8VNeX1Li9YcKJcReF5FihQ1SdEpAcwGZgDZFNB75iILAA+As4QkW0iMlpEbhWRW91d/g40BZ4SkU/dad4Rp+R60ZfHfcJzCf/kW23BkIJ7mfjuAa9LM2FW0WGbT1VL/gquBWao6lJgqYh8Wt4DVXVYBdtvAm4KttDaakdWPhfGZfB0wlS+0LZcX3g32dRHbEpB1Kuo5fGJSEnAegHvlNpml54CLm24ixkJU/hOf3Y0OGBTCmJBRQFYALwrIvuAfOB9ABE5DefQLbYd+JZnZBIHqMeowruOBsemFMSGiqZhP+yez2kBvKmqJT1dccDYcBdXq+XuhXmDOCEuwOZec/F9WGTXi44xwQwMXVvGuojtHasWBTkw/7dwaCeMWskVbbpyRQ+vizI1zT63VFZRISwa6Vw7etgCu99nDLPwVEZxMSy/Db5ZDdc8Bb/o7XVFxkPBjqo2qvDmPZC+BK54ADoP97oi4zELT7A+eBzWPgUX3Abdx3tdjakFLDzB+HQ+vH0/nDMYek+C4OcEmihm4anIl6mw4g7negMDn4Y4+yczDvtLKM/Wj53bGP6sA1w7z27xYY5h4TmevZnOuZyGLWD4EqhT6cm0JspZeMqSvR1eHARxCTBiGdRv5nVFphay8zw/ln/QmQV6JBtueNVmgZrjsvDww0zQ/VnZLKr7COfIFnwjlkKL6L0algldzB+2lcwE3ZWVy7SEJ+hQ/AV/9t/O8uzTvC7N1HIxHx5nJmgRD8bP5krfBh4oup7l/q6kpGZ6XZqp5WI+PDuy8rnR9wYj4lfxVNEA5gZ6H11vTHliPjy/aZDBPfHzeD3QhZSiIUfX20xQU5HYDs/uDCYX/4svaMef/Leh7j+HzQQ1wYjd8OTugflDSajXiK29Z9Gk8Ul2cylTKbHZVe0/AguHw+G9cOPr9GnZmT524wJTSbEXHlVYeQdsWwdDXoSWnb2uyESo2Dtsey8F0hZDr7/D2QO8rsZEsNgKT/oyWP0wdBoGF//J62pMhIud8Gzf4Fx/oE036P+4TWgzIYuN8GRvgwXDoH5zGPoSxNfxuiITBaK/w6AgFxYMBX8+XL8CTkzyuiITJaI7PMXFsGwM7M6A6xbb3dlMtYru8Kx6ADJfhasehdOv8LoaE2Wi9zPPxnnO5aK63ARdx3hdjYlC0Rme79bAv8dD+8ugzyPWs2bCImzhEZFZIrJHRNKPs11EZJqIbBGRTSJyXrW88P6vYdEIZ/r0b2eDL7qPTI13wvmXNRvnpr9zj7P9KuB09+sC4Gn3e6WVTKPOzdrLyroP8rMEpc51i5y7URsTJmFreVT1PaC8G3NeA8xVx1qgsYi0qOzrlEyj3p2Vw/SEabQo3sVN+eNY/r2dyzHh5eVnnlbA1lLL29x1lVJyQ93bfSu4xJfOPUWjed9/hk2jNmEXER8IRGQMMAagbdu2x2wrmS49O9CbnTRhcaDnMeuNCRcvW57tQJtSy63ddT+hqjNUNVlVk5s1O/YChCXTpbOpz8uBy36y3phw8TI8K4Hr3V63bkC2qu6s7JPc2fsM6ib4jlln06hNTQjbYZuILAB6Akkisg24H0gAUNVngNeAvsAWIA+4oSqvUzJdOiU1kx12Q11Tg+SHG1xHhuTkZF2/fr3XZZgYISIbVDW5zG2RFh4R2Qt8f5zNScC+GizHC/Yea9Ypqlrmlf4jLjzlEZH1x/tfIlrYe6w9onNsmzE1wMJjTBVFW3hmeF1ADbD3WEtE1WceY2pStLU8xtSYqAmPiPQRkUx3ftDdXtdTHUSkjYisFpHNIpIhIuPc9U1E5C0R+cr9fpLXtYZCRHwislFE/uMunyoi/3V/l4tEpFbehjwqwiMiPuBJnDlCZwPDRORsb6uqFkXAn1X1bKAbcLv7vu4GVqnq6cAqdzmSjQM+L7X8CPAvVT0NOAiM9qSqCkRFeICuwBZV/UZVC4GFOPOFIpqq7lTVT9yfc3D+wFrhvLc57m5zgIGeFFgNRKQ10A94zl0W4HJgibtLrX1/0RKeapkbVJuJSDugM/BfoHmpQbS7gOZe1VUNpgJ/BYrd5aZAlqoWucu19ncZLeGJaiJSH1gKjFfVQ6W3qdNdGpFdpiJyNbBHVTd4XUtVRMRkuCAEPTco0ohIAk5wXlLVZe7q3SLSQlV3ulPX93hXYUi6AwNEpC9wAtAQeBxnSn682/rU2t9ltLQ8HwOnu700icBQnPlCEc09/n8e+FxVp5TatBIY5f48ClhR07VVB1WdoKqtVbUdzu/sHVUdDqwGBru71dr3FxXhcf+HugNIxflQ/bKqZnhbVbXoDowELheRT92vvsA/gF+JyFfAFe5yNLkL+JOIbMH5DPS8x/WUyUYYGFNFUdHyGOMFC48xVWThMaaKLDzGVJGFx5gqsvBEIBG5xx1lvcntvr5ARMaLSD2va4sl1lUdYUTkQmAK0FNVC0QkCUgEPgSSVfUnV50REZ+qBmq41KhnLU/kaQHsU9UCADcsg4GWwGoRWQ0gIrki8piIfAZcKCIjRGSd21I9686h8YnIbBFJF5E0Efmj+9g/uHOINonIQo/eZ61nLU+EcQeJrgHqAW8Di1T1XRH5jlItj4gocK2qviwiZwGPAoNU1S8iTwFrgQzgH6r6K/cxjVU1S0R2AKe6LVtjVc2q6fcZCazliTCqmgucj3PXiL3AIhH5XRm7BnAGlAL0ch/zsYh86i63B74B2ovIEyLSBygZsb0JeElERuBMyDNlsJYnwonIYJzBkx04tuXJVdX67s9jgZaqOqGMx9cHeuOMoTugqje6M3N7AP1xZud2KDW/xris5YkwInKGiJxeatW5OJcfzgEaHOdhq4DBInKy+xxNROQUt7MhTlWXAvcC54lIHNBGVVfjDNBsBNQPz7uJbNEynyeW1AeeEJHGOIdUW3AO4YYBb4jIDlW9rPQDVHWziNwLvOmGww/cDuQDL7jrACYAPmCeiDQCBJhmn3nKZodtxlSRHbYZU0UWHmOqyMJjTBVZeIypIguPMVVk4TGmiiw8xlSRhceYKvp/kdkA78bwwHEAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(1,1,figsize=(4*0.7,3*0.7))\n", "\n", "ax.plot(applied_stress, observed_stretch,'o',label='Observed data')\n", "ax.plot(applied_stress, simulate(params),'-',label='Fitted model')\n", "ax.set_xlabel('Stress')\n", "ax.set_ylabel('Stretch')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e7f14c26-0aad-4067-aac0-5d46762cf774", "metadata": {}, "source": [ "## Adding fiber direction " ] }, { "cell_type": "markdown", "id": "0246dcc1-9332-4b76-9231-8c93a7c52240", "metadata": {}, "source": [ "For an anisotropic material, one has to specify the fiber direction. It could be included as a fitting parameter as shown below." ] }, { "cell_type": "code", "execution_count": 6, "id": "4656c9dd-9b52-43ce-9c73-1c892ab0a592", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "An object of type UniaxialExtensionwith stretch as input, cauchy as output, and the following material\n", "Material model with 2 components:\n", "Component1: GOH\n", "Component2: NH\n", " ------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "k1_0 10.00 No 0.10 30.00 \n", "k2_0 10.00 No 0.10 30.00 \n", "k3_0 0.10 No 0.00 0.33 \n", "mu_1 1.00 No 1.00e-04 1.00e+02 \n", "phi 30.00 No 0.00 90.00 \n", "------------------------------------------------------------------\n", "\n", "Parameter fitting instance created with the following settings\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "k1_0 10.00 No 0.10 30.00 \n", "k2_0 10.00 No 0.10 30.00 \n", "k3_0 0.10 No 0.00 0.33 \n", "mu_1 1.00 No 1.00e-04 1.00e+02 \n", "phi 30.00 No 0.00 90.00 \n", "------------------------------------------------------------------\n", "\n", "5 parameters will be fitted.\n", " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 6.4881e-02 3.41e-01 \n", " 1 2 2.0477e-02 4.44e-02 7.98e+00 2.23e-01 \n", " 2 3 3.1627e-03 1.73e-02 1.30e+01 7.88e-02 \n", " 3 4 2.3278e-04 2.93e-03 3.78e+00 1.56e-02 \n", " 4 5 1.0941e-05 2.22e-04 1.74e+00 2.89e-03 \n", " 5 6 5.6819e-06 5.26e-06 3.31e-01 3.30e-05 \n", " 6 7 5.4415e-06 2.40e-07 9.64e-01 1.49e-03 \n", " 7 8 5.0847e-06 3.57e-07 1.09e-01 8.32e-06 \n", " 8 12 5.0731e-06 1.15e-08 2.76e-01 1.21e-04 \n", " 9 13 5.0615e-06 1.16e-08 5.23e-01 3.40e-04 \n", " 10 14 5.0293e-06 3.22e-08 4.37e-01 2.27e-04 \n", " 11 15 5.0103e-06 1.90e-08 5.23e-01 3.28e-04 \n", " 12 16 4.9793e-06 3.10e-08 4.55e-01 2.47e-04 \n", " 13 17 4.9674e-06 1.19e-08 6.03e-01 4.46e-04 \n", " 14 18 4.9222e-06 4.52e-08 3.37e-01 1.36e-04 \n", " 15 20 4.9047e-06 1.75e-08 2.52e-01 8.61e-05 \n", " 16 21 4.8908e-06 1.39e-08 5.08e-01 3.65e-04 \n", " 17 22 4.8544e-06 3.64e-08 4.17e-01 2.26e-04 \n", " 18 23 4.8369e-06 1.75e-08 5.31e-01 3.88e-04 \n", " 19 24 4.7974e-06 3.95e-08 3.92e-01 2.08e-04 \n", " 20 25 4.7828e-06 1.46e-08 5.32e-01 4.19e-04 \n", " 21 26 4.7395e-06 4.33e-08 3.62e-01 1.86e-04 \n", " 22 27 4.7291e-06 1.04e-08 5.32e-01 4.59e-04 \n", " 23 28 4.6809e-06 4.82e-08 3.30e-01 1.60e-04 \n", " 24 29 4.6769e-06 3.97e-09 5.30e-01 5.14e-04 \n", " 25 30 4.6277e-06 4.93e-08 1.32e-01 3.23e-05 \n", " 26 31 4.6146e-06 1.31e-08 2.25e-01 3.44e-04 \n", " 27 32 4.5798e-06 3.48e-08 2.68e-01 1.35e-04 \n", " 28 34 4.5626e-06 1.72e-08 1.17e-01 7.79e-05 \n", " 29 35 4.5445e-06 1.82e-08 2.37e-01 3.01e-04 \n", " 30 36 4.5260e-06 1.84e-08 5.02e-01 4.43e-04 \n", " 31 37 4.4804e-06 4.57e-08 3.37e-01 1.96e-04 \n", " 32 39 4.4599e-06 2.04e-08 1.22e-01 7.61e-05 \n", " 33 40 4.4451e-06 1.48e-08 2.38e-01 3.68e-04 \n", " 34 41 4.4084e-06 3.66e-08 2.72e-01 1.51e-04 \n", " 35 43 4.3891e-06 1.94e-08 1.19e-01 9.75e-05 \n", " 36 44 4.3717e-06 1.74e-08 2.48e-01 3.36e-04 \n", " 37 45 4.3384e-06 3.33e-08 2.72e-01 1.60e-04 \n", " 38 47 4.3186e-06 1.98e-08 1.21e-01 9.85e-05 \n", " 39 48 4.3019e-06 1.67e-08 2.51e-01 3.44e-04 \n", " 40 49 4.2686e-06 3.33e-08 2.72e-01 1.61e-04 \n", " 41 51 4.2489e-06 1.97e-08 1.23e-01 1.01e-04 \n", " 42 52 4.2325e-06 1.64e-08 2.54e-01 3.40e-04 \n", " 43 53 4.2003e-06 3.22e-08 2.72e-01 1.61e-04 \n", " 44 55 4.1809e-06 1.94e-08 1.24e-01 1.00e-04 \n", " 45 56 4.1650e-06 1.59e-08 2.55e-01 3.35e-04 \n", " 46 57 4.1341e-06 3.09e-08 2.71e-01 1.59e-04 \n", " 47 59 4.1153e-06 1.88e-08 1.24e-01 9.79e-05 \n", " 48 60 4.0999e-06 1.54e-08 2.56e-01 3.27e-04 \n", " 49 61 4.0705e-06 2.94e-08 2.70e-01 1.56e-04 \n", " 50 63 4.0525e-06 1.80e-08 1.25e-01 9.43e-05 \n", " 51 64 4.0376e-06 1.49e-08 2.56e-01 3.25e-04 \n", " 52 65 4.0099e-06 2.77e-08 2.69e-01 1.60e-04 \n", " 53 67 3.9928e-06 1.71e-08 1.25e-01 9.61e-05 \n", " 54 68 3.9784e-06 1.44e-08 2.56e-01 3.40e-04 \n", " 55 69 3.9525e-06 2.59e-08 2.67e-01 1.68e-04 \n", " 56 71 3.9364e-06 1.61e-08 1.25e-01 9.76e-05 \n", " 57 72 3.9225e-06 1.40e-08 2.54e-01 3.52e-04 \n", " 58 73 3.9023e-06 2.01e-08 3.95e-01 3.56e-04 \n", " 59 74 3.8828e-06 1.95e-08 3.94e-01 3.60e-04 \n", " 60 75 3.8636e-06 1.92e-08 3.92e-01 3.63e-04 \n", " 61 76 3.8452e-06 1.85e-08 3.93e-01 3.69e-04 \n", " 62 77 3.8268e-06 1.84e-08 3.88e-01 3.66e-04 \n", " 63 78 3.8096e-06 1.72e-08 3.94e-01 3.82e-04 \n", " 64 79 3.7915e-06 1.81e-08 3.80e-01 3.58e-04 \n", " 65 80 3.7767e-06 1.48e-08 4.07e-01 4.18e-04 \n", " 66 81 3.7571e-06 1.96e-08 3.51e-01 3.11e-04 \n", " 67 82 3.7509e-06 6.20e-09 4.71e-01 5.79e-04 \n", " 68 83 3.7238e-06 2.71e-08 2.56e-01 1.64e-04 \n", " 69 85 3.7113e-06 1.24e-08 1.15e-01 1.37e-04 \n", " 70 86 3.6987e-06 1.26e-08 2.43e-01 3.34e-04 \n", " 71 87 3.6902e-06 8.55e-09 4.47e-01 5.38e-04 \n", " 72 88 3.6686e-06 2.15e-08 2.80e-01 2.05e-04 \n", " 73 90 3.6577e-06 1.09e-08 1.16e-01 1.07e-04 \n", " 74 91 3.6462e-06 1.15e-08 2.34e-01 4.02e-04 \n", " 75 92 3.6328e-06 1.34e-08 3.76e-01 3.87e-04 \n", " 76 93 3.6209e-06 1.20e-08 3.91e-01 4.22e-04 \n", " 77 94 3.6073e-06 1.36e-08 3.58e-01 3.53e-04 \n", " 78 95 3.5983e-06 8.93e-09 4.26e-01 5.08e-04 \n", " 79 96 3.5824e-06 1.59e-08 2.97e-01 2.42e-04 \n", " 80 97 3.5794e-06 3.00e-09 4.70e-01 6.71e-04 \n", " 81 98 3.5595e-06 1.99e-08 2.24e-01 1.35e-04 \n", " 82 100 3.5498e-06 9.67e-09 1.04e-01 1.56e-04 \n", " 83 101 3.5399e-06 9.91e-09 2.27e-01 2.72e-04 \n", " 84 102 3.5355e-06 4.40e-09 4.60e-01 6.28e-04 \n", " 85 103 3.5193e-06 1.62e-08 2.39e-01 1.55e-04 \n", " 86 104 3.5170e-06 2.28e-09 4.52e-01 7.25e-04 \n", " 87 105 3.5006e-06 1.64e-08 1.12e-01 3.75e-05 \n", " 88 106 3.4970e-06 3.68e-09 1.77e-01 8.65e-04 \n", " 89 107 3.4759e-06 2.11e-08 1.73e-01 7.87e-05 \n", " 90 108 3.4665e-06 9.36e-09 2.11e-01 3.57e-04 \n", " 91 109 3.4597e-06 6.81e-09 4.13e-01 4.83e-04 \n", " 92 110 3.4498e-06 9.94e-09 3.04e-01 2.57e-04 \n", " 93 111 3.4450e-06 4.73e-09 4.36e-01 5.59e-04 \n", " 94 112 3.4344e-06 1.06e-08 2.59e-01 1.83e-04 \n", " 95 113 3.4300e-06 4.36e-09 4.28e-01 5.75e-04 \n", " 96 114 3.4198e-06 1.03e-08 2.48e-01 1.66e-04 \n", " 97 115 3.4153e-06 4.44e-09 4.21e-01 5.62e-04 \n", " 98 116 3.4059e-06 9.45e-09 2.48e-01 1.66e-04 \n", " 99 117 3.4014e-06 4.52e-09 4.14e-01 5.36e-04 \n", " 100 118 3.3928e-06 8.53e-09 2.55e-01 1.74e-04 \n", " 101 119 3.3883e-06 4.55e-09 4.07e-01 5.04e-04 \n", " 102 120 3.3806e-06 7.66e-09 2.65e-01 1.87e-04 \n", " 103 122 3.3759e-06 4.76e-09 1.71e-01 1.11e-04 \n", " 104 123 3.3704e-06 5.50e-09 3.41e-01 4.04e-04 \n", " 105 124 3.3643e-06 6.04e-09 3.21e-01 2.73e-04 \n", " 106 125 3.3612e-06 3.17e-09 4.64e-01 5.77e-04 \n", " 107 126 3.3538e-06 7.39e-09 2.19e-01 1.23e-04 \n", " 108 128 3.3493e-06 4.45e-09 1.62e-01 1.13e-04 \n", " 109 129 3.3445e-06 4.81e-09 3.27e-01 3.41e-04 \n", " 110 130 3.3398e-06 4.69e-09 3.56e-01 3.29e-04 \n", " 111 131 3.3354e-06 4.45e-09 3.62e-01 3.39e-04 \n", " 112 132 3.3309e-06 4.47e-09 3.46e-01 3.06e-04 \n", " 113 133 3.3269e-06 4.02e-09 3.75e-01 3.59e-04 \n", " 114 134 3.3225e-06 4.40e-09 3.14e-01 2.49e-04 \n", " 115 135 3.3196e-06 2.88e-09 4.41e-01 4.91e-04 \n", " 116 136 3.3147e-06 4.96e-09 2.22e-01 1.20e-04 \n", " 117 138 3.3116e-06 3.10e-09 1.48e-01 7.83e-05 \n", " 118 139 3.3075e-06 4.06e-09 2.97e-01 2.71e-04 \n", " 119 140 3.3044e-06 3.16e-09 3.81e-01 3.57e-04 \n", " 120 141 3.3007e-06 3.64e-09 2.84e-01 1.96e-04 \n", " 121 142 3.2995e-06 1.17e-09 5.00e-01 6.09e-04 \n", " 122 143 3.2944e-06 5.18e-09 1.59e-01 5.92e-05 \n", " 123 145 3.2913e-06 3.06e-09 1.35e-01 7.70e-05 \n", " 124 146 3.2883e-06 3.00e-09 2.78e-01 2.09e-04 \n", " 125 147 3.2864e-06 1.92e-09 4.35e-01 4.48e-04 \n", " 126 148 3.2830e-06 3.40e-09 2.00e-01 9.24e-05 \n", " 127 150 3.2811e-06 1.86e-09 1.33e-01 5.05e-05 \n", " 128 151 3.2784e-06 2.74e-09 2.65e-01 1.88e-04 \n", " 129 152 3.2770e-06 1.44e-09 4.44e-01 4.57e-04 \n", " 130 153 3.2739e-06 3.07e-09 1.80e-01 7.31e-05 \n", " 131 154 3.2736e-06 3.01e-10 5.11e-01 6.10e-04 \n", " 132 155 3.2695e-06 4.10e-09 1.24e-01 3.39e-05 \n", " 133 156 3.2673e-06 2.21e-09 2.45e-01 1.53e-04 \n", " 134 157 3.2666e-06 6.74e-10 4.69e-01 4.94e-04 \n", " 135 158 3.2637e-06 2.88e-09 1.44e-01 4.50e-05 \n", " 136 159 3.2631e-06 6.26e-10 4.71e-01 5.04e-04 \n", " 137 160 3.2603e-06 2.81e-09 1.31e-01 3.72e-05 \n", " 138 161 3.2596e-06 6.72e-10 4.54e-01 4.62e-04 \n", " 139 162 3.2572e-06 2.38e-09 1.33e-01 3.79e-05 \n", " 140 163 3.2566e-06 6.23e-10 4.37e-01 4.21e-04 \n", " 141 164 3.2546e-06 2.01e-09 1.35e-01 3.87e-05 \n", " 142 165 3.2540e-06 5.78e-10 4.20e-01 3.84e-04 \n", " 143 166 3.2523e-06 1.70e-09 1.37e-01 3.95e-05 \n", " 144 167 3.2518e-06 5.35e-10 4.03e-01 3.49e-04 \n", " 145 168 3.2504e-06 1.43e-09 1.38e-01 4.00e-05 \n", " 146 169 3.2499e-06 4.94e-10 3.85e-01 3.16e-04 \n", " 147 170 3.2487e-06 1.20e-09 1.38e-01 4.01e-05 \n", " 148 171 3.2482e-06 4.53e-10 3.67e-01 2.84e-04 \n", " 149 172 3.2472e-06 1.00e-09 1.39e-01 4.03e-05 \n", " 150 173 3.2468e-06 4.11e-10 3.48e-01 2.55e-04 \n", " 151 174 3.2460e-06 8.32e-10 1.39e-01 4.01e-05 \n", " 152 175 3.2456e-06 3.68e-10 3.30e-01 2.27e-04 \n", " 153 176 3.2449e-06 6.85e-10 1.39e-01 4.00e-05 \n", " 154 177 3.2446e-06 3.25e-10 3.11e-01 2.01e-04 \n", " 155 178 3.2440e-06 5.60e-10 1.40e-01 4.03e-05 \n", " 156 179 3.2437e-06 2.83e-10 2.91e-01 1.76e-04 \n", " 157 180 3.2433e-06 4.49e-10 1.38e-01 3.93e-05 \n", " 158 181 3.2431e-06 2.42e-10 2.71e-01 1.52e-04 \n", " 159 182 3.2427e-06 3.55e-10 1.36e-01 3.82e-05 \n", " 160 184 3.2425e-06 1.58e-10 1.11e-01 2.52e-05 \n", " 161 185 3.2423e-06 2.00e-10 2.16e-01 9.63e-05 \n", " 162 186 3.2421e-06 2.31e-10 1.71e-01 6.01e-05 \n", " 163 187 3.2420e-06 1.58e-10 2.38e-01 1.16e-04 \n", " 164 188 3.2418e-06 2.00e-10 1.14e-01 2.66e-05 \n", " 165 190 3.2417e-06 8.07e-11 8.92e-02 1.63e-05 \n", " 166 191 3.2416e-06 1.07e-10 1.73e-01 6.16e-05 \n", " 167 192 3.2415e-06 1.14e-10 1.53e-01 4.81e-05 \n", " 168 193 3.2414e-06 8.98e-11 1.69e-01 5.83e-05 \n", " 169 194 3.2413e-06 8.15e-11 1.27e-01 3.32e-05 \n", " 170 195 3.2412e-06 5.22e-11 1.74e-01 6.19e-05 \n", " 171 196 3.2412e-06 5.80e-11 8.65e-02 1.53e-05 \n", " 172 198 3.2412e-06 1.82e-11 5.17e-02 5.48e-06 \n", " 173 199 3.2411e-06 2.43e-11 9.89e-02 2.00e-05 \n", " 174 200 3.2411e-06 2.05e-11 1.34e-01 3.69e-05 \n", " 175 201 3.2411e-06 1.83e-11 5.13e-02 5.39e-06 \n", " 176 202 3.2411e-06 3.40e-12 1.38e-01 3.88e-05 \n", " 177 203 3.2411e-06 1.28e-11 1.87e-02 7.20e-07 \n", " 178 204 3.2411e-06 1.21e-12 8.88e-02 1.61e-05 \n", " 179 205 3.2411e-06 1.49e-12 2.58e-02 1.36e-06 \n", " 180 206 3.2411e-06 5.34e-13 4.09e-02 3.42e-06 \n", " 181 211 3.2411e-06 2.51e-14 9.86e-03 2.01e-07 \n", " 182 212 3.2411e-06 6.26e-16 3.41e-05 1.02e-09 \n", "`gtol` termination condition is satisfied.\n", "Function evaluations 212, initial cost 6.4881e-02, final cost 3.2411e-06, first-order optimality 1.02e-09.\n", "Fitting completed, with the following results\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "k1_0 1.07 No 0.10 30.00 \n", "k2_0 0.42 No 0.10 30.00 \n", "k3_0 4.90e-14 No 0.00 0.33 \n", "mu_1 16.24 No 1.00e-04 1.00e+02 \n", "phi 0.02 No 0.00 90.00 \n", "------------------------------------------------------------------\n", "\n" ] }, { "data": { "text/plain": [ " message: `gtol` termination condition is satisfied.\n", " success: True\n", " status: 1\n", " fun: [ 2.220e-16 1.545e-03 1.479e-04 -9.979e-04 -8.545e-04\n", " -3.821e-06 7.319e-04 8.811e-04 3.014e-04 -9.714e-04]\n", " x: [ 1.072e+00 4.182e-01 4.898e-14 1.624e+01 1.712e-02]\n", " cost: 3.2410696722792836e-06\n", " jac: [[ 0.000e+00 0.000e+00 ... 0.000e+00 0.000e+00]\n", " [-1.507e-02 -6.118e-04 ... -4.462e-03 4.172e-07]\n", " ...\n", " [-9.765e-02 -1.468e-01 ... -7.910e-03 4.098e-06]\n", " [-1.011e-01 -1.735e-01 ... -7.228e-03 4.470e-06]]\n", " grad: [-3.516e-11 -4.143e-12 3.048e-06 2.088e-12 1.666e-11]\n", " optimality: 1.0171337805176332e-09\n", " active_mask: [ 0 0 -1 0 0]\n", " nfev: 212\n", " njev: 183" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mat = pmt.MatModel('goh','nh')\n", "sample = pmt.UniaxialExtension(mat, force_measure='cauchy')\n", "params = sample.parameters\n", "params['phi'] = pmt.Param(30,0,90) #Add fiber angle as a parameter\n", "params.fix('L0')\n", "params.fix('A0')\n", "print(sample, params)\n", "\n", "applied_stress = np.linspace(0,50,10)\n", "observed_stretch = np.array([1., 1.09144422, 1.17650268, 1.25077441, 1.31313774, 1.36499585,\n", " 1.40850493, 1.4455964, 1.4777529, 1.50606163])\n", "\n", "def simulate(param_vary):\n", " pmt.specify_two_fibers(sample,param_vary['phi'],verbose=False)\n", " mod_stretch = sample.force_controlled(applied_stress, param_vary)\n", " return mod_stretch\n", "\n", "param_fitter = pmt.ParamFitter(simulate,observed_stretch,params)\n", "\n", "param_fitter.fit()" ] }, { "cell_type": "markdown", "id": "415d51eb-2791-4f30-aa8e-9cf65bf6e3a9", "metadata": {}, "source": [ "It took higher number of iterations, but fitting did work. When plotting the results, if we call the `simulate` function with `params`, we will get an error. This can solved by getting a normal dictionary from `params` and passing that instead." ] }, { "cell_type": "code", "execution_count": 7, "id": "c8c6da21-f36d-4368-a93f-226bfaf57f50", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(1,1,figsize=(4*0.7,3*0.7))\n", "\n", "ax.plot(applied_stress, observed_stretch,'o',label='Observed data')\n", "ax.plot(applied_stress, simulate(params),'-',label='Fitted model')\n", "ax.set_xlabel('Stress')\n", "ax.set_ylabel('Stretch')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "807b5dc1-0c0f-4742-b1de-73c4628425e7", "metadata": {}, "source": [ "## Combining multiple experiments" ] }, { "cell_type": "markdown", "id": "5ad7aeb3-b16c-461f-8dd5-ef1ce4ca3622", "metadata": {}, "source": [ "One can combine multiple experiments. For example, if two samples were taken at 90 degrees angles from the sample tissue and a uniaxial extension experiment was performed on each, we may want to have the same set of parameters fit both. This is demonstrated below." ] }, { "cell_type": "code", "execution_count": 8, "id": "ade7538c-9e37-4fe4-a10e-2f65f07efae0", "metadata": {}, "outputs": [], "source": [ "#since the fiber directions are stored in material, it is better to create separate instances for the two\n", "matC = pmt.MatModel('goh','nh')\n", "matL = pmt.MatModel('goh','nh')\n", "\n", "sample_C = pmt.UniaxialExtension(matC, force_measure='cauchy')\n", "sample_L = pmt.UniaxialExtension(matL, force_measure='cauchy')\n", "params = sample_L.parameters\n", "#add fiber angle\n", "params['phi'] = pmt.Param(30,0,90)\n", "\n", "stretch_C = np.linspace(1,1.2,20)\n", "stretch_L = np.linspace(1,1.5,20)\n", "obs_stress_C = np.array([0. , 1.52571403, 3.07863692, 4.66062427, 6.27372501,\n", " 7.92021013, 9.60260466, 11.32372343, 13.08671143, 14.89508926,\n", " 16.75280476, 18.66429179, 20.63453731, 22.66915826, 24.77448991,\n", " 26.95768758, 29.22684422, 31.59112643, 34.06093242, 36.64807567,])\n", "obs_stress_L = np.array([0. , 3.15860501, 6.32132964, 9.49192622, 12.67378974,\n", " 15.86999936, 19.08335432, 22.31640505, 25.57148019, 28.8507102 ,\n", " 32.15604801, 35.48928713, 38.85207756, 42.24593993, 45.67227786,\n", " 49.13238907, 52.62747512, 56.15865021, 59.72694895, 63.40018943])\n", "\n", "observed_stresses = np.array([obs_stress_C,obs_stress_L])\n", "\n", "def simulate_both(param_vary):\n", " phi = param_vary['phi']\n", " if type(phi) is pmt.Param:\n", " phi = phi.value\n", " pmt.specify_two_fibers(sample_C,phi,verbose=False)\n", " stress_C = sample_C.disp_controlled(stretch_C,param_vary)\n", " pmt.specify_two_fibers(sample_L,90-phi,verbose=False)\n", " stress_L = sample_L.disp_controlled(stretch_L,param_vary)\n", " return np.array([stress_C,stress_L])\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "083b5f73-d0bf-4fd6-b9d0-2e4ab139d57b", "metadata": {}, "outputs": [], "source": [ "params.set('k1_0',20)\n", "params.set('k2_0',5)\n", "params.set('k3_0',0.2)\n", "params.set('mu_1',40)\n", "params.set('phi',10)\n", "\n", "observed_stress = simulate_both(params)" ] }, { "cell_type": "code", "execution_count": 10, "id": "e4f88863-2f38-4efb-b34b-a2b8bd5dcede", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 1.52571403, 3.07863692, 4.66062427, 6.27372501,\n", " 7.92021013, 9.60260466, 11.32372343, 13.08671143, 14.89508926,\n", " 16.75280476, 18.66429179, 20.63453731, 22.66915826, 24.77448991,\n", " 26.95768758, 29.22684422, 31.59112643, 34.06093242, 36.64807567],\n", " [ 0. , 3.15860501, 6.32132964, 9.49192622, 12.67378974,\n", " 15.86999936, 19.08335432, 22.31640505, 25.57148019, 28.8507102 ,\n", " 32.15604801, 35.48928713, 38.85207756, 42.24593993, 45.67227786,\n", " 49.13238907, 52.62747512, 56.15865021, 59.72694895, 63.40018943]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "observed_stress" ] }, { "cell_type": "code", "execution_count": 11, "id": "fb50634b-8ff5-4feb-af62-62e161a0e8f4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parameter fitting instance created with the following settings\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "k1_0 10.00 No 0.10 30.00 \n", "k2_0 5.00 Yes - - \n", "k3_0 0.10 No 0.00 0.33 \n", "mu_1 10.00 No 1.00e-04 1.00e+02 \n", "phi 30.00 No 0.00 90.00 \n", "------------------------------------------------------------------\n", "\n", "4 parameters will be fitted.\n" ] } ], "source": [ "params.fix('L0')\n", "params.fix('A0')\n", "params.fix('k2_0',5)\n", "params.set('k1_0',10)\n", "params.set('k3_0',0.1)\n", "params.set('mu_1',10)\n", "params.set('phi',30)\n", "param_fitter = pmt.ParamFitter(simulate_both,observed_stress,params)" ] }, { "cell_type": "code", "execution_count": 12, "id": "cb99d65d-8d5c-47f3-981f-965168934414", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Iteration Total nfev Cost Cost reduction Step norm Optimality \n", " 0 1 8.5494e+03 5.13e+04 \n", " 1 2 3.1698e+02 8.23e+03 2.25e+01 5.96e+03 \n", " 2 3 1.2913e+01 3.04e+02 7.48e+00 2.20e+02 \n", " 3 4 1.1669e+01 1.24e+00 5.30e+00 5.89e+02 \n", " 4 5 1.6546e+00 1.00e+01 1.40e+00 4.46e+01 \n", " 5 6 6.1012e-01 1.04e+00 2.48e+00 6.66e+01 \n", " 6 7 1.3591e-01 4.74e-01 1.65e+00 2.54e+01 \n", " 7 8 5.7974e-02 7.79e-02 7.77e-01 9.42e+00 \n", " 8 9 4.4427e-02 1.35e-02 1.21e+00 1.07e+01 \n", " 9 10 3.0427e-02 1.40e-02 2.97e-01 3.80e-01 \n", " 10 12 2.5246e-02 5.18e-03 6.58e-01 4.15e+00 \n", " 11 13 2.0088e-02 5.16e-03 5.80e-01 2.69e+00 \n", " 12 14 1.6521e-02 3.57e-03 7.55e-01 4.67e+00 \n", " 13 15 1.3138e-02 3.38e-03 4.09e-01 1.22e+00 \n", " 14 17 1.1830e-02 1.31e-03 2.85e-01 6.23e-01 \n", " 15 18 1.0091e-02 1.74e-03 5.70e-01 2.33e+00 \n", " 16 19 8.3100e-03 1.78e-03 5.59e-01 2.02e+00 \n", " 17 20 6.9170e-03 1.39e-03 5.66e-01 2.02e+00 \n", " 18 21 5.7624e-03 1.15e-03 5.02e-01 1.50e+00 \n", " 19 22 4.8859e-03 8.77e-04 5.82e-01 1.93e+00 \n", " 20 23 4.0831e-03 8.03e-04 4.12e-01 9.04e-01 \n", " 21 24 3.7214e-03 3.62e-04 7.23e-01 2.73e+00 \n", " 22 25 2.9235e-03 7.98e-04 2.39e-01 2.59e-01 \n", " 23 27 2.6770e-03 2.46e-04 2.64e-01 3.44e-01 \n", " 24 28 2.3590e-03 3.18e-04 5.28e-01 1.29e+00 \n", " 25 29 1.9873e-03 3.72e-04 3.71e-01 5.89e-01 \n", " 26 30 1.8454e-03 1.42e-04 6.80e-01 1.97e+00 \n", " 27 31 1.4282e-03 4.17e-04 2.07e-01 1.59e-01 \n", " 28 33 1.3016e-03 1.27e-04 2.54e-01 2.61e-01 \n", " 29 34 1.1444e-03 1.57e-04 5.06e-01 9.86e-01 \n", " 30 35 9.4888e-04 1.95e-04 3.14e-01 3.51e-01 \n", " 31 37 8.7266e-04 7.62e-05 1.78e-01 1.15e-01 \n", " 32 38 7.6457e-04 1.08e-04 3.56e-01 4.47e-01 \n", " 33 39 6.5920e-04 1.05e-04 5.21e-01 9.15e-01 \n", " 34 40 5.2550e-04 1.34e-04 2.49e-01 1.95e-01 \n", " 35 42 4.7924e-04 4.63e-05 1.73e-01 9.68e-02 \n", " 36 43 4.1040e-04 6.88e-05 3.45e-01 3.73e-01 \n", " 37 44 3.3917e-04 7.12e-05 4.49e-01 6.07e-01 \n", " 38 45 2.6437e-04 7.48e-05 2.61e-01 1.95e-01 \n", " 39 47 2.3584e-04 2.85e-05 1.56e-01 7.01e-02 \n", " 40 48 1.9556e-04 4.03e-05 3.10e-01 2.72e-01 \n", " 41 49 1.5507e-04 4.05e-05 4.09e-01 4.55e-01 \n", " 42 50 1.1338e-04 4.17e-05 2.27e-01 1.34e-01 \n", " 43 52 9.8195e-05 1.52e-05 1.38e-01 4.99e-02 \n", " 44 53 7.6953e-05 2.12e-05 2.75e-01 1.95e-01 \n", " 45 54 5.6112e-05 2.08e-05 3.41e-01 2.89e-01 \n", " 46 55 3.7182e-05 1.89e-05 2.03e-01 9.85e-02 \n", " 47 56 3.1294e-05 5.89e-06 4.00e-01 3.84e-01 \n", " 48 57 1.4213e-05 1.71e-05 9.76e-02 2.10e-02 \n", " 49 59 1.0261e-05 3.95e-06 1.31e-01 3.99e-02 \n", " 50 60 6.4072e-06 3.85e-06 2.61e-01 1.55e-01 \n", " 51 61 2.6049e-06 3.80e-06 9.99e-02 2.18e-02 \n", " 52 62 1.8644e-06 7.40e-07 2.39e-01 1.27e-01 \n", " 53 63 1.8686e-07 1.68e-06 3.36e-02 2.32e-03 \n", " 54 64 3.8722e-08 1.48e-07 9.57e-02 1.98e-02 \n", " 55 65 7.7660e-11 3.86e-08 4.40e-03 3.89e-05 \n", " 56 66 8.6566e-15 7.77e-11 2.09e-03 9.42e-06 \n", " 57 67 5.2376e-24 8.66e-15 2.46e-06 1.49e-11 \n", "`gtol` termination condition is satisfied.\n", "Function evaluations 67, initial cost 8.5494e+03, final cost 5.2376e-24, first-order optimality 1.49e-11.\n", "Fitting completed, with the following results\n", "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L0 1.00 Yes - - \n", "A0 1.00 Yes - - \n", "k1_0 20.00 No 0.10 30.00 \n", "k2_0 5.00 Yes - - \n", "k3_0 0.20 No 0.00 0.33 \n", "mu_1 40.00 No 1.00e-04 1.00e+02 \n", "phi 10.00 No 0.00 90.00 \n", "------------------------------------------------------------------\n", "\n" ] }, { "data": { "text/plain": [ " message: `gtol` termination condition is satisfied.\n", " success: True\n", " status: 1\n", " fun: [ 0.000e+00 4.063e-13 ... -4.974e-14 1.918e-13]\n", " x: [ 2.000e+01 2.000e-01 4.000e+01 1.000e+01]\n", " cost: 5.2375861683058635e-24\n", " jac: [[ 0.000e+00 0.000e+00 0.000e+00 0.000e+00]\n", " [ 1.313e-02 -3.861e+00 3.158e-02 -4.021e-03]\n", " ...\n", " [ 0.000e+00 0.000e+00 1.493e+00 0.000e+00]\n", " [ 3.343e-03 3.988e+01 1.583e+00 1.050e-01]]\n", " grad: [-2.805e-13 7.453e-11 -1.090e-13 1.037e-13]\n", " optimality: 1.4906982976095317e-11\n", " active_mask: [0 0 0 0]\n", " nfev: 67\n", " njev: 58" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "param_fitter.fit()" ] } ], "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.16" } }, "nbformat": 4, "nbformat_minor": 5 }