m文件中的递归函数出错

时间:2014-06-26 19:54:49

标签: matlab

我正在学习数学生物学课程的第8章。教科书使用Maple,但包含此链接Computer course of Chapter 8 in Matlab。我被告知将以下内容放在一个m文件中:

% defining a recursive function in an m-file

function y = plot_traj(a)
RM = inline('a*x.*exp(-x)', 'a', 'x')
% Note that we are using an inline function. Sometimes it’s easier to do this.

% collecting list of x-coordinates
for i = 1:31,
X(i) = i - 1
end

% collecting list of y-coordinates
for i = 1:30,
Y(i+1)=RM(a,iter(i));
iter(i+1) = Y(i+1);
end

y = plot(X, Y, '*');

现在,保存您的m文件(作为绘图traj.m)并关闭它。在命令窗口中键入以下内容:

>> plot traj(0.8) 
>> plot traj(1.0) 
>> plot traj(5.0) 
>> plot traj(8.0) 
>> plot traj(13.0) 
>> plot traj(14.5) 
>> plot traj(20.0)

但是,当我在命令窗口中输入plot traj(0.8)时,我得到了这个:

>> plot_traj(0.8)
Undefined function or variable "iter".

Error in plot_traj (line 13)
Y(i)=RM(a,iter(i));

我没有看到第13行有什么问题,我确保我的代码正是本章的内容。到目前为止,我一直在使用这些代码。如果有人能提供一些帮助我会很感激。谢谢。

1 个答案:

答案 0 :(得分:1)

第13行的问题是尚未定义iter局部变量数组。因此,在第一次迭代中,代码尝试访问iter(1)并失败。我看了你提供的链接,他们也错过了。基于Matlab_Course.pdf(和图8.6)中的先前示例,iter数组应初始化为

iter(1) = 1.0;

只需在for循环之前添加此行,您就可以继续了。我也怀疑这行也应该添加(再次基于文档)

Y(1)=iter(1);

确保 iter Y 的长度相同。

请注意,为数组预先分配内存是一个好习惯,以避免在循环的每次迭代中内部调整矩阵/数组的大小(这会对性能产生负面影响)。对于这个循环

for i = 1:30,
    Y(i+1)=RM(a,iter(i));
    iter(i+1) = Y(i+1);
end 

您可以观察i遍历1到30,我们总是填充Y(i+1)iter(i+1)。因此,Yiter都是31x1向量。我们可以在输入for循环之前为每个分配内存

iter = zeros(31,1);
Y    = zeros(31,1);

iter(1) = 1;
Y(1)    = iter(1);

同样应该为X做同样的事情。