我有一个函数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列
答案 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
应该如此。