% based on markov model of Pan's Na m channel % work in SECONDS not ms. 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:60); % unit mV % alpha_zdv = 10000*exp((V-40)/25)./(1+exp((V-40)/25)); % beta_zdv = 10000*exp(-(V+90)/25)./(1+exp(-(V+90)/25)); % % tau_zdv = 1./(alpha_zdv + beta_zdv); % g_ss_zdv = alpha_zdv./(alpha_zdv + beta_zdv); % b gate b_inf = 1{dimensionless}/(1{dimensionless}+exp(-(V+14{millivolt})/10.8{millivolt})); tau_b = 0.0037{second}+0.0061{second}/(1{dimensionless}+exp((V+25{millivolt})/4.5{millivolt})); %% Fit bond graph parameters to model % params: [kf, zf, kr, zr]; % Kf corresponds to k_zdv20: 1*alpha_zdv error_func_alpha = @(params) square_error(alpha_zdv - calc_alpha(params,V/1000)); % fit to alpha - k.exp(zFV/RT) : do lsqminerror. error_func_beta = @(params) square_error(beta_zdv - calc_beta(params,V/1000)); error_func_gss = @(params) square_error(g_ss_zdv - p2gss(params,V)); error_func_tau = @(params) square_error(tau_zdv- p2tau(params,V)); error_func = @(params) error_func_alpha(params) + error_func_beta(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); if run_optimisation [params_vec,fval,exitflag,output] = particleswarm(error_func,4,lb,ub,options_ps); save([storage_dir 'TCC_zdv_parameters.mat'],'params_vec'); else load([storage_dir 'TCC_zdv_parameters.mat']); end % [params_vec,fval,exitflag,output,grad,hessian] = fminunc(error_func,params_vec,options_unc); g_ss_fit = p2gss(params_vec,V); h1 = figure; plot(V,g_ss_zdv,'k--','LineWidth',4); hold on; plot(V,g_ss_fit,'k','LineWidth',4); xlabel('Voltage (mV)'); ylabel('m_{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,V); h2 = figure; plot(V,tau_zdv,'k--','LineWidth',4); hold on; plot(V,tau_fit,'k','LineWidth',4); % legend('Luo and Rudy','Fitted'); xlabel('Voltage (mV)'); ylabel('\tau_zdv (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'); alpha_fit = calc_alpha(params_vec,V/1000); beta_fit = calc_beta(params_vec,V/1000); figure, subplot(1,2,1) plot(V,alpha_zdv,V,alpha_fit); legend('original','fit'); subplot(1,2,2) plot(V,beta_zdv,V,beta_fit); legend('original','fit'); print_figure(h1,output_dir,'g_ss_zdv'); print_figure(h2,output_dir,'tau_zdv');