{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Uncertainty quantification and sensitivity analysis for arterial wall models\n", "\n", " \n", "**Vinzenz Gregor Eck**, Expert Analytics, Oslo \n", "\n", " **Jacob Sturdy**, Department of Structural Engineering, NTNU\n", "\n", "Date: **Jul 13, 2018**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# ipython magic\n", "%matplotlib notebook\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# plot configuration\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "plt.style.use(\"ggplot\")\n", "# import seaborn as sns # sets another style\n", "matplotlib.rcParams['lines.linewidth'] = 3\n", "fig_width, fig_height = (7.0,5.0)\n", "matplotlib.rcParams['figure.figsize'] = (fig_width, fig_height)\n", "\n", "# font = {'family' : 'sans-serif',\n", "# 'weight' : 'normal',\n", "# 'size' : 18.0}\n", "# matplotlib.rc('font', **font) # pass in the font dict as kwar" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import chaospy as cp\n", "import numpy as np\n", "from monte_carlo import generate_sample_matrices_mc\n", "from monte_carlo import calculate_sensitivity_indices_mc\n", "unit_mmhg_pa = 133.3\n", "unit_pa_mmhg = 1./unit_mmhg_pa\n", "unit_cm2_m2 = 1. / 100. / 100.\n", "unit_m2_cm2 = 1. / unit_cm2_m2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "
\n", "The arterial wall models we are investigating in this part, are used to describe the (visco-)elastic behaviour of arteries in one-dimensional\n", "simulations of the cardiovascular system.\n", "\n", "# Arterial Wall Models\n", "
\n", "\n", "The elastic wall models are simplified algebraic functions $A(P)$ ([[eck2015stochastic;@boileau_benchmark_2015]](#eck2015stochastic;@boileau_benchmark_2015)),\n", "which state the arterial lumen area $A$ as function of transmural pressure $P$.\n", "\n", "For the calibration of the applied wall models, the wave speed in an arterial segment is required.\n", "The wave speed is given from fluid dynamics equations for one-dimensional arteries ([[eck2015stochastic]](#eck2015stochastic)):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", "\\label{eq:defwaveSpeed} \\tag{1}\n", "c(P) = \\sqrt{\\frac{A(P)}{\\rho\\ C(P)}},\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with blood density $\\rho= 1050\\ [kg\\ m^{-3}]$ and compliance $C(P) = dA / dP$.\n", "\n", "## *Quadratic* model\n", "The *Quadratic* area-pressure relationship ([[sherwin2003]](#sherwin2003)) is defined as:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", "A(P) = \\left((P-P_s) \\frac{A_s}{\\lambda} + \\sqrt{A_s} \\right)^2,\n", "\\label{eq:lapArea} \\tag{2}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $\\lambda$ is referred to as the stiffness coefficient and $A_s$\n", "is the area at the reference pressure $P_s$.\n", "\n", "The stiffness coefficient $\\lambda$ is defined as:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", "\\lambda = \\frac{2 \\rho c_s^2 A_s}{\\sqrt{A_s}}\n", "\\label{_auto1} \\tag{3}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model is implemented in the following function:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# begin quadratic area model\n", "def quadratic_area_model(pressure_range, samples):\n", " \"\"\"\n", " calculate the arterial vessel wall for a set pressure range\n", " from 75 to 140 mmHg for a given set of reference wave speeds\n", " area and pressure.\n", "\n", " :param\n", " pressure_range: np.array\n", " pressure range for which to calculate the arterial area\n", "\n", " samples: np.array with shape (4:n_samples)\n", " sample matrix where\n", " first indices correspond to\n", " a_s: reference area\n", " c_s: reference waves seed\n", " p_s: reference pressure\n", " rho: blood density\n", " and n_samples to the number of samples\n", "\n", " :return:\n", " arterial pressure : np.array\n", " of size n_samples\n", " \"\"\"\n", " pressure_range = pressure_range.reshape(pressure_range.shape[0], 1)\n", " a_s, c_s, p_s, rho = samples\n", " beta = 2*rho*c_s**2/np.sqrt(a_s)*a_s\n", " #C_Laplace = (2. * ((P - Ps) * As / betaLaplace + np.sqrt(As))) * As / betaLaplace\n", " return ((pressure_range - p_s)*a_s/beta + np.sqrt(a_s))**2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## *Logarithmic* model\n", "The *Logarithmic* area-pressure relationship ([[Hayashi1980]](#Hayashi1980)) is defined as:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", "A(P) = A_s \\left( 1 + \\frac{1}{\\beta} ln \\left(\\frac{P}{P_s}\\right) \\right)^2,\n", "\\label{eq:expArea} \\tag{4}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $\\beta$ is called the stiffness coefficient and $A_s$ is the\n", "area at the reference pressure $P_s$.\n", "\n", "The stiffness coefficient $\\beta$ is defined as:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "$$\n", "\\begin{equation}\n", "\\beta = \\frac{2\\ \\rho c_s^2}{P_s}\n", "\\label{_auto2} \\tag{5}\n", "\\end{equation}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model is implemented in the following function:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# begin exponential area model\n", "def logarithmic_area_model(pressure_range, samples):\n", " \"\"\"\n", " calculate the arterial vessel wall for a set pressure range\n", " from 75 to 140 mmHg for a given set of reference wave speeds\n", " area and pressure.\n", "\n", " :param\n", " pressure_range: np.array\n", " pressure range for which to calculate the arterial area\n", "\n", " samples: np.array with shape (4:n_samples)\n", " sample matrix where\n", " first indices correspond to\n", " a_s: reference area\n", " c_s: reference waves seed\n", " p_s: reference pressure\n", " rho: blood density\n", " and n_samples to the number of samples\n", "\n", " :return:\n", " arterial pressure : np.array\n", " of size n_samples\n", " \"\"\"\n", " pressure_range = pressure_range.reshape(pressure_range.shape[0], 1)\n", " a_s, c_s, p_s, rho = samples\n", " beta = 2.0*rho*c_s**2./p_s\n", " #C_hayashi = 2.0 * As / betaHayashi * (1.0 + np.log(P / Ps) / betaHayashi) / P\n", " return a_s*(1.0 + np.log(pressure_range / p_s)/beta) ** 2.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison\n", "\n", "For a comparison of the wall models, we set the reference values to:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", "A_s &= 5.12 \\;\\mathrm{cm^2} \\\\\n", "c_s &= 6.256 \\;\\mathrm{m/s} \\\\\n", "P_s &= 100 \\;\\mathrm{mmHg} \\\\\n", "\\rho &= 1045 \\; \\mathrm{kg/m^3}\n", "\\end{align*}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two wall models give almost the same result around the reference area and pressure, for which the model was calibrated." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# start deterministic comparison\n", "pressure_range = np.linspace(45, 180, 100) * unit_mmhg_pa\n", "a_s = 5.12 * unit_cm2_m2\n", "c_s = 6.25609258389\n", "p_s = 100 * unit_mmhg_pa\n", "rho = 1045.\n", "\n", "plt.figure()\n", "for model, name in [(quadratic_area_model, 'Quadratic model'), (logarithmic_area_model, 'Logarithmic model')]:\n", " y_area = model(pressure_range, (a_s, c_s, p_s, rho))\n", " plt.plot(pressure_range * unit_pa_mmhg, y_area * unit_m2_cm2, label=name)\n", " plt.xlabel('Pressure [mmHg]')\n", " plt.ylabel('Area [cm2]')\n", " plt.legend()\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Uncertainty Quantification and Sensitivity Analysis\n", "
\n", "\n", "## Definition of uncertain input parameters\n", "For each model input, we define a uniform distributed random variable which varies with a deviation of $5\\%$ around the deterministic value from above:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align*}\n", "A_s &= 5.12 \\; \\mathrm{cm^2} \\quad Z_0 = \\mbox{U}(4.864, 5.376) \\\\\n", "c_s &= 6.256 \\; \\mathrm{m/s} \\quad Z_1 = \\mbox{U}(5.943, 6.569) \\\\\n", "P_s &= 100 \\; \\mathrm{mmHg} \\quad Z_2 = \\mbox{U}(95.0, 105.0) \\\\\n", "\\rho &= 1045 \\; \\mathrm{kg/m^3} \\quad Z_3 = \\mbox{U}(992.75, 1097.25) \n", "\\end{align*}\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Create marginal and joint distributions\n", "dev = 0.05\n", "a_s = 5.12 * unit_cm2_m2\n", "A_s = cp.Uniform(a_s * (1. - dev), a_s*(1. + dev))\n", "\n", "c_s = 6.25609258389\n", "C_s = cp.Uniform(c_s * (1. - dev), c_s*(1. + dev))\n", "\n", "p_s = 100 * unit_mmhg_pa\n", "P_s = cp.Uniform(p_s * (1. - dev), p_s*(1. + dev))\n", "\n", "rho = 1045.\n", "Rho = cp.Uniform(rho * (1. - dev), rho*(1. + dev))\n", "\n", "jpdf = cp.J(A_s, C_s, P_s, Rho)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scatter plots and Samples" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# scatter plots\n", "pressure_range = np.linspace(45, 180, 100) * unit_mmhg_pa\n", "Ns = 200\n", "sample_scheme = 'R'\n", "samples = jpdf.sample(Ns, sample_scheme)\n", "\n", "for model, name, color in [(quadratic_area_model, 'Quadratic model', '#dd3c30'), (logarithmic_area_model, 'Logarithmic model', '#2775b5')]:\n", " # evaluate the model for all samples\n", " Y_area = model(pressure_range, samples)\n", "\n", " plt.figure()\n", " plt.title('{}: evaluations Y_area'.format(name))\n", " plt.plot(pressure_range * unit_pa_mmhg, Y_area * unit_m2_cm2)\n", " plt.xlabel('Pressure [mmHg]')\n", " plt.ylabel('Area [cm2]')\n", " plt.ylim([3.5,7.])\n", "\n", " plt.figure()\n", " plt.title('{}: scatter plots'.format(name))\n", " for k in range(len(jpdf)):\n", " plt.subplot(len(jpdf)/2, len(jpdf)/2, k+1)\n", " plt.plot(samples[k], Y_area[0]*unit_m2_cm2, '.', color=color)\n", " plt.ylabel('Area [cm2]')\n", " plt.ylim([3.45, 4.58])\n", " xlbl = 'Z' + str(k)\n", " plt.xlabel(xlbl)\n", " plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Monte Carlo\n", "\n", "We apply the Monte Carlo method for both models as discussed before:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# start Monte Carlo\n", "pressure_range = np.linspace(45, 180, 100) * unit_mmhg_pa\n", "Ns = 50000\n", "sample_method = 'R'\n", "number_of_parameters = len(jpdf)\n", "\n", "# 1. Generate sample matrices\n", "A, B, C = generate_sample_matrices_mc(Ns, number_of_parameters, jpdf, sample_method)\n", "\n", "fig_mean = plt.figure('mean')\n", "ax_mean = fig_mean.add_subplot(1,2,1)\n", "ax_dict = {}\n", "figs = {}\n", "for name in ['Quadratic model', 'Logarithmic model'] :\n", " figs[name] = plt.figure(name)\n", " ax = ax_dict[name]= figs[name].add_subplot(1,2,1)\n", " \n", "print(\"\\n Uncertainty measures (averaged)\\n\")\n", "print('\\n E(Y) | Std(Y) \\n')\n", "for model, name, color in [(quadratic_area_model, 'Quadratic model', '#dd3c30'),\n", " (logarithmic_area_model, 'Logarithmic model', '#2775b5')]:\n", " # evaluate the model for all samples\n", " Y_A = model(pressure_range, A.T)\n", " Y_B = model(pressure_range, B.T)\n", "\n", " Y_C = np.empty((len(pressure_range), Ns, number_of_parameters))\n", " for i in range(number_of_parameters):\n", " Y_C[:, :, i] = model(pressure_range, C[i, :, :].T)\n", "\n", " # calculate statistics\n", " plotMeanConfidenceAlpha = 5.\n", " Y = np.hstack([Y_A, Y_B])\n", " expected_value = np.mean(Y, axis=1)\n", " variance = np.var(Y, axis=1)\n", " std = np.sqrt(np.var(Y, axis=1))\n", " prediction_interval = np.percentile(Y, [plotMeanConfidenceAlpha / 2., 100. - plotMeanConfidenceAlpha / 2.], axis=1)\n", "\n", " print('{:2.5f} | {:2.5f} : {}'.format(np.mean(expected_value)* unit_m2_cm2, np.mean(std)* unit_m2_cm2, name))\n", "\n", " # 3. Approximate the sensitivity indices\n", " # Better to centralize data before calculating sensitivities\n", " expected_value_col = expected_value.copy()\n", " expected_value_col.shape = (expected_value.shape[0],1)\n", " Y_Ac = Y_A - expected_value_col\n", " Y_Bc = Y_B - expected_value_col\n", " Y_Cc = Y_C.transpose() - expected_value\n", " Y_Cc = Y_Cc.transpose()\n", " S, ST = calculate_sensitivity_indices_mc(Y_A, Y_B, Y_C)\n", " Sc, STc = calculate_sensitivity_indices_mc(Y_Ac, Y_Bc, Y_Cc)\n", "\n", " ## Plots\n", " fig = fig_mean\n", " ax_mean = ax_mean\n", " ax_mean.plot(pressure_range * unit_pa_mmhg, expected_value * unit_m2_cm2, label=name, color=color)\n", " ax_mean.fill_between(pressure_range * unit_pa_mmhg, prediction_interval[0] * unit_m2_cm2,\n", " prediction_interval[1] * unit_m2_cm2, alpha=0.3, color=color)\n", " ax_mean.set_xlabel('Pressure [mmHg]')\n", " ax_mean.set_ylabel('Area [cm2]')\n", " ax_mean.legend()\n", " fig.tight_layout()\n", "\n", " fig = figs[name]\n", " ax = ax_dict[name]\n", " ax.set_title('{}: sensitvity indices'.format(name))\n", " colorsPie = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']\n", " labels = ['Area', 'wave speed', 'pressure', 'density']\n", " N = 4\n", " ind = np.arange(N) # the x locations for the groups\n", " width = 0.35 # the width of the bars\n", "\n", " #firstOrderIndicesTimeAverage = S[:, 50]\n", " #totalIndicesTimeAverage = ST[:, 50]\n", " #rects1 = plt.bar(ind, firstOrderIndicesTimeAverage, width, color=colorsPie, alpha=0.5)\n", " #rects2 = plt.bar(ind + width, totalIndicesTimeAverage, width, color=colorsPie, hatch='.')\n", "\n", " firstOrderIndicesTimeAverage = np.mean(S*variance,axis=1)/np.mean(variance)\n", " totalIndicesTimeAverage = np.mean(ST*variance,axis=1)/np.mean(variance)\n", " rects1 = ax.bar(ind, firstOrderIndicesTimeAverage, width, color=colorsPie, alpha = 0.5)\n", " rects2 = ax.bar(ind + width, totalIndicesTimeAverage, width, color=colorsPie, hatch = '.')\n", "\n", " # add some text for labels, title and axes ticks\n", " ax.set_ylabel('Si')\n", " ax.set_xticks(ind + width)\n", " ax.set_xticklabels(labels)\n", " ax.set_xlim([-width, N + width])\n", " ax.set_ylim([0, 1])\n", " ax.spines['top'].set_visible(False)\n", " ax.tick_params(axis='x', top='off')\n", " ax.spines['right'].set_visible(False)\n", " ax.tick_params(axis='y', right='off')\n", "\n", " fig.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Polynomial chaos\n", "\n", "We apply the Polynomial Chaos method for both models as discussed before:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# start polynomial chaos\n", "# orthogonal C_polynomial from marginals\n", "polynomial_order = 3\n", "Ns = 2*cp.bertran.terms(polynomial_order, len(jpdf))\n", "\n", "print(\"\\n Uncertainty measures (averaged)\\n\")\n", "print('\\n E(Y) | Std(Y) \\n')\n", "\n", "\n", "\n", "ax_mean = fig_mean.add_subplot(1,2,2)\n", "ax_dict = {}\n", "for name in ['Quadratic model', 'Logarithmic model'] :\n", " figs[name] = plt.figure(name)\n", " ax = ax_dict[name]= figs[name].add_subplot(1,2,2)\n", " \n", "for model, name, color in [(quadratic_area_model, 'Quadratic model', '#dd3c30'),\n", " (logarithmic_area_model, 'Logarithmic model', '#2775b5')]:\n", " sample_scheme = 'R'\n", " # create samples\n", " samples = jpdf.sample(Ns, sample_scheme)\n", " # create orthogonal polynomials\n", " orthogonal_polynomials = cp.orth_ttr(polynomial_order, jpdf)\n", " # evaluate the model for all samples\n", " Y_area = model(pressure_range, samples)\n", " # polynomial chaos expansion\n", " polynomial_expansion = cp.fit_regression(orthogonal_polynomials, samples, Y_area.T)\n", "\n", " # calculate statistics\n", " plotMeanConfidenceAlpha = 5\n", " expected_value = cp.E(polynomial_expansion, jpdf)\n", " variance = cp.Var(polynomial_expansion, jpdf)\n", " standard_deviation = cp.Std(polynomial_expansion, jpdf)\n", " prediction_interval = cp.Perc(polynomial_expansion,\n", " [plotMeanConfidenceAlpha / 2., 100 - plotMeanConfidenceAlpha / 2.],\n", " jpdf)\n", " print('{:2.5f} | {:2.5f} : {}'.format(np.mean(expected_value) * unit_m2_cm2, np.mean(std) * unit_m2_cm2, name))\n", "\n", " # compute sensitivity indices\n", " S = cp.Sens_m(polynomial_expansion, jpdf)\n", " ST = cp.Sens_t(polynomial_expansion, jpdf)\n", "\n", " fig = fig_mean\n", " ax_mean = ax_mean\n", " ax_mean.plot(pressure_range * unit_pa_mmhg, expected_value * unit_m2_cm2, label=name, color=color)\n", " ax_mean.fill_between(pressure_range * unit_pa_mmhg, prediction_interval[0] * unit_m2_cm2,\n", " prediction_interval[1] * unit_m2_cm2, alpha=0.3, color=color)\n", " ax_mean.set_xlabel('Pressure [mmHg]')\n", " ax_mean.set_ylabel('Area [cm2]')\n", " ax_mean.legend()\n", " fig.tight_layout()\n", "\n", " fig = figs[name]\n", " ax = ax_dict[name]\n", " ax.set_title('{}: sensitvity indices'.format(name))\n", " colorsPie = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']\n", " labels = ['Area', 'wave speed', 'pressure', 'density']\n", " N = 4\n", " ind = np.arange(N) # the x locations for the groups\n", " width = 0.35 # the width of the bars\n", "\n", " #firstOrderIndicesTimeAverage = S[:, 50]\n", " #totalIndicesTimeAverage = ST[:, 50]\n", " #rects1 = plt.bar(ind, firstOrderIndicesTimeAverage, width, color=colorsPie, alpha=0.5)\n", " #rects2 = plt.bar(ind + width, totalIndicesTimeAverage, width, color=colorsPie, hatch='.')\n", "\n", " firstOrderIndicesTimeAverage = np.mean(S*variance,axis=1)/np.mean(variance)\n", " totalIndicesTimeAverage = np.mean(ST*variance,axis=1)/np.mean(variance)\n", " rects1 = ax.bar(ind, firstOrderIndicesTimeAverage, width, color=colorsPie, alpha = 0.5)\n", " rects2 = ax.bar(ind + width, totalIndicesTimeAverage, width, color=colorsPie, hatch = '.')\n", "\n", " # add some text for labels, title and axes ticks\n", " ax.set_ylabel('Si')\n", " ax.set_xticks(ind + width)\n", " ax.set_xticklabels(labels)\n", " ax.set_xlim([-width, N + width])\n", " ax.set_ylim([0, 1])\n", " ax.spines['top'].set_visible(False)\n", " ax.tick_params(axis='x', top='off')\n", " ax.spines['right'].set_visible(False)\n", " ax.tick_params(axis='y', right='off')\n", "\n", " fig.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# References\n", "\n", " 1.
**V. G. Eck, J. Feinberg, H. P. Langtangen and L. R. Hellevik**. \n", " Stochastic Sensitivity Analysis for Timing and Amplitude of Pressure waves in the Arterial System,\n", " *International Journal for Numerical Methods in Biomedical Engineering*,\n", " 31(4),\n", " 2015.\n", "\n", " 2.
**E. Boileau, P. Nithiarasu, P. J. Blanco, L. O. Mueller, F. E. Fossan, L. R. Hellevik, W. P. Donders, W. Huberts, M. Willemet and J. Alastruey**. \n", " A benchmark study of numerical schemes for one-dimensional arterial blood flow modelling,\n", " *International Journal for Numerical Methods in Biomedical Engineering*,\n", " 31(10),\n", " pp. n/a-n/a,\n", " 2015.\n", "\n", " 3.
**S. Sherwin, V. Franke, J. Peir\\'o and K. Parker**. \n", " One-Dimensional Modelling of Vascular Network in Space-Time Variables,\n", " *Journal of Engineering Mathematics*,\n", " 47(3-4),\n", " pp. 217-233,\n", " 2003.\n", "\n", " 4.
**K. Hayashi, H. Handa, S. Nagasawa, A. Okumura and K. Moritake**. \n", " Stiffness and Elastic Behavior of Human Intracranial and Extracranial arteries,\n", " *Journal of Biomechanics*,\n", " 13(2),\n", " pp. 175-184,\n", " 1980." ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }