U-2R
Derivation of equilibrium thermodynamic equations for U-2R system: isomerization in the binding-incompetent state of the receptor
2. Basic equilibrium equations
3. Derivation of equations for equilibrium concentrations
4. Prepare equations for a numeric solution
5. Save results on disk for future use
In this document, I am developing equilibrium thermodynamic equations to calculate concentrations of species at all points in titrations
clean up workspace
reset()
Set path to save results into:
ProjectName:="U-2R";
CurrentPath:="/Users/kovrigin_laptop/Documents/Workspace/Global_Analysis/IDAP/Mathematical_models/Equilibrium_thermodynamic_models/U-multi-path-models/nR/U-2R";
Binding and isomerization constants
All binding constants I am using are association constants.
These relationships serve as restraints for solve(), but not restrict these values in calculations!
K_A
K_A ;
assumeAlso(K_A > 0):
assumeAlso(K_A , R_)
To denote "starred" species, I will use s1 for *, s2 for **, etc.
K_B_s_1
K_B_s_1 ;
assumeAlso(K_B_s_1 > 0):
assumeAlso(K_B_s_1 , R_):
K_B_s_2
K_B_s_2 ;
assumeAlso(K_B_s_2 > 0):
assumeAlso(K_B_s_2 , R_):
Total concentrations
Rtot - total concentration of the receptor
Rtot;
assumeAlso(Rtot>0):
assumeAlso(Rtot,R_):
Ltot - total concentration of the ligand
Ltot;
assumeAlso(Ltot>0):
assumeAlso(Ltot,R_):
Equilibrium concentrations
Req - equilibrium concentration of the binding-competent receptor form
Req;
assumeAlso(Req>0):
assumeAlso(Req<=Rtot):
assumeAlso(Req,R_):
Equilibrium concentrations of the binding incompetent receptor isomers R* and R**
R_s_1eq
R_s_1eq;
assumeAlso(R_s_1eq>0):
assumeAlso(R_s_1eq<=Rtot):
assumeAlso(R_s_1eq,R_):
R_s_2eq
R_s_2eq;
assumeAlso(R_s_2eq>0):
assumeAlso(R_s_2eq<=Rtot):
assumeAlso(R_s_2eq,R_):
Leq - equilibrium concentration of a free ligand
Leq;
assumeAlso(Leq>0):
assumeAlso(Leq<Ltot):
assumeAlso(Leq,R_):
RLeq - equilibrium concentration of the receptor-ligand complex
RLeq;
assumeAlso(RLeq>0):
assumeAlso(RLeq<Rtot):
assumeAlso(RLeq<Ltot):
assumeAlso(RLeq,R_):
Check what we defined
anames(Properties,User);
2. Basic equilibrium equations
Mass conservation equations
eq2_1:= Rtot = Req + R_s_1eq + R_s_2eq + RLeq;
eq2_2:= Ltot = Leq + RLeq;
Equilibrium constants
eq2_3:= K_A = RLeq / (Req*Leq);
eq2_4:= K_B_s_1 = R_s_1eq/Req
eq2_5:= K_B_s_2 = R_s_2eq/Req
3. Derivation of equations for equilibrium concentrations
Express Leq as a function of all constants and total concentrations. If insoluble ---express Rtot=f(Leq and all constants).
Express the highest-order bound species first:
RL
eq2_3;
solve(%,RLeq):
%[1][1]:
eq3_1:= RLeq=%
Substitute into the mass conservation laws:
eq2_1;
% | eq3_1:
eq3_2:= %
eq2_2;
% | eq3_1:
eq3_3:= %
Express isomer concentrations
R*
eq2_4;
solve(%,R_s_1eq):
%[2][1]:
eq3_7:= R_s_1eq = %
-> conservation laws
eq3_2;
% | eq3_7:
eq3_8:= %
R**
eq2_5;
solve(%, R_s_2eq):
%[2][1]:
eq3_9:= R_s_2eq = %
-> conservation laws
eq3_8;
% | eq3_9:
eq3_10:= %
Aim to obtain Rtot=f(Leq, constants) function
express Req from conservation law for ligand (Ltot=...)
eq3_3;
solve(%,Req):
%[1][1]:
eq3_11:= Req = %
substitute in the conservation law for receptor: (Rtot=...)
eq3_10;
% | eq3_11;
temp1:=%[2];
temp2:=Simplify(%);
// test
temp1=temp2;
Simplify(%);
// Assemble a final equation
eq3_12:= Rtot =temp2
Attempt to solve for Leq
solution3_12:=solve(eq3_12, Leq)
Extract solutions:
solution_lines:=6:
eq3_13:= solution3_12[i,1] $ i=1..solution_lines;
nops(%)
Extract solutions
solution1:=eq3_13[1][1];
solution2:=eq3_13[2][1] ;
solution3:=eq3_13[4][1];
solution4:=eq3_13[5][1];
Analysis of solutions
If having a sequence of roots: Is 1st solution a combination of 2nd and 3rd?
/*
solutionA:=eq3_13[1]; // a sequence of roots
if solution2 in solutionA
then print(Unquoted,"First set of roots contains the second root.");
else print(Unquoted,"First set of roots DOES NOT contain the second root!");
end_if;
if solution3 in solutionA
then print(Unquoted,"First set of roots contains the third root.");
else print(Unquoted,"First set of roots DOES NOT contain the third root!");
end_if;
*/
Check correctness of the solution by substitution
eq3_12;
// Check the 1st solution
test1:=eq3_12 | Leq=solution1;
normal(%);
Simplify(%);
bool(%)
odd!
eq3_12;
// Check the 2nd solution
test1:=eq3_12 | Leq=solution2;
normal(%);
Simplify(%);
bool(%)
odd!
eq3_12;
// Check the 3rd solution
test1:=eq3_12 | Leq=solution3;
normal(%);
Simplify(%);
bool(%)
works...
eq3_12;
// Check the 4th solution
test1:=eq3_12 | Leq=solution4;
normal(%);
Simplify(%);
bool(%)
works...
=> two last solutions are confirmed by substitution. Proceed with these checking solutions numerically.
Test which solution is meaningful numerically
solution1;
% | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningless
solution2;
% | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningful?
solution3;
% | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningless
solution4;
% | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningful and different from solution 2!
Re-check positive solutions by substitution and calculation:
// Solution 2
test1:=eq3_12 | Leq=solution2;
result:= % | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(result);
Simplify(result);
wrong solution!!!
Re-check by substitution and calculation:
// Solution 4
test1:=eq3_12 | Leq=solution4;
result:= % | K_A=1 | K_B_s_1=1 | K_B_s_2=1 | Rtot=1 | Ltot=1;
float(result);
Simplify(result);
CORRECT!!!
Choose as a final solution
eq3_14:= Leq = solution4
Summary of equations for all species
Show species names
anames(Properties,User);
Name equations to recognize them in a different context
Leq_U_2R:=eq3_14
Req_U_2R:=eq3_11
R_s_1eq_U_2R:=eq3_7
R_s_2eq_U_2R:=eq3_9
RLeq_U_2R:=eq3_1
Create functions for computing concentrations
Here I only check that the results are numerically meaningful--functions were created right. Scientific meaningfulness will be analyzed in a separate notebook 'Analysis'.
(use --> to force direct substitution):
fLeq_U_2R:= (Rtot, Ltot, K_A, K_B_s_1, K_B_s_2) --> Leq_U_2R[2]
//test operation
fLeq_U_2R(1,1,1,1,1):
float(%)
=> OK
fReq_U_2R:=(Rtot, Ltot, K_A, K_B_s_1, K_B_s_2) --> Req_U_2R[2] | Leq_U_2R
//test operation
fReq_U_2R(1,1,1,1,1):
float(%)
=> OK
fR_s_1eq_U_2R:=(Rtot, Ltot, K_A, K_B_s_1, K_B_s_2) --> R_s_1eq_U_2R[2] | Req_U_2R | Leq_U_2R
//test operation
fR_s_1eq_U_2R(1,1,1,1,1):
float(%)
=> OK
fR_s_2eq_U_2R:=(Rtot, Ltot, K_A, K_B_s_1, K_B_s_2) --> R_s_2eq_U_2R[2] | Req_U_2R | Leq_U_2R
//test operation
fR_s_2eq_U_2R(1,1,1,1,1):
float(%)
=> OK
fRLeq_U_2R:=(Rtot, Ltot, K_A, K_B_s_1, K_B_s_2) --> RLeq_U_2R[2] | Req_U_2R | Leq_U_2R
//test operation
fRLeq_U_2R(1,1,1,1,1):
float(%)
=> OK
Check conservation laws (check the Rtot and Ltot are set to 1) :
fRLeq_U_2R(1,1,1,1,1)+fLeq_U_2R(1,1,1,1,1)
good
fRLeq_U_2R(1,1,1,1,1)+fR_s_2eq_U_2R(1,1,1,1,1)+fR_s_1eq_U_2R(1,1,1,1,1)+fReq_U_2R(1,1,1,1,1);
float(%)
good!
(you can retrieve them later by executing: fread(filename,Quiet))
ProjectName
filename:=CurrentPath.ProjectName.".mb";
write(filename,
// Equations
Leq_U_2R,
Req_U_2R,
R_s_1eq_U_2R,
R_s_2eq_U_2R,
RLeq_U_2R,
// Analytical functions
fLeq_U_2R,
fReq_U_2R,
fR_s_1eq_U_2R,
fR_s_2eq_U_2R,
fRLeq_U_2R
)
Conclusions
1. Analytical solution obtained.
2. Functions for analysis of behavior of solutions are created and saved.