Operands to the logical AND (&&) and OR (||) operators must be convertible to logical scalar values. Use the ANY or ALL functions to reduce operands to logical scalar values.
8 views (last 30 days)
Show older comments
Operands to the logical AND (&&) and OR (||) operators must be convertible to logical scalar values. Use the ANY or ALL functions to
reduce operands to logical scalar values.
Error in Phase_1LIGAND_INTERACTION>calculate_kf (line 75)
elseif t >= t_start && t < t_end
Error in Phase_1LIGAND_INTERACTION>@(t)calculate_kf(t,t_start,t_end,Kf1Max,Kf1Min,Kf1Tau_on,Kf1Tau_off) (line 23)
kf_1 = @(t) calculate_kf(t, t_start, t_end, Kf1Max, Kf1Min, Kf1Tau_on, Kf1Tau_off );
Error in Phase_1LIGAND_INTERACTION (line 61)
plot(t, kf_1(t), '-', 'LineWidth', 2);
get this error when during running code is given below
Phase_1LIGAND_INTERACTION()
function Phase_1LIGAND_INTERACTION()
% Parameters
timespan = 0:0.01:100; % Time vector
Receptor_concentration = 100; % Concentration of Receptor
% Initial conditions
C_LigandReceptor_0 = 0; % Initial concentration of complex of ligand and receptor
% Time-dependent forward reaction rate constants (anonymous functions)
t_start = 5; % Start time of receptor pulse
t_end = 100; % Duration of receptor pulse
Kf1Max = 30;
Kf1Min = 1;
Kf1Tau_on = -1;
Kf1Tau_off = -0.5;
% Time-dependent backward reaction rate constants (anonymous functions)
Kb1Max = 20;
Kb1Min = 10;
Kb1Tau_on = -0.01;
Kb1Tau_off = -0.01;
kf_1 = @(t) calculate_kf(t, t_start, t_end, Kf1Max, Kf1Min, Kf1Tau_on, Kf1Tau_off );
kb_1 = @(t) calculate_kb(t, t_start, t_end, Kb1Max, Kb1Min, Kb1Tau_on, Kb1Tau_off );
% Solving the ODE system
[t, y] = ode45(@(t, y) ode_LR(t, y, kf_1, kb_1), timespan, [Receptor_concentration; C_LigandReceptor_0]);
% Extract the concentrations
receptor_concentration = y(:, 1);
ligand_Receptor_concentration = y(:, 2); % Now this represents the ligand-receptor complex concentration
% Calculate kf and kb values at each time point
kf_values = zeros(size(t));
kb_values = zeros(size(t));
kf_Tau_on_values = zeros(size(t));
kf_Tau_off_values = zeros(size(t));
kb_Tau_on_values = zeros(size(t));
kb_Tau_off_values = zeros(size(t));
for i = 1:length(t)
kf_values(i) = kf_1(t(i));
kb_values(i) = kb_1(t(i));
kf_Tau_on_values(i) = Kf1Tau_on;
kf_Tau_off_values(i) = Kf1Tau_off;
kb_Tau_on_values(i) = Kb1Tau_on;
kb_Tau_off_values(i) = Kb1Tau_off;
end
% Create a table for the data
data_table = table(t, kf_values, kb_values, kf_Tau_on_values,kf_Tau_off_values, kb_Tau_on_values,kb_Tau_off_values, timespan', ligand_Receptor_concentration, receptor_concentration, ...
'VariableNames', {'Time', 'kf', 'kb', 'kf_Tau_on', 'kf_Tau_off', 'kb_Tau_on','kb_Tau_off', 'TimeSpan', 'Ligand_Receptor_Concentration', 'Receptor_Concentration'});
% Write the data table to a CSV file
csv_filename = 'interaction_data.csv';
writetable(data_table, csv_filename);
% Plotting the results
figure;
plot(t, receptor_concentration, '-o', 'LineWidth', 2);
hold on;
plot(t, kf_1(t), '-', 'LineWidth', 2);
hold on;
plot(t, kb_1(t), 'o:', 'LineWidth', 3);
hold on;
plot(t, ligand_Receptor_concentration, '-k', 'LineWidth', 3);
hold on;
legend('Receptor', 'kf', 'kb' ,'Activated Receptor (Complex)');
end
function kf_1 = calculate_kf(t, t_start, t_end, Kf1Max, Kf1Min, Kf1Tau_on, Kf1Tau_off)
% Initial phase of the curve having a min value
if t < t_start
kf_1 = Kf1Min;
% Increasing phase from Min to Max
elseif t >= t_start && t < t_end
kf_1 = Kf1Max - (Kf1Max - Kf1Min) * exp(Kf1Tau_on * (t - t_start));
else % Decreasing phase from Max to Min
kf_end = Kf1Max - (Kf1Max - Kf1Min) * exp(Kf1Tau_on * (t_end - t_start));
kf_1 = Kf1Min + (kf_end - Kf1Min) * exp(Kf1Tau_off * (t - t_end));
end
end
function kb_1 = calculate_kb(t, t_start, t_end, Kb1Max, Kb1Min, Kb1Tau_on, Kb1Tau_off)
% Initial phase of the curve having a min value
if t < t_start
kb_1 = Kb1Min;
% Increasing phase from Min to Max
elseif t >= t_start && t < t_end
kb_1 = Kb1Max - (Kb1Max - Kb1Min) * exp(Kb1Tau_on * (t - t_start));
else % Decreasing phase from Max to Min
kb_end = Kb1Max - (Kb1Max - Kb1Min) * exp(Kb1Tau_on * (t_end - t_start));
kb_1 = Kb1Min + (kb_end - Kb1Min) * exp(Kb1Tau_off * (t - t_end));
end
end
function dydt = ode_LR(t, y, kf_1, kb_1)
% Unpack the concentrations
Receptor_concentration = y(1);
C_LigandReceptor = y(2);
% Define the ODE system
dReceptor_dt = -kf_1(t) * Receptor_concentration + kb_1(t) * C_LigandReceptor;
d_CLigandReceptor_dt = kf_1(t) * Receptor_concentration - kb_1(t) * C_LigandReceptor;
% Pack the derivatives into a column vector
dydt = [dReceptor_dt; d_CLigandReceptor_dt];
end
0 Comments
Answers (2)
Dyuman Joshi
on 17 Oct 2023
Double ampersand (&&) are only applicable when the output of each expression used for comparison is a scalar - Short-Circuit AND, &&.
However, you are comparing a vector to a scalar with an operation whose output is vector. Thus, you need to use single ampersand (&) symbol - and, & .
0 Comments
Walter Roberson
on 17 Oct 2023
[t, y] = ode45(@(t, y) ode_LR(t, y, kf_1, kb_1), timespan, [Receptor_concentration; C_LigandReceptor_0]);
The output t will be a vector.
plot(t, kf_1(t), '-', 'LineWidth', 2);
You are passing the vector to function kf_1
kf_1 = @(t) calculate_kf(t, t_start, t_end, Kf1Max, Kf1Min, Kf1Tau_on, Kf1Tau_off );
which passes it to function calculate_kf
elseif t >= t_start && t < t_end
which assumes that it is operating on scalar t.
You should vectorize your code using logical indexing https://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html -- or you should use arrayfun() in kf_1 to ensure that you only pass a single t at a time to calculate_kf
0 Comments
See Also
Categories
Find more on Characters and Strings in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!