ode45具有矩阵初始条件

时间:2017-01-04 20:56:12

标签: matlab ode45

我是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矩阵; x1x2x3x4都是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);

问题:

  1. 如何处理x(1)为3x1向量的x(2)x(3)x(4)ode45

    < / LI>
  2. 如何应用此方程组的初始条件?例如,我是否使用矢量格式,例如:initial = [0 0.03491 0; 0 0 0; 0 0 0; 0 0 0]

  3. 我是否正确使用/编写了函数(f)和ode45

2 个答案:

答案 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一样。

其他一些观察结果:

  1. 尽可能避免使用inv() - 这是缓慢且不准确的。请改用mldivide(或mrdivide)。此外,在f的每个评估中,你重新计算它不少于 4 次,而它基本上是不变的!
  2. 您似乎每秒都想要输出。 ode45是一个可变步长积分器,这意味着它会根据每个步骤的误差估计值自动调整步长。请求输出有时偏离ode45所选择的时间(称为“密集输出”)很容易,但它会花费额外的功能评估。通常这不是真正需要的,你可以使用效率更高的tspan = [0 20]来取而代之。这一切都取决于您的具体需求。
  3. 现在,我想出了这个:

    % 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