使用ODE45的Vertcat错误

时间:2014-04-25 16:49:59

标签: matlab debugging

我正在尝试使用ODE45以数字方式模拟系统。我似乎无法弄清楚为什么我收到以下错误:

使用vertcat时出错 连接的矩阵的尺寸不一致。

[t,x] = ode45(@NL_hw3c, [0,20], [1, 2, 3]);

function sys = NL_hw3c(t,x)
sys = [x(2)+ x(1)^2;
       x(3)+log10(x(2)^2 + 1);
       -3*x(1)-5*x(2)-3*x(3)+4*cos(t)-5*x(1)^2 -3*log10(x(2)^2 + 1) -6*x(1)*x(2) -6*x(1)^3 -(2*x(2)*(x(3)+ log10(x(2)^2 + 1)))/((x(2)^2 + 1)*log(10)) -2*x(1)*x(3) -2*x(1)*log10(x(2)^2 + 1) -2*x(2)^2 -8*x(1)^2*x(2) -6*x(1)^4];
end
用Google搜索,无法找到类似的解决方案。任何帮助,将不胜感激。 感谢

1 个答案:

答案 0 :(得分:1)

我必须将数组中的每个变量分开才能工作:

 function s = NL_hw3c(t,x)
    s1 = x(2)+ x(1)^2;
    s2 = x(3)+log10(x(2)^2 + 1);
    s3 = -3*x(1)-5*x(2)-3*x(3)+4*cos(t)-5*x(1)^2 -3*log10(x(2)^2 + 1) -6*x(1)*x(2) -6*x(1)^3 -(2*x(2)*(x(3)+ log10(x(2)^2 + 1)))/((x(2)^2 + 1)*log(10)) -2*x(1)*x(3) -2*x(1)*log10(x(2)^2 + 1) -2*x(2)^2 -8*x(1)^2*x(2) -6*x(1)^4;
    s = [s1;s2;s3];
 end

我得到了以下输出:

 t =

     0
0.0018
0.0037
0.0055
0.0074
0.0166
...
...
19.7647
19.8431
19.9216
20.0000

x =

 1.0000    2.0000    3.0000
 1.0055    2.0067    2.8493
 1.0111    2.0131    2.6987
 1.0167    2.0192    2.5481
 1.0224    2.0251    2.3975
 ...
 ...
 0.7926   -0.0187   -1.7587
 0.8380   -0.1567   -1.7624
 0.8781   -0.2928   -1.7534
 0.9129   -0.4253   -1.7299

您的函数不起作用的原因是因为在数组的最后一个值中,表达式的每个部分之间的空格被解释为进入单独的列。基本上,矩阵的前两行由1个元素组成,如果你完全按原样使用最后一个表达式,那么你将尝试在最后一行放置9个元素。我假设您想要一个3 x 1矩阵,因此最后一个元素会违反您想要创建的矩阵的大小,这就是为什么它会给您一个错误。

我假设您希望将最后一个值作为整个表达式,因此要将其作为单独的表达式放置,然后将其放入数组中。

为了使代码更具可读性,我在制作数组之前将所有条目都作为单独的变量放置。