我是MATLAB的新手。我有代码试图找到状态空间模型的时间历史。我想要使用ode45
同时解决四个一阶ODE。要求解的方程的本质如下:
x1_dot = x2
x2_dot = -[M] * [K] * x1 - [M] * [C] * x2 + constant*[M] * [P3] * x3 + constant*[M] * [P4] * x4
x3_dot = x2 - constant*x3
x4_dot = x2 - constant*x4
其中[M]
,[K]
,[C]
,[P3]
和[P4]
是3x3矩阵; x1
,x2
,x3
,x4
都是3x1向量; x1_dot
等表示时间导数(3x1向量)。我的初始条件仅适用于x1
。
我写的MATLAB代码如下。这段代码在我的整个程序中。我不是在调用单独的函数,因为我不知道如何通过函数将所有矩阵/向量传递给ode45
。我收到错误:“索引超出矩阵尺寸。”
tspan = 0:1:20;
initial = [0 0.03491 0];
f = @(t,x) [x(2);
-inv(M_Dbl_Bar_Matrix)*K_Dbl_Bar_Matrix*x(1) - inv(M_Dbl_Bar_Matrix)*C_Dbl_Bar_Matrix*x(2) + (0.5*rho*U^2)*inv(M_Dbl_Bar_Matrix)*P3_Matrix*x(3) + (0.5*rho*U^2)*inv(M_Dbl_Bar_Matrix)*P4_Matrix*x(4);
x(2) - Beta_1*x(3);
x(2) - Beta_2*x(4)];
[t,xp] = ode45(f,tspan,initial);
问题:
如何处理x(1)
为3x1向量的x(2)
,x(3)
,x(4)
和ode45
?
如何应用此方程组的初始条件?例如,我是否使用矢量格式,例如:initial = [0 0.03491 0; 0 0 0; 0 0 0; 0 0 0]
?
我是否正确使用/编写了函数(f
)和ode45
?
答案 0 :(得分:0)
1。)“3x1向量”是什么意思? x(i)
必须是单个变量才能使其正常工作,因此size(x)= 1x4。拥有x(i)=(x,y,z)
在ODE的背景下并没有任何意义。
2.。)变量向量x
的长度应为4,因此您的初始条件应该反映这一点。
initial = [0 0.03491 0 0];
对我来说很好。
3。)是的,我想是的。
您是否可以提供有关您尝试做的更多信息?
好的,我想我现在明白你要做什么。
例如,你有4个向量:x(x,y,z),x'(x,y,z),p(x,y,z),q(x,y,z)和一个大矩阵由3x3矩阵组成的4x4矩阵。所以我想
(原谅托管图片,因为我是一个stackoverflow noob我不允许直接发布html或图片,或多个链接)
数学1,2,3的参考:https://postimg.org/gallery/1qh2ywiqq/
来自链接的数学1
与
数学2来自链接
你的状态空间方程式。
所以要解决这个问题,你必须设置一个12维ode45问题,而不是现在的4维问题,因为每个向量都有3个组件。您需要做的是通过明确指定每个条目将4x4矩阵更改为12x12矩阵。你还必须给f = @(t,x)
一个1x12向量:
来自链接的数学3
然后将initial
设置为初始条件的1x12向量(对于矢量中的每个维度一个)。
使用我们现在拥有的矩阵形式和初始条件,我们可以使用此来源:https://nl.mathworks.com/help/symbolic/solve-a-system-of-differential-equations.html#buxuujb
告诉我们如何正确设置它。
我目前没有时间给你代码,但我希望我能正确理解你要做的事情,这将是有用的。
答案 1 :(得分:0)
只需将12×1系统集成,就好像它们是12个耦合的ODE一样。
其他一些观察结果:
inv()
- 这是缓慢且不准确的。请改用mldivide
(或mrdivide
)。此外,在f
的每个评估中,你重新计算它不少于 4 次,而它基本上是不变的!ode45
是一个可变步长积分器,这意味着它会根据每个步骤的误差估计值自动调整步长。请求输出有时偏离ode45
所选择的时间(称为“密集输出”)很容易,但它会花费额外的功能评估。通常这不是真正需要的,你可以使用效率更高的tspan = [0 20]
来取而代之。这一切都取决于您的具体需求。现在,我想出了这个:
% Time interval of interest
tspan = [0 20];
% Initial values
x1_0 = [0 0.03491 0];
x2_0 = [0 0 0];
x3_0 = [0 0 0];
x4_0 = [0 0 0];
x0 = [x1_0 x2_0 x3_0 x4_0].';
% Pre-compute a few constants
Fd = 0.5*rho*U^2;
P3f = Fd*M_Dbl_Bar_Matrix\P3_Matrix;
P4f = Fd*M_Dbl_Bar_Matrix\P4_Matrix;
P1f = -M_Dbl_Bar_Matrix\K_Dbl_Bar_Matrix;
P2f = -M_Dbl_Bar_Matrix\C_Dbl_Bar_Matrix;
% The derivative (12×1, but constructed as 4·3×1)
one = 1:3; three = 7:9; % well-named index vectors to
two = 4:6; four = 10:12; % make our lives a bit easier
f = @(t,x) [x(two)
P1f*x(one) + P2f*x(two) + P3f*x(three) + P4f*x(four)
x(two) - Beta_1*x(three)
x(two) - Beta_2*x(three)];
Now integrate this system
[t, xR] = ode45(f, tspan, x0);
% extract results in the same kind of blocks:
x1 = xR(:, one);
x2 = xR(:, two);
x3 = xR(:, three);
x4 = xR(:, four);
% ... process the results in whatever way you see fit