MATLAB 是否支持在数值上对单个变量进行双重积分?

Does MATLAB support double integration on single variable numerically?

我有一个长向量

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

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

有没有办法用数字找到最终位置?

我知道有一个 trapz function an I know that MATLAB supports 2D integration 并且我知道在 simulink 中集成是一个选项。但是,有什么方法可以进行二重积分:

final_position= integrate integrate acceleration dt^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;

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

使用梯形法则:

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).

另一种方法是将二阶微分方程转化为一阶微分方程。

你的等式是

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 在他们实现的求解器中也有很多优化。