{
"cells": [
{
"cell_type": "markdown",
"id": "3bbe8002-bdf3-490c-bde0-80dd3713a3d0",
"metadata": {},
"source": [
"## Association/Dissociation reaction `2A <-> C`\n",
"#### with 2nd-order kinetics for `A`, \n",
"#### and 1-st order kinetics for `C`\n",
"\n",
"Taken to equilibrium. (Adaptive variable time substeps are used)\n",
"\n",
"_See also the experiment \"1D/reactions/reaction_7\"_ \n",
"\n",
"\n",
"LAST REVISED: Feb. 5, 2023"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "13e55c1d-609f-4bf0-a004-6c45bcfcbc99",
"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(2) # 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": "bdad128a-9214-46f5-aeb9-a7b77c81aa3e",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from experiments.get_notebook_info import get_notebook_basename\n",
"\n",
"from src.modules.reactions.reaction_data import ReactionData as chem\n",
"from src.modules.reactions.reaction_dynamics import ReactionDynamics\n",
"\n",
"import numpy as np\n",
"import plotly.express as px\n",
"from src.modules.visualization.graphic_log import GraphicLog"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "83c3cc5f-de21-4f66-9988-2806fbf0666d",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-> Output will be LOGGED into the file 'react_4.log.htm'\n"
]
}
],
"source": [
"# Initialize the HTML logging (for the graphics)\n",
"log_file = get_notebook_basename() + \".log.htm\" # Use the notebook base filename for the log file\n",
"\n",
"# Set up the use of some specified graphic (Vue) components\n",
"GraphicLog.config(filename=log_file,\n",
" components=[\"vue_cytoscape_1\"],\n",
" extra_js=\"https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.21.2/cytoscape.umd.js\")"
]
},
{
"cell_type": "markdown",
"id": "9329208b-070f-4902-8f37-0f11ddf75ed6",
"metadata": {},
"source": [
"# Initialize the System\n",
"Specify the chemicals and the reactions"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "72b4245c-de4e-480d-a501-3495b7ed8bc4",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of reactions: 1\n"
]
}
],
"source": [
"# Specify the chemicals\n",
"chem_data = chem(names=[\"A\", \"C\"])\n",
"\n",
"# Reaction 2A <-> C , with 2nd-order kinetics for A, and 1st-order kinetics for C\n",
"chem_data.add_reaction(reactants=[(2, \"A\", 2)], products=[\"C\"],\n",
" forward_rate=3., reverse_rate=2.) \n",
"# Note: the first 2 in (2, \"A\", 2) is the stoichiometry coefficient, while the other one is the order\n",
"\n",
"print(\"Number of reactions: \", chem_data.number_of_reactions())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "00ea560d-9a49-4041-b119-6de11bfcc7af",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of reactions: 1 (at temp. 25 C)\n",
"0: 2 A <-> C (kF = 3 / kR = 2 / Delta_G = -1,005.13 / K = 1.5) | 2-th order in reactant A\n"
]
}
],
"source": [
"chem_data.describe_reactions()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "cb582868-431c-4022-aa0e-a2f554f80d6c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[GRAPHIC ELEMENT SENT TO LOG FILE `react_4.log.htm`]\n"
]
}
],
"source": [
"# Send a plot of the network of reactions to the HTML log file\n",
"graph_data = chem_data.prepare_graph_network()\n",
"GraphicLog.export_plot(graph_data, \"vue_cytoscape_1\")"
]
},
{
"cell_type": "markdown",
"id": "98a9fbe5-2090-4d38-9c5f-94fbf7c3eae2",
"metadata": {},
"source": [
"# Start the simulation"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "c2f4a554-807b-49f9-8ca2-8d929fe6eeef",
"metadata": {},
"outputs": [],
"source": [
"dynamics = ReactionDynamics(reaction_data=chem_data)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ae304704-c8d9-4cef-9e0b-2587bb3909ef",
"metadata": {},
"outputs": [],
"source": [
"# Initial concentrations of all the chemicals, in index order\n",
"dynamics.set_conc([200., 40.], snapshot=True)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "a605dacf-2c67-403e-9aa9-5be25fc9f481",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SYSTEM STATE at Time t = 0:\n",
"2 species:\n",
" Species 0 (A). Conc: 200.0\n",
" Species 1 (C). Conc: 40.0\n"
]
}
],
"source": [
"dynamics.describe_state()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0ff2c242-a15b-456d-ad56-0ba1041c0b4c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" C | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.0 | \n",
" 200.0 | \n",
" 40.0 | \n",
" Initial state | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A C caption\n",
"0 0.0 200.0 40.0 Initial state"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.get_history()"
]
},