matlab:如何根据存储在数组中的数据来求解耦合微分方程

时间:2016-06-19 16:21:15

标签: arrays matlab differential-equations

我想在matlab中求解两个常微分方程组。 ODE的参数取决于存储在两个阵列F和T中的测量数据。 当我运行程序时,我总是得到如下所示的错误。我确信它与数组有关,因为当我使用单个数字表示F和T(例如F = 60; T = 30;)时,程序工作正常。

Subscript indices must either be real positive integers or logicals.

Error in dynamics (line 46)
ddyn(1) = k1*F(t) + v_b(t) - k_1*dyn(1) - v_a(t);

Error in ode23 (line 256)
f(:,2) = feval(odeFcn,t+h*A(1),y+f*hB(:,1),odeArgs{:});

Error in main (line 33)
[t,sol] = ode23(@dynamics , (1:1:3000),[0 0]);

以下是我用于main函数和ODE系统的代码:

主要功能:

[t,sol] = ode45(@dynamics , (1:1:3000),[0 0]);

ODE系统:

function [ddyn] = dynamics(t,dyn)

% constant numbers
k1 = 10^-2; k_1 = 8* 10^-3; k2 = 10^-2; k_2 = 4*10^-3; 
V_max_a = 1.6; V_max_b = 3.5;    
K_M_a = 1.5*10^-3; K_M_b = 2*10^-3;       
K_a_F = 9.4*10^5; K_a_T = 3.9*10; K_b_F = 1.3*10^4; K_b_T = 1.2*10^-10;
r_a_F = 4.3*10^7; r_a_T = 4.2*10^9; r_b_F = 6.9*10^-7; r_b_T = 6.2*10^-9;    

%arrays with data e.g. 
F = 1:3000;
T = 1:3000;

% programm works if I use numbers, e.g: 
%F = 60; T = 30; 


ddyn = zeros(2,1);

R_a_F = (K_a_F + r_a_F* F)/(K_a_F + r_a_F);   
R_a_T = (K_a_T + r_a_T* T)/(K_a_T + r_a_T);
R_b_F = (K_b_F + r_b_F* F)/(K_b_F + r_b_F);
R_b_T = (K_b_T + r_b_T* T)/(K_b_T + r_b_T);

 v_a = (V_max_a*dyn(1))/(K_M_a + dyn(1))*R_a_F .*R_a_T;
 v_b = (V_max_b*dyn(2))/(K_M_b + dyn(2))*R_b_F .*R_b_T;



ddyn(1) = k1*F(t) + v_b(t) - k_1*dyn(1) - v_a(t);
ddyn(2) = k2*T(t) + v_a(t) - k_2*dyn(2) - v_b(t);

1 个答案:

答案 0 :(得分:1)

Matlab ODE suite中的所有功能,包括ode45,都假定t 是连续的,并使用动态时间步长来实现某个功能准确度。 1 因此,您不能假设t是一个整数,并且永远不应该像使用F(t)那样用作索引。引用the documentation

  

如果tspan包含两个以上的元素[t0,t1,t2,...,tf],则解算器返回在给定点评估的解。这不会影响求解程序用于从tspan(1)遍历到tspan(end)的内部步骤。因此,求解器不一定精确地步进tspan中指定的每个点。

因此,假设FT是及时的连续函数,我建议制作一个能够及时执行插值的函数,而不是通过interp1进行插值,并通过通过parametrization对ODE功能起作用。例如:

tspan = 1:3000;
Ffun  = @(t) interp1(tspan,F,t); % Default is linear
[t,sol] = ode45(@(t,dyn) dynamics(t,dyn,Ffun) , tspan , [0 0]);

这只是一个例子,但希望能够提供服务。

1 特别是,ode45使用Dormand-Prince (4,5) Runkge-Kutta对进行时间积分;简而言之,该函数比较四阶和五阶解决方案,以确定当前时间步长的结果是否足够好或是否应该减少。