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
结果是:
理应如此。
我有一个包含 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
结果是:
理应如此。