
{
"cell_type": "markdown",
"id": "fc516ca2-e62d-4784-b826-5372ff7f4c75",
"metadata": {
"tags": []
},
"source": [
"## Run the reaction"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "2502cd11-0df9-4303-8895-98401a1df7b8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_compartment_react(): setting abs_fast_threshold to 300.0\n",
"20 total step(s) taken\n"
]
}
],
"source": [
"dynamics.set_diagnostics() # To save diagnostic information about the call to single_compartment_react()\n",
"#dynamics.verbose_list = [1] # Uncomment for detailed run information (meant for debugging the adaptive variable time step)\n",
"\n",
"# The changes of concentrations vary very rapidly early on; so, we'll be using dynamic_substeps=4 , i.e. increase time resolution\n",
"# by x4 initially, as long as the reaction remains \"fast\" (based on a threshold of 5% change)\n",
"dynamics.single_compartment_react(time_step=0.002, reaction_duration=0.04,\n",
" snapshots={\"initial_caption\": \"1st reaction step\",\n",
" \"final_caption\": \"last reaction step\"},\n",
" dynamic_substeps=4, rel_fast_threshold=60)"
]
},
{
"cell_type": "markdown",
"id": "99a9a4b2-a588-4ba5-85c9-0a5a5d1dbaad",
"metadata": {},
"source": [
"### Note: the argument _dynamic_step=4_ splits the time steps in 4 whenever the reaction is \"fast\" (as determined using the given value of _fast_threshold_ )"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "80fbaee3-bd6f-4197-9270-23374d46a4a7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" SYSTEM TIME | \n",
" A | \n",
" C | \n",
" caption | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.0000 | \n",
" 200.000000 | \n",
" 40.000000 | \n",
" Initial state | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.0005 | \n",
" 80.080000 | \n",
" 99.960000 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 2 | \n",
" 0.0010 | \n",
" 61.041501 | \n",
" 109.479250 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 3 | \n",
" 0.0015 | \n",
" 50.082265 | \n",
" 114.958868 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.0020 | \n",
" 42.787483 | \n",
" 118.606259 | \n",
" 1st reaction step | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.0025 | \n",
" 37.532389 | \n",
" 121.233805 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.0030 | \n",
" 33.548816 | \n",
" 123.225592 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.0035 | \n",
" 30.418698 | \n",
" 124.790651 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 8 | \n",
" 0.0040 | \n",
" 27.892388 | \n",
" 126.053806 | \n",
" | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.0045 | \n",
" 25.810540 | \n",
" 127.094730 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 10 | \n",
" 0.0050 | \n",
" 24.066177 | \n",
" 127.966911 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 11 | \n",
" 0.0055 | \n",
" 22.584568 | \n",
" 128.707716 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 12 | \n",
" 0.0060 | \n",
" 21.311796 | \n",
" 129.344102 | \n",
" | \n",
"
\n",
" \n",
" | 13 | \n",
" 0.0065 | \n",
" 20.207906 | \n",
" 129.896047 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 14 | \n",
" 0.0070 | \n",
" 19.242620 | \n",
" 130.378690 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 15 | \n",
" 0.0075 | \n",
" 18.392542 | \n",
" 130.803729 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 16 | \n",
" 0.0080 | \n",
" 17.639292 | \n",
" 131.180354 | \n",
" | \n",
"
\n",
" \n",
" | 17 | \n",
" 0.0085 | \n",
" 16.968219 | \n",
" 131.515890 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 18 | \n",
" 0.0090 | \n",
" 16.367490 | \n",
" 131.816255 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 19 | \n",
" 0.0095 | \n",
" 15.827438 | \n",
" 132.086281 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 20 | \n",
" 0.0100 | \n",
" 15.340087 | \n",
" 132.329956 | \n",
" | \n",
"
\n",
" \n",
" | 21 | \n",
" 0.0105 | \n",
" 14.898792 | \n",
" 132.550604 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 22 | \n",
" 0.0110 | \n",
" 14.497971 | \n",
" 132.751014 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 23 | \n",
" 0.0115 | \n",
" 14.132900 | \n",
" 132.933550 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 24 | \n",
" 0.0120 | \n",
" 13.799550 | \n",
" 133.100225 | \n",
" | \n",
"
\n",
" \n",
" | 25 | \n",
" 0.0125 | \n",
" 13.494468 | \n",
" 133.252766 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 26 | \n",
" 0.0130 | \n",
" 13.214672 | \n",
" 133.392664 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 27 | \n",
" 0.0135 | \n",
" 12.957574 | \n",
" 133.521213 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 28 | \n",
" 0.0140 | \n",
" 12.720921 | \n",
" 133.639540 | \n",
" | \n",
"
\n",
" \n",
" | 29 | \n",
" 0.0145 | \n",
" 12.502734 | \n",
" 133.748633 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 30 | \n",
" 0.0150 | \n",
" 12.301276 | \n",
" 133.849362 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 31 | \n",
" 0.0155 | \n",
" 12.115011 | \n",
" 133.942495 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 32 | \n",
" 0.0160 | \n",
" 11.942575 | \n",
" 134.028712 | \n",
" | \n",
"
\n",
" \n",
" | 33 | \n",
" 0.0165 | \n",
" 11.782758 | \n",
" 134.108621 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 34 | \n",
" 0.0170 | \n",
" 11.634475 | \n",
" 134.182763 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 35 | \n",
" 0.0175 | \n",
" 11.496757 | \n",
" 134.251621 | \n",
" Interm. step, due to the fast rxns: [0] | \n",
"
\n",
" \n",
" | 36 | \n",
" 0.0180 | \n",
" 11.368734 | \n",
" 134.315633 | \n",
" | \n",
"
\n",
" \n",
" | 37 | \n",
" 0.0200 | \n",
" 10.892282 | \n",
" 134.553859 | \n",
" | \n",
"
\n",
" \n",
" | 38 | \n",
" 0.0220 | \n",
" 10.545011 | \n",
" 134.727494 | \n",
" | \n",
"
\n",
" \n",
" | 39 | \n",
" 0.0240 | \n",
" 10.288464 | \n",
" 134.855768 | \n",
" | \n",
"
\n",
" \n",
" | 40 | \n",
" 0.0260 | \n",
" 10.097080 | \n",
" 134.951460 | \n",
" | \n",
"
\n",
" \n",
" | 41 | \n",
" 0.0280 | \n",
" 9.953280 | \n",
" 135.023360 | \n",
" | \n",
"
\n",
" \n",
" | 42 | \n",
" 0.0300 | \n",
" 9.844653 | \n",
" 135.077673 | \n",
" | \n",
"
\n",
" \n",
" | 43 | \n",
" 0.0320 | \n",
" 9.762268 | \n",
" 135.118866 | \n",
" | \n",
"
\n",
" \n",
" | 44 | \n",
" 0.0340 | \n",
" 9.699597 | \n",
" 135.150202 | \n",
" | \n",
"
\n",
" \n",
" | 45 | \n",
" 0.0360 | \n",
" 9.651812 | \n",
" 135.174094 | \n",
" | \n",
"
\n",
" \n",
" | 46 | \n",
" 0.0380 | \n",
" 9.615315 | \n",
" 135.192342 | \n",
" | \n",
"
\n",
" \n",
" | 47 | \n",
" 0.0400 | \n",
" 9.587402 | \n",
" 135.206299 | \n",
" last reaction step | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" SYSTEM TIME A C \\\n",
"0 0.0000 200.000000 40.000000 \n",
"1 0.0005 80.080000 99.960000 \n",
"2 0.0010 61.041501 109.479250 \n",
"3 0.0015 50.082265 114.958868 \n",
"4 0.0020 42.787483 118.606259 \n",
"5 0.0025 37.532389 121.233805 \n",
"6 0.0030 33.548816 123.225592 \n",
"7 0.0035 30.418698 124.790651 \n",
"8 0.0040 27.892388 126.053806 \n",
"9 0.0045 25.810540 127.094730 \n",
"10 0.0050 24.066177 127.966911 \n",
"11 0.0055 22.584568 128.707716 \n",
"12 0.0060 21.311796 129.344102 \n",
"13 0.0065 20.207906 129.896047 \n",
"14 0.0070 19.242620 130.378690 \n",
"15 0.0075 18.392542 130.803729 \n",
"16 0.0080 17.639292 131.180354 \n",
"17 0.0085 16.968219 131.515890 \n",
"18 0.0090 16.367490 131.816255 \n",
"19 0.0095 15.827438 132.086281 \n",
"20 0.0100 15.340087 132.329956 \n",
"21 0.0105 14.898792 132.550604 \n",
"22 0.0110 14.497971 132.751014 \n",
"23 0.0115 14.132900 132.933550 \n",
"24 0.0120 13.799550 133.100225 \n",
"25 0.0125 13.494468 133.252766 \n",
"26 0.0130 13.214672 133.392664 \n",
"27 0.0135 12.957574 133.521213 \n",
"28 0.0140 12.720921 133.639540 \n",
"29 0.0145 12.502734 133.748633 \n",
"30 0.0150 12.301276 133.849362 \n",
"31 0.0155 12.115011 133.942495 \n",
"32 0.0160 11.942575 134.028712 \n",
"33 0.0165 11.782758 134.108621 \n",
"34 0.0170 11.634475 134.182763 \n",
"35 0.0175 11.496757 134.251621 \n",
"36 0.0180 11.368734 134.315633 \n",
"37 0.0200 10.892282 134.553859 \n",
"38 0.0220 10.545011 134.727494 \n",
"39 0.0240 10.288464 134.855768 \n",
"40 0.0260 10.097080 134.951460 \n",
"41 0.0280 9.953280 135.023360 \n",
"42 0.0300 9.844653 135.077673 \n",
"43 0.0320 9.762268 135.118866 \n",
"44 0.0340 9.699597 135.150202 \n",
"45 0.0360 9.651812 135.174094 \n",
"46 0.0380 9.615315 135.192342 \n",
"47 0.0400 9.587402 135.206299 \n",
"\n",
" caption \n",
"0 Initial state \n",
"1 Interm. step, due to the fast rxns: [0] \n",
"2 Interm. step, due to the fast rxns: [0] \n",
"3 Interm. step, due to the fast rxns: [0] \n",
"4 1st reaction step \n",
"5 Interm. step, due to the fast rxns: [0] \n",
"6 Interm. step, due to the fast rxns: [0] \n",
"7 Interm. step, due to the fast rxns: [0] \n",
"8 \n",
"9 Interm. step, due to the fast rxns: [0] \n",
"10 Interm. step, due to the fast rxns: [0] \n",
"11 Interm. step, due to the fast rxns: [0] \n",
"12 \n",
"13 Interm. step, due to the fast rxns: [0] \n",
"14 Interm. step, due to the fast rxns: [0] \n",
"15 Interm. step, due to the fast rxns: [0] \n",
"16 \n",
"17 Interm. step, due to the fast rxns: [0] \n",
"18 Interm. step, due to the fast rxns: [0] \n",
"19 Interm. step, due to the fast rxns: [0] \n",
"20 \n",
"21 Interm. step, due to the fast rxns: [0] \n",
"22 Interm. step, due to the fast rxns: [0] \n",
"23 Interm. step, due to the fast rxns: [0] \n",
"24 \n",
"25 Interm. step, due to the fast rxns: [0] \n",
"26 Interm. step, due to the fast rxns: [0] \n",
"27 Interm. step, due to the fast rxns: [0] \n",
"28 \n",
"29 Interm. step, due to the fast rxns: [0] \n",
"30 Interm. step, due to the fast rxns: [0] \n",
"31 Interm. step, due to the fast rxns: [0] \n",
"32 \n",
"33 Interm. step, due to the fast rxns: [0] \n",
"34 Interm. step, due to the fast rxns: [0] \n",
"35 Interm. step, due to the fast rxns: [0] \n",
"36 \n",
"37 \n",
"38 \n",
"39 \n",
"40 \n",
"41 \n",
"42 \n",
"43 \n",
"44 \n",
"45 \n",
"46 \n",
"47 last reaction step "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = dynamics.get_history()\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "071a9544-639a-40f7-92bc-3a20050c9c00",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"From time 0 to 0.018, in 36 substeps of 0.0005 (each 1/4 of full step)\n",
"From time 0.018 to 0.04, in 11 FULL steps of 0.002\n"
]
}
],
"source": [
"dynamics.explain_time_advance()"
]
},