我正在学习数学生物学课程的第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行有什么问题,我确保我的代码正是本章的内容。到目前为止,我一直在使用这些代码。如果有人能提供一些帮助我会很感激。谢谢。
答案 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)
。因此,Y
和iter
都是31x1向量。我们可以在输入for
循环之前为每个分配内存
iter = zeros(31,1);
Y = zeros(31,1);
iter(1) = 1;
Y(1) = iter(1);
同样应该为X
做同样的事情。