所以我有三个与糖尿病有关的微分方程,我必须绘制三个中的2个,它们是一个子图中的G和I.出于某种原因,当我尝试运行它时,命令窗口打印出:“没有足够的输入参数”这是它的标准:
function dx = problem1(t,x)
P1 = 0.028735 ;
P2 = 0.028344 ;
P3 = 5.035 * 10^(-5) ;
Vi = 12 ;
n = 5/54 ;
D_t = 3*exp(-0.05*t) ;
U_t = 3 ;
Gb = 4.5;
Xb = 15;
Ib = 15;
G = x(1);
X = x(2);
I = x(3);
dx = zeros(3,1);
dx(1) = -P1*(G-Gb) - (X-Xb)*G + D_t ;
dx(2) = -P2*(X-Xb) + P3*(I-Ib) ;
dx(3) = -n*I + U_t/Vi ;
[T,X] = ode15s(@problem1,[0 60*24],[4.5 15 15]) ;
subplot(3,1,1);
plot(T,X(:,1)); % Plot G
subplot(3,1,2); % Second subplot
plot(T,X(:,2)); % Plot I
答案 0 :(得分:2)
运行该函数时抛出错误,MATLAB尝试评估D_t = 3*exp(-0.05*t);
。由于没有给出t
的值,MATLAB会抛出一个错误,指出必须指定最新的那个未使用的t
变量。
代码的主要问题在于函数的设计。即,ode15s
需要一个接受t
和x
并返回dx
的函数;但是,正如目前所述,对ode15s
的调用嵌入problem1
,其本身需要t
和x
。这是一个鸡蛋或鸡蛋问题。
除了此设计问题外,所有输入都是正确的,并且可以使用ODE定义的单独函数轻松纠正:
function problem1
[T,X] = ode15s(@ODE,[0 60*24],[4.5 15 15]) ;
subplot(3,1,1);
plot(T,X(:,1)); % Plot G
subplot(3,1,2); % Second subplot
plot(T,X(:,2)); % Plot I
end
function dx = ODE(t,x)
P1 = 0.028735 ;
P2 = 0.028344 ;
P3 = 5.035 * 10^(-5) ;
Vi = 12 ;
n = 5/54 ;
D_t = 3*exp(-0.05*t) ;
U_t = 3 ;
Gb = 4.5;
Xb = 15;
Ib = 15;
G = x(1);
X = x(2);
I = x(3);
dx = zeros(3,1);
dx(1) = -P1*(G-Gb) - (X-Xb)*G + D_t ;
dx(2) = -P2*(X-Xb) + P3*(I-Ib) ;
dx(3) = -n*I + U_t/Vi ;
end
注意:
function problem1
是function [] = problem1()
的简写。我自己更喜欢后一种形式,但我是少数。ode15s
@ODE
的函数句柄是@(t,x) ODE(t,x)
的简写。我自己更喜欢后一种形式,但只要你不是parametrizing functions,它就不会更低或更有效。problem1
函数访问模型常量的权限,但我在这里选择了一个单独的函数。