
{
"cell_type": "markdown",
"id": "9fb5f6b8-dde3-415d-9e90-b8d102bfd748",
"metadata": {},
"source": [
"### Notice how the reaction proceeds in smaller steps in the early times, when the concentrations are changing much more rapidly"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "12118fdd-5e81-42e5-b271-818f8d686b79",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([200.0, 40.0], dtype=object),\n",
" array([80.08, 99.96000000000001], dtype=object))"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's look at the first two arrays of concentrations, from the run's history\n",
"arr0 = dynamics.get_historical_concentrations(0)\n",
"arr1 = dynamics.get_historical_concentrations(1)\n",
"arr0, arr1"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "a2450ae8-e342-4adf-9330-ce86a1dfcbeb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's verify that the stoichiometry is being respected\n",
"dynamics.stoichiometry_checker(rxn_index=0, \n",
" conc_arr_before = arr0, \n",
" conc_arr_after = arr1)"
]
},
{
"cell_type": "markdown",
"id": "bf6dc3ed-5999-4379-8ae1-05f73e2a670d",
"metadata": {},
"source": [
"#### Indeed, it can be easy checked that the drop in [A] is -119.920000 , twice the 59.96 increase in [C], as dictated by the stoichiometry"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "4ccfa79c-0bd4-40f0-be82-2da19523cd40",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TIME 0.0\n",
"Delta A -119.92\n",
"Delta C 59.96\n",
"reaction 0\n",
"substep 0\n",
"time_subdivision 4\n",
"delta_time 0.0005\n",
"caption \n",
"Name: 0, dtype: object"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dynamics.diagnostic_data[0].get().loc[0] # Conveniently seen in the diagnostic data"
]
},