【问题标题】:Does MATLAB support double integration on single variable numerically?MATLAB 是否支持在数值上对单个变量进行双重积分?
【发布时间】:2015-07-16 03:11:57
【问题描述】:

我有一个长向量

acceleration=[6.45, 6.50, 6.52, 6.32, .... , 4.75]

已经从 simulink 获得(再次运行 simulink 模型需要很长时间)。并假设步长是恒定的dt=0.1

有什么办法可以通过数字找到最终位置吗?

我知道有一个 trapz 函数,我知道 MATLAB 支持 2D integration 并且我知道在 simulink 中集成是一种选择。但是,有没有办法采取双重积分:

final_position= integrate integrate acceleration dt^2

数值上,精度不比梯形法差?

我更喜欢避免基于循环的解决方案。

【问题讨论】:

    标签: matlab numerical-methods integral


    【解决方案1】:

    使用梯形法则:

    vinit = 0;                                    % initial velocity
    pinit = 0;                                    % initial position
    
    velocity = zeros(size(acceleration)) + vinit; % velocity vector
    position = zeros(size(acceleration)) + pinit; % position vector
    
    velocity(2:end) = velocity(2:end) + 0.5 * dt * cumsum(acceleration(2:end)+acceleration(1:end-1));
    position(2:end) = position(2:end) + 0.5 * dt * cumsum(    velocity(2:end)+    velocity(1:end-1));
    

    我使用cumsum()(累积和)来计算每个点的积分,而不仅仅是总和;这意味着可以再次积分速度以获得位置。最终的位置显然是position(end)

    【讨论】:

    • 只是想指出 MATLAB 中不存在就地运算符。我冒昧地编辑了你的帖子。但是,它们确实存在于 Octave 中,我怀疑您在 Octave 中开发了上述代码,然后将其放在这里。在开始回答 MATLAB / Octave 相关问题之前,请注意标签。祝你好运!
    【解决方案2】:

    我不知道有一个内置函数可以满足您的需求。我的建议是建立你自己的。函数trapz 沿整个域取积分,因此给你一个值。由于您要获取第二个积分,因此您首先需要生成一个与第一个积分相对应的值向量。这是通过整合原始向量越来越大的步长来实现的。

    acceleration = [6.45, 6.50, 6.52, 6.32, .... , 4.75];
    velocity = zeros(size(acceleration));
    for i = 1:length(acceleration),
        velocity(i) = trapz(acceleration(1:i))*dt;
    end
    p = trapz(velocity)*dt;
    

    我知道这使用了循环,但也许它可以帮助您入门。祝你好运。

    【讨论】:

      【解决方案3】:

      另一种方法是将您的二阶微分方程转换为一阶微分方程。

      你的方程式是

      X''(t) = a(t);
      X(0) = x_0;
      X'(0) = x_p_0;
      

      现在如果你定义u1(t) = X(t); u2(t) = X'(t),你会得到

      U'(t) = A*U(t) + a(t)
      

      在哪里

      U(t) = [u1(t);u2(t)]
      A = [0 1
           0 0]
      

      然后你可以使用任何求解器(比如 ode45)来求解这个 U(t) 向量。矢量的第二个分量是位置。它的误差范围比类似 trapz 的函数要小得多。 matlab 在他们实现的求解器中也有很多优化。

      【讨论】:

        猜你喜欢
        • 2015-06-03
        • 2011-02-21
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 2019-03-28
        • 2014-08-12
        • 1970-01-01
        相关资源
        最近更新 更多