- Author:
- Shelley Fong <s.fong@auckland.ac.nz>
- Date:
- 2022-03-07 16:27:20+13:00
- Desc:
- fix I_mem
- Permanent Source URI:
- https://models.fieldml.org/workspace/82e/rawfile/ad3c483cfbea78e59c7f0bd9315c92005f5faa42/matlab_parameter_fitting/y_gate_fitting.m
% based on Na_h gate by Pan.
clear;
% clc;
% close all;
%% Options
run_optimisation = true;
%% Set directories
current_dir = pwd;
main_dir = current_dir; %
data_dir = [main_dir '\data' filesep];
output_dir = [main_dir '\output' filesep];
storage_dir = [main_dir '\storage' filesep];
%% Steady-state gating parameters and time constants
V = transpose(-120:1:50);
V = transpose(-110:1:30);
% V = transpose(-100:1:10);
alpha_ydv = 15./(1+exp((V+60)/5));
beta_ydv = 100.*exp((V+25)/5)./(1+exp((V+25)/5));
tau_ydv = 1./(alpha_ydv + beta_ydv);
g_ss_ydv = alpha_ydv./(alpha_ydv + beta_ydv);
%% Fit bond graph parameters to model
% params: [kf, zf, kr, zr];
error_func_alpha = @(params) square_error(alpha_ydv - calc_alpha(params,V/1000));
error_func_beta = @(params) square_error(beta_ydv - calc_beta(params,V/1000));
error_func_gss = @(params) square_error(g_ss_ydv - p2gss(params,V));
error_func_tau = @(params) square_error(tau_ydv- p2tau(params,V));
error_func = @(params) error_func_alpha(params) + error_func_beta(params) + error_func_gss(params) + error_func_tau(params);
% error_func = @(params) error_func_gss(params) + error_func_tau(params);
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0; -10; 0; -10];
ub = [Inf; 10; Inf; 10];
options_unc = optimoptions('fminunc','MaxFunEvals',10000);
options_ps = optimoptions('particleswarm','UseParallel',false,'HybridFcn',@fmincon,'SwarmSize',1500);
if run_optimisation
[params_vec,fval,exitflag,output] = particleswarm(error_func,4,lb,ub,options_ps);
save([storage_dir 'to_ydv_parameters.mat'],'params_vec');
else
load([storage_dir 'to_ydv_parameters.mat']);
end
% [params_vec,fval,exitflag,output,grad,hessian] = fminunc(error_func,params_vec,options_unc);
%% Plot
% find things again over a wider V range
if true
V2 = transpose(-120:1:50);
else
V2 = V;
end
alpha_ydv = 15./(1+exp((V2+60)/5));
beta_ydv = 100.*exp((V2+25)/5)./(1+exp((V2+25)/5));
tau_ydv = 1./(alpha_ydv + beta_ydv);
g_ss_ydv = alpha_ydv./(alpha_ydv + beta_ydv);
g_ss_fit = p2gss(params_vec,V2);
h1 = figure;
plot(V2,g_ss_ydv,'k--','LineWidth',4);
hold on;
plot(V2,g_ss_fit,'k','LineWidth',4);
% legend('Luo and Rudy','Fitted');
xlabel('Voltage (mV)');
ylabel('h_{ss}');
set(gca,'FontSize',28);
xlim([-120 60]);
set(gca,'XTick',-120:30:60);
set(gca,'YTick',0:0.2:1);
xticklabels({-120,'',-60,'',0,'',60});
yticklabels({0,'','','','',1});
set(gca,'LineWidth',3);
grid on;
tau_fit = p2tau(params_vec,V2);
h2 = figure;
plot(V2,tau_ydv,'k--','LineWidth',4);
hold on;
plot(V2,tau_fit,'k','LineWidth',4);
% legend('Luo and Rudy','Fitted');
xlabel('Voltage (mV)');
ylabel('\tau_ydv (ms)');
set(gca,'FontSize',28);
xlim([-120 60]);
set(gca,'XTick',-120:30:60);
% set(gca,'YTick',0:0.2:1);
xticklabels({-120,'',-60,'',0,'',60});
% yticklabels({0,'','','','',1});
set(gca,'LineWidth',3);
set(gca,'xgrid','on');
% print_figure(h1,output_dir,'g_ss_ydv');
% print_figure(h2,output_dir,'tau_ydv');
alpha_fit = calc_alpha(params_vec,V2/1000);
beta_fit = calc_beta(params_vec,V2/1000);
figure,
subplot(1,2,1)
plot(V2,alpha_ydv,V2,alpha_fit);
legend('original','fit');
subplot(1,2,2)
plot(V2,beta_ydv,V2,beta_fit);
legend('original','fit');