在MatLab上使用ODE45时,输入带有多个小数位的初始X值和速率常数会导致错误消息

在MatLab上使用ODE45时,输入带有多个小数位的初始X值和速率常数会导致错误消息,matlab,ode45,Matlab,Ode45,我有一个函数文件: function dxdt=function3009(t,x) % Initialize model vector with zeroes, dxdt=zeros(5,1); % Parameters %% Rate values with many decimal places causing error: %k1= 1*10^-6; % k1*alac*lacI -> LacI-alac %k2 = 1*10^-13; % k3*lacI*go

我有一个函数文件:

function dxdt=function3009(t,x)
% Initialize model vector with zeroes,
dxdt=zeros(5,1);

% Parameters

%% Rate values with many decimal places causing error:
%k1= 1*10^-6;  %     k1*alac*lacI -> LacI-alac
%k2 = 1*10^-13; %     k3*lacI*gop -> LacI-g_op

%% Script runs fine with these instead
k1= 10;  %     k1*alac*lacI -> LacI-alac
k2 = 10; %     k2*lacI*gop -> LacI-g_op


% Differential Equations:
% d[E]/dt
dxdt(1)= - k1*x(1)*x(3) + (k1^-1)*x(2); 
% d[ER]/dt
dxdt(2)=  k1*x(1)*x(3) - (k1^-1)*x(2); 
% d[R]/dt
dxdt(3)=  - k1*x(1)*x(3) + (k1^-1)*x(2) - k2*x(3)*x(4) + (k2^-1) * x(5);
% d[O]/dt
dxdt(4)= - k2*x(3)*x(4) + (k2^-1) * x(5);
% d[OR]/dt  
dxdt(5)= k2*x(3)*x(4) - (k2^-1) * x(5);
%%%%%%%%%%%%%%%%%%%%%%%%%%%
和我的脚本文件:

% Settings
options = odeset('InitialStep',0.1,'MaxStep',0.1);
t_range= [0 10];

%% many decimal points, causes error:
%x_ini= [1*10^-4 0 2*10^-8 0 8.47*10^-12];

%% Runs fine without decimal places:
x_ini= [100 0 10 0 1];

% Simulation
[t,x]=ode45(@function3009,t_range,x_ini,options);

% Plot time series of all variables
subplot(1,3,1);
plot(t,x(:,4:5)); %plot gop and lac:gop 
xlabel('Time');
ylabel('Concentration');
title('gop and LacI:gop');
legend('gop', 'lacI:gop');

subplot(1,3,2);
plot(t,x(:,2:3)); %plot lac and lac:alac 
xlabel('Time');
ylabel('Concentration');
title('lacI and alac:LacI');
legend('alac:LacI','LacI');

subplot(1,3,3);
plot(t,x(:,1)); %plot alac
xlabel('Time');
ylabel('Concentration');
title('Alac');
当我运行ODE45时,与整数相比有许多小数位,我收到以下错误:

使用horzcat请求的5x212292600(7.9GB)阵列时出错,超出了最大阵列大小首选项。 创建大于此限制的数组可能需要很长时间,并导致MATLAB变得无响应。 有关详细信息,请参见阵列大小限制或首选项面板

我有5个deg,时间范围为10,步长为0.1(因此总共100个),所以不管输入值如何,总数组大小都应该是500?为什么使用多个小数位的输入值会增加数组大小


谢谢你的帮助/建议

当您切换到“有问题”的值时,ode看起来在数值上变得僵硬。我建议使用刚性解算器,例如
ode15s
。如果替换该行:

[t,x]=ode45(@function3009,t_range,x_ini,options);
[t,x]=ode15s(@function3009,t_range,x_ini,options);
用这句话:

[t,x]=ode45(@function3009,t_range,x_ini,options);
[t,x]=ode15s(@function3009,t_range,x_ini,options);
它收敛得非常快,并给出以下结果(我无法评论它们是否正确):


有关解算器的更多详细信息,请参阅文档中的。

当您切换到“有问题”的值时,ode看起来在数值上变得僵硬。我建议使用刚性解算器,例如
ode15s
。如果替换该行:

[t,x]=ode45(@function3009,t_range,x_ini,options);
[t,x]=ode15s(@function3009,t_range,x_ini,options);
用这句话:

[t,x]=ode45(@function3009,t_range,x_ini,options);
[t,x]=ode15s(@function3009,t_range,x_ini,options);
它收敛得非常快,并给出以下结果(我无法评论它们是否正确):

有关解算器的详细信息,请参见文档中的