{ "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" ] }, { "cell_type": "markdown", "id": "bd4e6241-5025-46e8-90f2-2a4338e1f192", "metadata": {}, "source": [ "### TAGS : \"diffusion 1D\", \"under-the-hood\"" ] }, { "cell_type": "code", "execution_count": 1, "id": "d32124e4-3a7f-4b82-9add-cc8bfe1f6cf8", "metadata": {}, "outputs": [], "source": [ "LAST_REVISED = \"May 3, 2025\"\n", "LIFE123_VERSION = \"1.0.0rc3\" # Library version this experiment is based on" ] }, { "cell_type": "code", "execution_count": 2, "id": "3926f0e9", "metadata": {}, "outputs": [], "source": [ "#import set_path # Using MyBinder? Uncomment this before running the next cell!" ] }, { "cell_type": "code", "execution_count": 3, "id": "f88e0e66-e970-4dbb-907b-80560c2fbf46", "metadata": {}, "outputs": [], "source": [ "#import sys\n", "#sys.path.append(\"C:/some_path/my_env_or_install\") # CHANGE to the folder containing your venv or libraries installation!\n", "# NOTE: If any of the imports below can't find a module, uncomment the lines above, or try: import set_path \n", "\n", "from life123 import BioSim1D, ChemData, CollectionArray, Numerical, check_version\n", "\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 4, "id": "5c836a9f-3c3b-46d0-987b-9f5e4a7f2008", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OK\n" ] } ], "source": [ "check_version(LIFE123_VERSION)" ] }, { "cell_type": "code", "execution_count": null, "id": "1a8965fb-3801-428b-b4b9-6d8bb931efdb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 5, "id": "6207338f", "metadata": {}, "outputs": [], "source": [ "# We'll be considering just 1 chemical species, \"A\"\n", "diffusion_rate = 10.\n", "\n", "chem_data = ChemData(diffusion_rates=[diffusion_rate], names=[\"A\"])" ] }, { "cell_type": "code", "execution_count": 6, "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": 7, "id": "3f40acb3", "metadata": { "tags": [] }, "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(chem_label=\"A\", number_cycles=1, amplitude=10, bias=50)" ] }, { "cell_type": "code", "execution_count": 8, "id": "919ddc99", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SYSTEM SNAPSHOT at time 0:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A
050.000000
155.877853
259.510565
359.510565
455.877853
550.000000
644.122147
740.489435
840.489435
944.122147
\n", "
" ], "text/plain": [ " 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" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bio.show_system_snapshot()" ] }, { "cell_type": "code", "execution_count": 9, "id": "ec09bade-77c4-45e7-b1f5-d7e6c62c059b", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "Bin number=%{x}
[A]=%{y}", "legendgroup": "", "line": { "color": "darkturquoise", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "", "orientation": "v", "showlegend": false, "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": { "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)
System snapshot at time t=0" }, "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": "[A]" }, "type": "linear" } } }, "image/png": "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ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAASQc/oABCAAAQhAAAIQgAAEIAABCECgxQSQ8xY3ANVDAAIQgAAEIAABCEAAAhCAAAT+f7HRstSuQ62dAAAAAElFTkSuQmCC", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualize the initial system state\n", "bio.visualize_system(title_prefix=\"Initial System State (for the tiny system)\")" ] }, { "cell_type": "code", "execution_count": 10, "id": "517e7206-332f-40ab-a874-dadd9b889755", "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "colorbar": { "len": 1.2, "title": { "text": "Conc." }, "x": 1.02, "y": 0.5 }, "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)" ] ], "hovertemplate": "Conc.: %{z}
Bin #: %{x}
CHEM: %{y}A", "texttemplate": "%{z:.3g}", "type": "heatmap", "xaxis": "x", "xgap": 2, "y": [ "A" ], "yaxis": "y", "ygap": 2, "z": [ [ 50, 55.877852522924734, 59.510565162951536, 59.510565162951536, 55.877852522924734, 50, 44.12214747707527, 40.489434837048464, 40.489434837048464, 44.122147477075266 ] ] } ], "layout": { "autosize": true, "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)
System snapshot at time t=0" }, "xaxis": { "anchor": "y", "autorange": true, "domain": [ 0, 1 ], "range": [ -0.5, 9.5 ], "title": { "text": "Bin number" } }, "yaxis": { "anchor": "x", "autorange": true, "domain": [ 0, 1 ], "range": [ -0.5, 0.5 ], "type": "category" } } }, "image/png": "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HfBRau5s+Y4jtm68p7zsDeGyke/ec+7jPO8mcukbwrX6RYFGuPUsxHlro6YjiHMjIHFuB0zNQJxrOIlzrSNxbvckzu2GxLnG0M1CnGssiXONI3Guc6wizt3qfRin92SPsaP6vT+87EepZW8I5+Pcze0DPb2d7N3dy3ysm0584EzEuVGXODcCEud2QOJcaugmI841pFzWrnF0sxDnGkvOnGsciXONI3GucSTOdY5VxbluD7p/JuLceAyJcyMgcW4HJM6lhsS5jpM411kS5xpL4lzjSJxrHIlzjSNxrnMkznWW7c5EnLcr9+/HEedGQOLcDkicSw2Jcx0nca6zJM41lsS5xpE41zgS5xpH4lznSJzrLNudiThvV444N8r95+HcEE5G2XfpK3drt5lyWbvNzz+aONc4ulmIc40lca5xJM41jsS5xpE41zkS5zrLdmciztuVI86NcsS5DDA1ETeE06gS51pHbghn9yTO7YZuBuJc40icaxyJc40jca5zJM51lu3ORJy3K0ecG+WIcxkgcS6nJM41pJw51zi6WYhzjSVxrnEkzjWOxLnGkTjXORLnOst2ZyLO25Ujzo1yxLkMkDiXUxLnGlLiXONInOsciXONJXGucSTONY7Euc6RONdZtjsTcd6uHHFulCPOZYDEuZySONeQEucaR+Jc50icayyJc40jca5xJM51jsS5zrLdmYjzduWIc6MccS4DJM7llMS5hpQ41zgS5zpH4lxjSZxrHIlzjSNxrnMkznWW7c5EnLcrR5wb5YhzGSBxLqckzjWkxLnGkTjXORLnGkviXONInGsciXOdI3Gus2x3JuK8XTni3ChHnMsAiXM5JXGuISXONY7Euc6RONdYEucaR+Jc40ic6xxjxvk666yjW3jATE8//XTA6PhDiXOj+f0PP5GcMeNE4yy9/XA+51x3/PkoNY0lca515KPU7J7crd1u6GYgzjWOxLnGkTjXOBLnOseYcb7uuuvqFh4w07/+9a+A0fGHEudGc+LcCJj6YYkf4O2WxLnd0M1AnGsdeW3bPYlzuyFxrjF0sxDnGkviXONInOscY8b5euutp1t4wEz//Oc/A0bHH0qcG82JcyMgcW4HTM1AnGs4iXOtI3Fu9yTO7YbEucaQONc5Eud6y3vuWKKbtAdnihnn66+/fiXCTz31VCXbLbtR4rysVME44twISJzb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", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Show as heatmap\n", "bio.system_heatmaps(title_prefix=\"Initial System State (for the tiny system)\")" ] }, { "cell_type": "code", "execution_count": null, "id": "6b6bbc27-1ff6-4700-a09c-9530fbc8329b", "metadata": {}, "outputs": [], "source": [] }, { "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": 11, "id": "5051007a", "metadata": {}, "outputs": [], "source": [ "# All the system states will get collected in this object\n", "history = CollectionArray()" ] }, { "cell_type": "code", "execution_count": 12, "id": "8ec78ba5", "metadata": {}, "outputs": [], "source": [ "# Store the initial state\n", "arr = bio.lookup_species(chem_index=0, copy=True)\n", "history.store(par=bio.system_time, data_snapshot=arr, caption=f\"State at time {bio.system_time}\")" ] }, { "cell_type": "code", "execution_count": 13, "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": 13, "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": 14, "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": 15, "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(chem_index=0, copy=True)\n", " history.store(par=bio.system_time, data_snapshot=arr, caption=f\"State at time {bio.system_time}\")" ] }, { "cell_type": "code", "execution_count": 16, "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": 16, "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": 17, "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": 17, "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": 18, "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": 18, "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": 19, "id": "cde2fff9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.2602452500000005" ] }, "execution_count": 19, "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": 20, "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": 20, "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": 21, "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": 21, "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": 22, "id": "f1dc7ce4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([59.51056516, 59.41974735, 59.32979676, 59.24079697, 59.15281926])" ] }, "execution_count": 22, "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": 23, "id": "21654172", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-9.0817816 , -9.03841995, -8.94751865, -8.84887524, -8.79777149])" ] }, "execution_count": 23, "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": 24, "id": "270aaafa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.947518648702157" ] }, "execution_count": 24, "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": 25, "id": "9b64a095", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-8.947518648702157" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gradient_t_at_x2[2]" ] }, { "cell_type": "code", "execution_count": 26, "id": "e19fc288", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-7.877903914825475" ] }, "execution_count": 26, "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": 27, "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": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_history" ] }, { "cell_type": "code", "execution_count": 28, "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": 28, "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": 29, "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": 29, "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": 30, "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": 30, "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": 31, "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": 31, "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": 32, "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": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lhs - rhs" ] }, { "cell_type": "code", "execution_count": 33, "id": "0649f714", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.8643581811669576" ] }, "execution_count": 33, "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", "Numerical.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": "366a712b", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }