Octave:是否允许在函数定义中使用 for() 循环?

Octave: is it allowed to have a for() cycle in a function definition?

我有一个包含 for() 循环的函数 func() 定义。

然后我可以将 func() 传递给 lsode() 以作为 ODE 解析吗?

更新:代码示例。

int = [0; 0];
slp = [0; 1];
x = [1:10];
r = zeros(1,10);
for id = 1 : 2;
 r = r + int(id) + slp(id)*x;
end
plot(x,r);
function ydot = fnc(y, t, int, slp)
 ydot = zeros(1,10);
 for jd = 1 : 2;
  ydot = ydot + int(jd) + slp(jd)*t;
 end
end
p = lsode(@(y,t) fnc(y,t,int,slp), 1, x);

错误:lsode:状态和导数向量的大小不一致 错误:调用自: 错误:/path$/test_for_function.m 在第 15 行,第 3 列

该错误信息与ODE函数内部的计算无关。它告诉你 ydot 的形状与初始值向量建立的状态向量的形状不兼容。

首先,我无法在您的代码示例中识别初始值向量。您似乎为此构建了数组 r,但您传递了标量常量 1.

然后在ydot的构造中就可以像切换形状尺寸一样简单了。或者使用 ỳdot = zeros_like(y) 或类似的(如果可用)。

经过一些调试、修补和思考 lsode 的工作原理后,我发现了如何使我的代码按预期工作:

%Start code
int = [0; 0];
slp = [0; 1];
x = [1:10];
for id = 1 : 2;
 r = int(id) + slp(id)*x;
end   %A complicated way to draw a line
 figure(1); clf(1); 
 plot(x,r);
 hold on;
function ydot = fnc(y, t, int, slp)
 for jd = 1 : 2;
  ydot = [int(jd) + slp(jd)*t];
 end
end
p = lsode(@(y,t) fnc(y,t,int,slp), 1, x);
 plot(x, p, '-r');
%EOF

结果是:

理应如此。