{ "cells": [ { "cell_type": "markdown", "id": "f102f8dc", "metadata": {}, "source": [ "## Carry out a few single indivual steps of diffusion, \n", "### and directly verify that the values satisfy the diffusion equation\n", "\n", "In this \"PART 1\", we'll be looking at a tiny system with just 10 bins, to easily inspect the numbers directly.\n", "We'll use concentrations initialized to an upward-shifted sine wave with 1 cycle over the length system\n", "\n", "LAST REVISED: Nov. 28, 2022" ] }, { "cell_type": "code", "execution_count": 1, "id": "b4a4936a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Added 'D:\\Docs\\- MY CODE\\BioSimulations\\life123-Win7' to sys.path\n" ] } ], "source": [ "# Extend the sys.path variable, to contain the project's root directory\n", "import set_path\n", "set_path.add_ancestor_dir_to_syspath(3) # The number of levels to go up \n", " # to reach the project's home, from the folder containing this notebook" ] }, { "cell_type": "code", "execution_count": 2, "id": "a945cbfa", "metadata": {}, "outputs": [], "source": [ "from experiments.get_notebook_info import get_notebook_basename\n", "\n", "from src.life_1D.bio_sim_1d import BioSim1D\n", "from src.modules.reactions.reaction_data import ReactionData as chem\n", "from src.modules.movies.movies import MovieArray\n", "from src.modules.numerical.numerical import Numerical as num\n", "\n", "import numpy as np\n", "\n", "import plotly.express as px\n", "import plotly.graph_objects as go" ] }, { "cell_type": "code", "execution_count": 3, "id": "6207338f", "metadata": {}, "outputs": [], "source": [ "# We'll be considering just 1 chemical species, \"A\"\n", "diffusion_rate = 10.\n", "\n", "chem_data = chem(diffusion_rates=[diffusion_rate], names=[\"A\"])" ] }, { "cell_type": "code", "execution_count": 4, "id": "087caa8d", "metadata": {}, "outputs": [], "source": [ "# Initialize the system with just a few bins\n", "bio = BioSim1D(n_bins=10, chem_data=chem_data)" ] }, { "cell_type": "code", "execution_count": 5, "id": "3f40acb3", "metadata": {}, "outputs": [], "source": [ "# Initialize the concentrations to a sine wave with 1 cycle over the system\n", "# (with a bias to always keep it > 0)\n", "bio.inject_sine_conc(species_name=\"A\", frequency=1, amplitude=10, bias=50)" ] }, { "cell_type": "code", "execution_count": 6, "id": "919ddc99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SYSTEM SNAPSHOT at time 0:\n", " A\n", "0 50.000000\n", "1 55.877853\n", "2 59.510565\n", "3 59.510565\n", "4 55.877853\n", "5 50.000000\n", "6 44.122147\n", "7 40.489435\n", "8 40.489435\n", "9 44.122147\n" ] } ], "source": [ "bio.show_system_snapshot()" ] }, { "cell_type": "code", "execution_count": 7, "id": "43e30fba", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "Chemical=A
Bin number=%{x}
concentration=%{y}", "legendgroup": "A", "line": { "color": "red", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "A", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "xaxis": "x", "y": [ 50, 55.877852522924734, 59.510565162951536, 59.510565162951536, 55.877852522924734, 50, 44.12214747707527, 40.489434837048464, 40.489434837048464, 44.122147477075266 ], "yaxis": "y" } ], "layout": { "autosize": true, "legend": { "title": { "text": "Chemical" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Initial System State (for the tiny system)" }, "xaxis": { "anchor": "y", "autorange": true, "domain": [ 0, 1 ], "range": [ 0, 9 ], "title": { "text": "Bin number" }, "type": "linear" }, "yaxis": { "anchor": "x", "autorange": true, "domain": [ 0, 1 ], "range": [ 39.43270537449829, 60.56729462550171 ], "title": { "text": "concentration" }, "type": "linear" } } }, "image/png": "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", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(data_frame=bio.system_snapshot(), y=[\"A\"], \n", " title= \"Initial System State (for the tiny system)\",\n", " color_discrete_sequence = ['red'],\n", " labels={\"value\":\"concentration\", \"variable\":\"Chemical\", \"index\":\"Bin number\"})\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 8, "id": "cc542145", "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "coloraxis": "coloraxis", "hovertemplate": "Bin number: %{x}
Chem. species: %{y}
Concentration: %{z}", "name": "0", "type": "heatmap", "x": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "xaxis": "x", "xgap": 1, "y": [ "A" ], "yaxis": "y", "ygap": 1, "z": [ [ 50, 55.877852522924734, 59.510565162951536, 59.510565162951536, 55.877852522924734, 50, 44.12214747707527, 40.489434837048464, 40.489434837048464, 44.122147477075266 ] ] } ], "layout": { "autosize": true, "coloraxis": { "colorbar": { "title": { "text": "Concentration" } }, "colorscale": [ [ 0, "rgb(254, 254, 253)" ], [ 0.09090909090909091, "rgb(224, 224, 223)" ], [ 0.18181818181818182, "rgb(197, 197, 195)" ], [ 0.2727272727272727, "rgb(171, 171, 170)" ], [ 0.36363636363636365, "rgb(146, 146, 145)" ], [ 0.45454545454545453, "rgb(124, 123, 122)" ], [ 0.5454545454545454, "rgb(102, 101, 101)" ], [ 0.6363636363636364, "rgb(81, 80, 80)" ], [ 0.7272727272727273, "rgb(59, 59, 59)" ], [ 0.8181818181818182, "rgb(38, 38, 38)" ], [ 0.9090909090909091, "rgb(16, 16, 16)" ], [ 1, "rgb(0, 0, 0)" ] ] }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Initial System State (for the tiny system)" }, "xaxis": { "anchor": "y", "autorange": true, "constrain": "domain", "domain": [ 0, 1 ], "range": [ -0.5, 9.5 ], "scaleanchor": "y", "title": { "text": "Bin number" }, "type": "linear" }, "yaxis": { "anchor": "x", "autorange": true, "constrain": "domain", "domain": [ 0, 1 ], "range": [ 0.5, -0.5 ], "title": { "text": "Chem. species" }, "type": "category" } } }, "image/png": "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", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Show as heatmap\n", "fig = px.imshow(bio.system_snapshot().T, \n", " title= \"Initial System State (for the tiny system)\", \n", " labels=dict(x=\"Bin number\", y=\"Chem. species\", color=\"Concentration\"),\n", " text_auto=False, color_continuous_scale=\"gray_r\") \n", "\n", "fig.data[0].xgap=1\n", "fig.data[0].ygap=1\n", "\n", "fig.show()" ] }, { "cell_type": "markdown", "id": "259c41dd", "metadata": {}, "source": [ "### Now do 4 rounds of single-step diffusion, to collect the system state at a total of 5 time points: \n", "#### t0 (the initial state), plus t1, t2, t3 and t4" ] }, { "cell_type": "code", "execution_count": 9, "id": "5051007a", "metadata": {}, "outputs": [], "source": [ "# All the system states will get collected in this object\n", "history = MovieArray()" ] }, { "cell_type": "code", "execution_count": 10, "id": "8ec78ba5", "metadata": {}, "outputs": [], "source": [ "# Store the initial state\n", "arr = bio.lookup_species(species_index=0, copy=True)\n", "history.store(pars=bio.system_time, data_snapshot=arr, caption=f\"State at time {bio.system_time}\")" ] }, { "cell_type": "code", "execution_count": 11, "id": "7ed98602", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[50. , 55.87785252, 59.51056516, 59.51056516, 55.87785252,\n", " 50. , 44.12214748, 40.48943484, 40.48943484, 44.12214748]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Take a look at what got stored so far (a matrix whose only row is the initial state)\n", "history.get_array()" ] }, { "cell_type": "code", "execution_count": 12, "id": "5b702362", "metadata": {}, "outputs": [], "source": [ "# Additional parameters of the simulation run (the diffusion rate got set earlier)\n", "delta_t = 0.01\n", "delta_x = 2 # Note that the number of bins also define the fraction of the sine wave cycle in each bin\n", "algorithm = None # \"Explicit, with 3+1 stencil\"" ] }, { "cell_type": "code", "execution_count": 13, "id": "b02af31b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SYSTEM STATE at Time t = 0.01:\n", "[[50.14694631 55.82172403 59.41974735 59.41974735 55.82172403 50.\n", " 44.17827597 40.58025265 40.58025265 44.03132966]]\n", "SYSTEM STATE at Time t = 0.02:\n", "[[50.28881576 55.76980517 59.32979676 59.32979676 55.76613151 50.\n", " 44.23386849 40.67020324 40.66652958 43.94505274]]\n", "SYSTEM STATE at Time t = 0.03:\n", "[[50.42584049 55.72178022 59.24079697 59.24070513 55.71106985 50.\n", " 44.28893015 40.75920303 40.7485845 43.86308966]]\n", "SYSTEM STATE at Time t = 0.04:\n", "[[50.55823898 55.67735715 59.15281926 59.15246655 55.65653399 50.\n", " 44.34346372 40.84718074 40.82671259 43.78522703]]\n" ] } ], "source": [ "# Do the 4 rounds of single-step diffusion; show the system state after each step, and accumulate all data\n", "# in the history object\n", "for _ in range(4):\n", " bio.diffuse(time_step=delta_t, n_steps=1, delta_x=delta_x , algorithm=algorithm)\n", " bio.describe_state(concise=True)\n", "\n", " arr = bio.lookup_species(species_index=0, copy=True)\n", " history.store(pars=bio.system_time, data_snapshot=arr, caption=f\"State at time {bio.system_time}\")" ] }, { "cell_type": "code", "execution_count": 14, "id": "8a14efb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[50. , 55.87785252, 59.51056516, 59.51056516, 55.87785252,\n", " 50. , 44.12214748, 40.48943484, 40.48943484, 44.12214748],\n", " [50.14694631, 55.82172403, 59.41974735, 59.41974735, 55.82172403,\n", " 50. , 44.17827597, 40.58025265, 40.58025265, 44.03132966],\n", " [50.28881576, 55.76980517, 59.32979676, 59.32979676, 55.76613151,\n", " 50. , 44.23386849, 40.67020324, 40.66652958, 43.94505274],\n", " [50.42584049, 55.72178022, 59.24079697, 59.24070513, 55.71106985,\n", " 50. , 44.28893015, 40.75920303, 40.7485845 , 43.86308966],\n", " [50.55823898, 55.67735715, 59.15281926, 59.15246655, 55.65653399,\n", " 50. , 44.34346372, 40.84718074, 40.82671259, 43.78522703]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Now, let's examine the data collected at the 5 time points\n", "all_history = history.get_array()\n", "all_history" ] }, { "cell_type": "markdown", "id": "cc72bb99", "metadata": {}, "source": [ "#### Each row in the above matrix is a state snapshot at a different time:\n", "first row is the initial state at time 0; the successive rows are at t1, t2, t3, t4" ] }, { "cell_type": "code", "execution_count": 15, "id": "8e767eb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([50.28881576, 55.76980517, 59.32979676, 59.32979676, 55.76613151,\n", " 50. , 44.23386849, 40.67020324, 40.66652958, 43.94505274])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's consider the state, i.e. the concentration across the bins, at the midpoint in time (t2)\n", "f_at_t2 = all_history[2]\n", "f_at_t2" ] }, { "cell_type": "markdown", "id": "06ceebe4", "metadata": {}, "source": [ "If one compares the above state (at t2) with the initial state (the top row in the matrix), \n", "one can see, for example, that the leftmost bin's concentration is increasing (\"pulled up\" by its neighbor to the right):\n", "50. has now become 50.28881576\n", "\n", "The rightmost bin's concentration is decreasing (\"pulled down\" by its neighbor to the left):\n", "44.12214748 has now become 43.94505274" ] }, { "cell_type": "markdown", "id": "3a88a1ca", "metadata": {}, "source": [ "## The diffusion equation states that the partial derivative of the concentration values with respect to time must equal the (diffusion rate) times (the 2nd partial derivative with respect to space).\n", "Let's see if that is the case for the values at time t2! We are picking t2 because we need at least a value at the earlier time, and a value at the later time" ] }, { "cell_type": "markdown", "id": "09a0d7f8", "metadata": {}, "source": [ "## A. The 2nd partial derivative with respect to space" ] }, { "cell_type": "code", "execution_count": 16, "id": "1d06fc6a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2.74049471, 2.26024525, 0.8899979 , -0.89091631, -2.33244919,\n", " -2.88306575, -2.33244919, -0.89183473, 0.81871237, 1.63926158])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A simple-minded way of computing the 2nd spacial derivative is to use the Numpy gradient function TWICE across the x value\n", "# (that function approximates the derivative using differences)\n", "gradient_x_at_t2 = np.gradient(f_at_t2, delta_x) # Start with taking the first derivative\n", "gradient_x_at_t2 # This will be the partial derivative of the concentration with respect to x, at time t2" ] }, { "cell_type": "markdown", "id": "b7ebf78e", "metadata": {}, "source": [ "For example, the 2nd entry in the above array of estimated derivatives, can be manually checked from the 1st and 3rd value in the function f_at_t2(x), as follows:" ] }, { "cell_type": "code", "execution_count": 17, "id": "cde2fff9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.2602452500000005" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(59.32979676 - 50.28881576) / (2*delta_x) # This way of numerically estimating derivatives is called \"Central Differences\"" ] }, { "cell_type": "markdown", "id": "5b79c68f", "metadata": {}, "source": [ "#### Now take the derivative again, with the Numpy gradient function, to arrive at a coarse estimate of the 2nd derivative with respect to x:" ] }, { "cell_type": "code", "execution_count": 18, "id": "980650d1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-0.24012473, -0.4626242 , -0.78779039, -0.80561177, -0.49803736,\n", " 0. , 0.49780776, 0.78779039, 0.63277408, 0.4102746 ])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "second_gradient_x_at_t2 = np.gradient(gradient_x_at_t2, delta_x)\n", "second_gradient_x_at_t2" ] }, { "cell_type": "markdown", "id": "be13f82c", "metadata": {}, "source": [ "Note how the 2nd derivative is 0 at bin 5 (bins are numbered 0 thru 9): if you look at the earlier sine plot, x5 is the inflection point." ] }, { "cell_type": "markdown", "id": "58d3cd8e", "metadata": {}, "source": [ "### B. The partial derivative with respect to time\n", "Now, let's look at how concentrations change with time. Let's first revisit the full history:" ] }, { "cell_type": "code", "execution_count": 19, "id": "86a5c102", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[50. , 55.87785252, 59.51056516, 59.51056516, 55.87785252,\n", " 50. , 44.12214748, 40.48943484, 40.48943484, 44.12214748],\n", " [50.14694631, 55.82172403, 59.41974735, 59.41974735, 55.82172403,\n", " 50. , 44.17827597, 40.58025265, 40.58025265, 44.03132966],\n", " [50.28881576, 55.76980517, 59.32979676, 59.32979676, 55.76613151,\n", " 50. , 44.23386849, 40.67020324, 40.66652958, 43.94505274],\n", " [50.42584049, 55.72178022, 59.24079697, 59.24070513, 55.71106985,\n", " 50. , 44.28893015, 40.75920303, 40.7485845 , 43.86308966],\n", " [50.55823898, 55.67735715, 59.15281926, 59.15246655, 55.65653399,\n", " 50. , 44.34346372, 40.84718074, 40.82671259, 43.78522703]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_history" ] }, { "cell_type": "markdown", "id": "cace8215", "metadata": {}, "source": [ "#### For simplicity, let's start by just inspecting how the values change over time at the *3rd bin* from the left, \n", "i.e. the 3rd *column* (index 2 because counting starts at 0) of the above matrix:" ] }, { "cell_type": "code", "execution_count": 20, "id": "f1dc7ce4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([59.51056516, 59.41974735, 59.32979676, 59.24079697, 59.15281926])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f_of_t_at_x2 = all_history[ : , 2] # The column with index 2\n", "f_of_t_at_x2" ] }, { "cell_type": "markdown", "id": "2f372d89", "metadata": {}, "source": [ "### The above a function of time \n", "(we took an entry from each row - the rows being the system states at t0, t1, t2, t3, t4); let's look at its time derivative:" ] }, { "cell_type": "code", "execution_count": 21, "id": "21654172", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-9.0817816 , -9.03841995, -8.94751865, -8.84887524, -8.79777149])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gradient_t_at_x2 = np.gradient(f_of_t_at_x2, delta_t)\n", "gradient_t_at_x2" ] }, { "cell_type": "markdown", "id": "8fe73fb8", "metadata": {}, "source": [ "### The above is the rate of change of the concentration, as the diffusion proceeds, at the position x2\n", "At time t2, the midpoint in the simulation, the value is:" ] }, { "cell_type": "code", "execution_count": 22, "id": "270aaafa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.947518648702157" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gradient_t_at_x2[2]" ] }, { "cell_type": "markdown", "id": "3cf59301", "metadata": {}, "source": [ "### C. All said and done, we have collected the time derivative and the 2nd spacial derivative, at the point (x2, t2).\n", "Do those values satisfy the diffusion equation?? Does the time derivative indeed equal the (diffusion rate) x (the \n", "2nd spacial derivative)? Let's see:" ] }, { "cell_type": "code", "execution_count": 23, "id": "9b64a095", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.947518648702157" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gradient_t_at_x2[2]" ] }, { "cell_type": "code", "execution_count": 24, "id": "e19fc288", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-7.877903914825475" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diffusion_rate * second_gradient_x_at_t2[2]" ] }, { "cell_type": "markdown", "id": "24121c37", "metadata": {}, "source": [ "## D. The 2 value indeed roughly match - considering the coarseness of the large spacial grid, and the coarseness of estimating the derivatives numerically. \n", "We have evidence that the diffusion equation may indeed be satisfied by the values we obtained from our diffusion algorithm, in the proximity of the point (x2, t2)" ] }, { "cell_type": "markdown", "id": "86a00a96", "metadata": {}, "source": [ "### E. Finally, instead of just scrutining the match at the point x2, let's do that for all the points in space at time t2,\n", "WITH THE EXCEPTION of the outmost points (because the numeric estimation of the derivatives gets very crummy at the boundary).\n", " \n", "Let's first re-visit all the data once again:" ] }, { "cell_type": "code", "execution_count": 25, "id": "28225e05", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[50. , 55.87785252, 59.51056516, 59.51056516, 55.87785252,\n", " 50. , 44.12214748, 40.48943484, 40.48943484, 44.12214748],\n", " [50.14694631, 55.82172403, 59.41974735, 59.41974735, 55.82172403,\n", " 50. , 44.17827597, 40.58025265, 40.58025265, 44.03132966],\n", " [50.28881576, 55.76980517, 59.32979676, 59.32979676, 55.76613151,\n", " 50. , 44.23386849, 40.67020324, 40.66652958, 43.94505274],\n", " [50.42584049, 55.72178022, 59.24079697, 59.24070513, 55.71106985,\n", " 50. , 44.28893015, 40.75920303, 40.7485845 , 43.86308966],\n", " [50.55823898, 55.67735715, 59.15281926, 59.15246655, 55.65653399,\n", " 50. , 44.34346372, 40.84718074, 40.82671259, 43.78522703]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_history" ] }, { "cell_type": "code", "execution_count": 26, "id": "380f8bf6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[14.69463131, -5.61284971, -9.0817816 , -9.0817816 , -5.61284971,\n", " 0. , 5.61284971, 9.0817816 , 9.0817816 , -9.0817816 ],\n", " [14.44078779, -5.40236784, -9.03841995, -9.03841995, -5.58605073,\n", " 0. , 5.58605073, 9.03841995, 8.85473706, -8.85473706],\n", " [13.9447089 , -4.99719025, -8.94751865, -8.95211072, -5.5327087 ,\n", " 0. , 5.5327087 , 8.94751865, 8.41659228, -8.41200021],\n", " [13.47116142, -4.62240099, -8.84887524, -8.86651087, -5.47987603,\n", " 0. , 5.47976123, 8.84887524, 8.00915063, -7.99128539],\n", " [13.23984932, -4.44230744, -8.79777149, -8.8238586 , -5.45358643,\n", " 0. , 5.45335682, 8.79777149, 7.81280921, -7.7862629 ]])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The following is just an expanded version of what we did before for the time derivative; \n", "# instead of just considering 1 column,\n", "# like we did before, we're now repeating the computations along all columns\n", "# (the computations are applied vertically, \"along axis 0\" in Numpy-speak)\n", "gradient_t = np.apply_along_axis(np.gradient, 0, all_history, delta_t)\n", "gradient_t" ] }, { "cell_type": "code", "execution_count": 27, "id": "3278805e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([13.9447089 , -4.99719025, -8.94751865, -8.95211072, -5.5327087 ,\n", " 0. , 5.5327087 , 8.94751865, 8.41659228, -8.41200021])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Again, we focus on time t2 (the 3rd row), to stay away from the edges\n", "gradient_t_at_t2 = gradient_t[2]\n", "gradient_t_at_t2" ] }, { "cell_type": "markdown", "id": "d03cb73c", "metadata": {}, "source": [ "Note the value -8.94751865, 3rd from left : that's the single value we looked at before (at point x2)" ] }, { "cell_type": "markdown", "id": "9bba1933", "metadata": {}, "source": [ "#### Time to again check the match of the two sides of the diffusion equation" ] }, { "cell_type": "code", "execution_count": 28, "id": "d1bde2cd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([13.9447089 , -4.99719025, -8.94751865, -8.95211072, -5.5327087 ,\n", " 0. , 5.5327087 , 8.94751865, 8.41659228, -8.41200021])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lhs = gradient_t_at_t2 # The LEFT-hand side of the diffusion equation, as a vector for all the spacial points at time t2\n", "lhs" ] }, { "cell_type": "code", "execution_count": 29, "id": "1daa4abd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-2.40124727, -4.62624201, -7.87790391, -8.05611773, -4.9803736 ,\n", " 0. , 4.97807756, 7.87790391, 6.32774077, 4.10274602])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rhs = diffusion_rate * second_gradient_x_at_t2 # The RIGHT-hand side of the diffusion equation, again as a vector\n", "rhs" ] }, { "cell_type": "markdown", "id": "b0df453b", "metadata": {}, "source": [ "## The left-hand side and the right-hand side of the diffusion equation appear to generally agree, except at the boundary points, where our approximations are just too crummy" ] }, { "cell_type": "code", "execution_count": 30, "id": "aa858793", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 16.34595617, -0.37094824, -1.06961473, -0.89599299,\n", " -0.5523351 , 0. , 0.55463113, 1.06961473,\n", " 2.08885151, -12.51474623])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lhs - rhs" ] }, { "cell_type": "code", "execution_count": 31, "id": "0649f714", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.8643581811669576" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here we use a handy function to compare two equal-sized vectors,\n", "# while opting to disregarding a specified number of entries at each edge.\n", "# It returns the Euclidean distance (\"L2 norm\") of the shortened vectors\n", "num.compare_vectors(lhs, rhs, trim_edges=1)" ] }, { "cell_type": "markdown", "id": "3878d34e", "metadata": {}, "source": [ "#### IMPORTANT: all values in this experiment are VERY coarse, because of the large effective delta_x (the tiny number of bins.)\n", "In part2 (notebook \"validate_diffusion_2\"), much-better approximations will get looked at!" ] }, { "cell_type": "code", "execution_count": null, "id": "3926f0e9", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }