EKM 31
Derivation of the thermodynamic equilibrium relationships for a ligand binding to two different receptors
U__U model
images from /Users/kovrigin/Documents/Workspace/Data/Data.XVIII/EKM31.CON58.Ion_Titrations/1.MuPad_derivations/U__U_model.pdf
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
Here I will derive equations for equilibrium between two different receptors competing for the same ligand. Specific case: divalent ion binding to remote site in Ras and, at the same time, to free GNP or EDTA in solution.
clean up workspace
reset()
Set path to save results into:
ProjectName:="U__U";
CurrentPath:="/Users/kovrigin/Documents/Workspace/Data/Data.XVIII/EKM31.CON58.Ion_Titrations/1.MuPad_derivations/";
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_1
K_A_1 ;
assumeAlso(K_A_1 > 0):
assumeAlso(K_A_1 , R_)
K_A_2
K_A_2 ;
assumeAlso(K_A_2 > 0):
assumeAlso(K_A_2 , R_):
Total concentrations
Rtot - total concentration of the receptor
Rtot;
assumeAlso(Rtot>0):
assumeAlso(Rtot,R_):
Ltot - total concentration of the first ligand
Ltot;
assumeAlso(Ltot>0):
assumeAlso(Ltot,R_):
Ptot - total concentration of the second receptor
Ptot;
assumeAlso(Ptot>0):
assumeAlso(Ptot,R_):
Equilibrium concentrations
Req - equilibrium concentration of the first receptor
Req;
assumeAlso(Req>0):
assumeAlso(Req<Rtot):
assumeAlso(Req,R_):
Peq - equilibrium concentration of the second receptor
Peq;
assumeAlso(Peq>0):
assumeAlso(Peq<Ptot):
assumeAlso(Peq,R_):
Leq - equilibrium concentration of a free ligand
Leq;
assumeAlso(Leq>0):
assumeAlso(Leq<Ltot):
assumeAlso(Leq,R_):
RLeq - equilibrium concentration of the first receptor-ligand complex
RLeq;
assumeAlso(RLeq>0):
assumeAlso(RLeq<Rtot):
assumeAlso(RLeq,R_):
PLeq - equilibrium concentration of the second receptor-ligand complex
PLeq;
assumeAlso(PLeq>0):
assumeAlso(PLeq<Ptot):
assumeAlso(PLeq,R_):
Check what we defined
anames(Properties,User);
2. Basic equilibrium equations
Mass conservation equations
eq2_1:= Rtot = Req + RLeq;
eq2_2:= Ptot = Peq + PLeq;
eq2_3:= Ltot = Leq + PLeq + RLeq;
Equilibrium constants
eq2_4:= K_A_1 = RLeq / (Req*Leq);
eq2_5:= K_A_2 = PLeq / (Peq*Leq)
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).
First, express RLeq and PLeq from mass conservation laws
eq2_1;eq2_2; eq2_3
RLeq=f(...)
solve(eq2_1,RLeq);
%[1];
eq3_1a:= RLeq = %
PLeq=f(...)
solve(eq2_2,PLeq);
%[1];
eq3_1b:= PLeq = %
Substitute these results into
-> Ltot=f(...)
eq3_1c:= eq2_3 | eq3_1a | eq3_1b
-> K_A_1=f(...)
eq2_4 ;
eq3_3:= % | eq3_1a
-> K_A_2=f(...)
eq2_5;
eq3_4:= % | eq3_1b
Express Peq and Req from the last equations
Req=f(...)
eq3_3;
solve(%,Req);
eq3_5:= Req = %[1];
Peq=f(...)
eq3_4;
solve(%,Peq);
eq3_6:= Peq = %[1];
Substitute into mass conservation law for L
Ltot=f(...)
eq3_1c;
% | eq3_5 | eq3_6;
eq3_7:= %:
Solve it for Leq
solutions3_7:=solve(eq3_7, Leq)
Insoluble.
Express Rtot for numeric solution
solve(eq3_7, Rtot):
eq3_8:= Rtot = %[1][1];
4. Prepare equations for a numeric solution
Summary of final equations
ProjectName
Reassign names for storage
Rtot=f([L],...)
Rtot_U_U:=eq3_8
[R]=f([L],...)
Req_U_U:=eq3_5
[P]=f([L],...)
Peq_U_U:=eq3_6
[RL]=f([L],...)
RLeq_U_U:=eq3_1a
[PL]=f([L],...)
PLeq_U_U:=eq3_1b
Prepare functions for numeric solution and evaluation
A function for numeric solving for [L].
fRtot_U_U:=(Ptot, Ltot, Leq, K_A_1, K_A_2)--> eq3_8[2]
Assume some constant values for testing
Total_P:=1e-3:
Total_L:=10e-3:
Eq_L:=9e-3:
Ka1:=1e3:
Ka2:=2e4:
Test fRtot:
Total_R:=fRtot_U_U(Total_P, Total_L, Eq_L, Ka1, Ka2)
=> equation works OK
A procedure for numeric solving of R(tot)=f([L],...) thus creating a function [L]=f(Rtot,...)
WARNING: Make sure the Leq search starts with a non-zero value!
pnLeq_U_U:= proc(Total_R, Total_P, Total_L, Ka1, Ka2)
/* Parameter names should be different from
variable names used in the equation!!!
If you see an error message:
"Error: Illegal operand [_index];
during evaluation of 'your function name'"
it means fsolve returned FAIL and you need to check
values of all parameters passed to the function fRtot
*/
local result;
begin
// print(Total_R, Total_P, Total_L, Ka1, Ka2);
// numeric solving equation for Leq in a restricted range.
// WARNING: make sure the range starts with a non-zero number!!!!
// Also: variable to solve has to be called 'x' !!!
result:=numeric::fsolve(
Total_R-fRtot_U_U(Total_P, Total_L, x, Ka1, Ka2),
x=10e-32..Total_L);
// print(result);
// extract answer from equation
result[1][2]
end_proc;
Test its operation
pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
=> OK
Define procedures to compute equilibrium concentrations of all species
[R]
Req_U_U;
pnReq_U_U:=proc(Total_R, Total_P, Total_L, Ka1, Ka2)
// Parameter names should be different from
// variable names used in the equation!!!
local L;
begin
L:=pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// Equation for [R]
Req_U_U[2] | Rtot=Total_R | Leq=L | K_A_1=Ka1;
end_proc
test
pnReq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// test for not having some parameters 'hard-coded' by unwanted substitution.
pnReq_U_U(1, 1, 1, 1, 1);
=> OK
[P]
Peq_U_U;
pnPeq_U_U:=proc(Total_R, Total_P, Total_L, Ka1, Ka2)
// Parameter names should be different from
// variable names used in the equation!!!
local L;
begin
L:=pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// Equation for [P]
Peq_U_U[2] | Ptot=Total_P | Leq=L | K_A_2=Ka2;
end_proc
test
pnPeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// test for not having some parameters 'hard-coded' by unwanted substitution.
pnPeq_U_U(2, 2, 2, 2, 2);
[PL]
PLeq_U_U;
pnPLeq_U_U:=proc(Total_R, Total_P, Total_L, Ka1, Ka2)
// Parameter names should be different from
// variable names used in the equation!!!
local L;
begin
L:=pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
P:=pnPeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// Equation for [P]
PLeq_U_U[2] | Ptot=Total_P | Peq=P;
end_proc
test
pnPLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// test for not having some parameters 'hard-coded' by unwanted substitution.
pnPeq_U_U(2, 2, 2, 2, 2);
[RL]
RLeq_U_U;
pnRLeq_U_U:=proc(Total_R, Total_P, Total_L, Ka1, Ka2)
// Parameter names should be different from
// variable names used in the equation!!!
local L;
begin
L:=pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
R:=pnReq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// Equation for [P]
RLeq_U_U[2] | Rtot=Total_R | Req=R;
end_proc
test
pnRLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2);
// test for not having some parameters 'hard-coded' by unwanted substitution.
pnReq_U_U(2, 2, 2, 2, 2);
Final test of all procedures (use mass conservation laws)
Substitute into mass conservation law equations and observe equalities
eq2_1;
eq2_1 | Rtot=Total_R
| RLeq=pnRLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
| Req=pnReq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
=>OK
eq2_2;
eq2_2 | Ptot=Total_P
| PLeq=pnPLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
| Peq=pnPeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
=>OK
eq2_3;
eq2_3 | Ltot=Total_L
| PLeq=pnPLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
| RLeq=pnRLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
| Leq=pnLeq_U_U(Total_R, Total_P, Total_L, Ka1, Ka2)
=>OK
(you can retrieve them later by executing: fread(filename,Quiet))
ProjectName
filename:=CurrentPath.ProjectName.".mb";
write(filename,
// Equations
Rtot_U_U,
Req_U_U,
Peq_U_U,
RLeq_U_U,
PLeq_U_U,
// Function for numeric solving
fRtot_U_U,
// Final procedures
pnLeq_U_U,
pnReq_U_U,
pnPeq_U_U,
pnRLeq_U_U,
pnPLeq_U_U)
Conclusions
1. This system is analytically insoluble.
2. I derived numeric solutions and saved them.