
{
"cell_type": "markdown",
"id": "b1366038-2dea-4d69-a655-ae464ca22922",
"metadata": {},
"source": [
"## Note: \"A\" (now largely depleted) is the limiting reagent"
]
},
{
"cell_type": "markdown",
"id": "c02a8f55-a671-4771-86c9-fc4d1b126bf8",
"metadata": {},
"source": [
"### Check the final equilibrium"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "765f6f39-4b2e-4a86-b6a9-ace9d1941663",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2 A <-> C\n",
"Final concentrations: [C] = 135.2 ; [A] = 9.587\n",
"1. Ratio of reactant/product concentrations, adjusted for reaction orders: 1.47094\n",
" Formula used: [C] / [A]^2 \n",
"2. Ratio of forward/reverse reaction rates: 1.5\n",
"Discrepancy between the two values: 1.937 %\n",
"Reaction IS in equilibrium (within 2% tolerance)\n",
"\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Verify that the reaction has reached equilibrium\n",
"dynamics.is_in_equilibrium(tolerance=2)"
]
},
{
"cell_type": "markdown",
"id": "6ac3dd4e-9dd0-4d3a-aa83-76102bd79524",
"metadata": {
"tags": []
},
"source": [
"## Plots of changes of concentration with time"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "21e4814e-5603-4d38-acc8-549b1d59ec93",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "Chemical=A
SYSTEM TIME=%{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,
0.0005,
0.001,
0.0015,
0.002,
0.0025,
0.003,
0.0035,
0.004,
0.0045000000000000005,
0.005,
0.0055,
0.006,
0.006500000000000001,
0.007,
0.0075,
0.008,
0.0085,
0.009000000000000001,
0.0095,
0.01,
0.0105,
0.011,
0.0115,
0.012,
0.0125,
0.013000000000000001,
0.0135,
0.014,
0.0145,
0.015,
0.0155,
0.016,
0.0165,
0.017,
0.0175,
0.018000000000000002,
0.020000000000000004,
0.022000000000000006,
0.024000000000000007,
0.02600000000000001,
0.02800000000000001,
0.030000000000000013,
0.032000000000000015,
0.034000000000000016,
0.03600000000000002,
0.03800000000000002,
0.04000000000000002
],
"xaxis": "x",
"y": [
200,
80.08,
61.041500799999994,
50.082264839450794,
42.78748282026467,
37.53238927916107,
33.54881615487446,
30.418698142538886,
27.892387854335652,
25.81053956583124,
24.06617716822739,
22.584568340581637,
21.311795590849847,
20.207905901340496,
19.24261961268686,
18.39254176439849,
17.639292444968664,
16.96821923864631,
16.367489627015363,
15.827437987316982,
15.34008716960257,
14.898792259319952,
14.497971434701515,
14.13289993610255,
13.799550454354787,
13.494468125673581,
13.214671647563447,
12.957574335657132,
12.720920563329233,
12.502734182830306,
12.301276362507936,
12.115010885705038,
11.94257540853708,
11.782757510962758,
11.634474629765348,
11.496757155403623,
11.368734122977246,
10.89228179977797,
10.545011038909566,
10.288463901025233,
10.09708017210874,
9.953279515396407,
9.844653119995504,
9.762268166879077,
9.699596537066833,
9.65181207513602,
9.615315110830577,
9.587402434220454
],
"yaxis": "y"
},
{
"hovertemplate": "Chemical=C
SYSTEM TIME=%{x}
concentration=%{y}",
"legendgroup": "C",
"line": {
"color": "green",
"dash": "solid"
},
"marker": {
"symbol": "circle"
},
"mode": "lines",
"name": "C",
"orientation": "v",
"showlegend": true,
"type": "scatter",
"x": [
0,
0.0005,
0.001,
0.0015,
0.002,
0.0025,
0.003,
0.0035,
0.004,
0.0045000000000000005,
0.005,
0.0055,
0.006,
0.006500000000000001,
0.007,
0.0075,
0.008,
0.0085,
0.009000000000000001,
0.0095,
0.01,
0.0105,
0.011,
0.0115,
0.012,
0.0125,
0.013000000000000001,
0.0135,
0.014,
0.0145,
0.015,
0.0155,
0.016,
0.0165,
0.017,
0.0175,
0.018000000000000002,
0.020000000000000004,
0.022000000000000006,
0.024000000000000007,
0.02600000000000001,
0.02800000000000001,
0.030000000000000013,
0.032000000000000015,
0.034000000000000016,
0.03600000000000002,
0.03800000000000002,
0.04000000000000002
],
"xaxis": "x",
"y": [
40,
99.96000000000001,
109.4792496,
114.9588675802746,
118.60625858986766,
121.23380536041947,
123.22559192256277,
124.79065092873056,
126.05380607283217,
127.09473021708438,
127.9669114158863,
128.70771582970917,
129.34410220457508,
129.89604704932975,
130.37869019365658,
130.80372911780077,
131.18035377751568,
131.51589038067686,
131.81625518649233,
132.08628100634152,
132.32995641519872,
132.55060387034004,
132.75101428264927,
132.93355003194876,
133.10022477282263,
133.25276593716322,
133.3926641762183,
133.52121283217144,
133.6395397183354,
133.74863290858488,
133.84936181874608,
133.9424945571475,
134.02871229573148,
134.10862124451864,
134.18276268511735,
134.25162142229823,
134.31563293851138,
134.55385910011103,
134.72749448054523,
134.8557680494874,
134.95145991394565,
135.02336024230183,
135.0776734400023,
135.1188659165605,
135.15020173146664,
135.17409396243204,
135.19234244458477,
135.20629878288983
],
"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": "Reaction 2A <-> C (2nd order in A). Changes in concentrations with time"
},
"xaxis": {
"anchor": "y",
"autorange": true,
"domain": [
0,
1
],
"range": [
0,
0.04000000000000002
],
"title": {
"text": "SYSTEM TIME"
},
"type": "linear"
},
"yaxis": {
"anchor": "x",
"autorange": true,
"domain": [
0,
1
],
"range": [
-0.9910752083228527,
210.5784776425433
],
"title": {
"text": "concentration"
},
"type": "linear"
}
}
},
"image/png": "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",
"text/html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dynamics.plot_curves(colors=['red', 'green'],\n",
" title=\"Reaction 2A <-> C (2nd order in A). Changes in concentrations with time\")"
]
},
{
"cell_type": "markdown",
"id": "5c3f8b4f-3a75-4a21-8579-13550bcebb3c",
"metadata": {},
"source": [
"#### For diagnostic insight, uncomment the following lines:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "10af1095-a320-4fa4-a45e-e1f3f87203c9",
"metadata": {},
"outputs": [],
"source": [
"#dynamics.examine_run(df=df, time_step=0.002, rel_fast_threshold=60)\n",
"# the time step MUST match the value used in call to single_compartment_react()\n",
"\n",
"#dynamics.diagnose_variable_time_steps()\n",
"\n",
"#dynamics.get_diagnostic_data(rxn_index=0)\n",
"\n",
"#dynamics.diagnostic_data_baselines.get()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3f0ceb35-42b5-4c06-8e5c-bd40088ab60b",
"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
}