我正在尝试使用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搜索,无法找到类似的解决方案。任何帮助,将不胜感激。
感谢
答案 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矩阵,因此最后一个元素会违反您想要创建的矩阵的大小,这就是为什么它会给您一个错误。
我假设您希望将最后一个值作为整个表达式,因此要将其作为单独的表达式放置,然后将其放入数组中。
为了使代码更具可读性,我在制作数组之前将所有条目都作为单独的变量放置。