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