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

时间:2018-03-17 13:25:11

标签: function for-loop octave ode

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

然后我可以将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列

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

经过一些调试,修补和考虑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

结果是: enter image description here

应该如此。