【问题标题】:Rollercoaster simulation in matlab/javascriptmatlab/javascript中的过山车模拟
【发布时间】:2018-02-02 13:21:36
【问题描述】:

我在 matlab 中处理的项目遇到问题,然后我将使用 javascript 来实现。目的是在使用 javascript 之前使用 matlab 更好地理解物理学。目标是使用微分方程和欧拉近似在 matlab 中创建某种过山车模拟。然后按照路径为块(购物车)设置动画。

问题是我无法在任意路径(方程)上得到近似值,而且我不明白我做错了什么。

这就是我想要做的:

for t=1:h:tf
%acceleration

    ax(i) = (g*cos((-pi/4)))*sin(-pi/4)-((C*ro*A*vx(i)^2*sign(vx(i)))/(2*m))*sin(-pi/4);
    ay(i) = (g*cos((-pi/4)))*cos(-pi/4)+((C*ro*A*vy(i)^2*sign(vy(i)))/(2*m))*cos(-pi/4);

%speed
    vx(i+1) = vx(i)+h*ax(i);
    vy(i+1) = vy(i)+h*ay(i);

%position
    x(i+1) = x(i)+h*vx(i);
    y(i+1) = y(i)+h*vy(i);

    i = i+1; 
    speed = sqrt(vx(i)^2+vy(i)^2);
    plot(x(i),y(i),'or')
    pause(1/speed)

end

我遵循牛顿第二定律 (F=ma => a = F/m) 我现在使用的唯一负力分量是空气阻力。

这是当我使用硬编码路径 -> y=1-x 时,它工作得很好! 但是当我尝试使用任意路径时,例如。 1/x,角度一直在变化,我尝试过将每个角度放入角度向量:

%% initial values 
vx(1) = 0;
vy(1) = 0;
x(1) = 0;
y(1) = 6.7056;
%Track Geometry Constants
h_start = 6.7056;        
l_end = 32;              
b = .055;                
w = .7;                  
p = .3;     
%% Creating path
path_x = linspace(0, 23, 1000);
path_y = (exp(-b*path_x).*(cos(w*path_x - p)) + 2.2*(exp(-(b)*path_x)));
path_y = path_y*(h_start/max(path_y));
path_x = path_x*(l_end/max(path_x));
%%

alpha = zeros(size(path_y));
for k=1:1:size(path_y)-1
    alpha(j) = atan(path_y(k+1)-path_y(k))/(path_x(k+1)-path_x(k));
    j= j+1;
end

但这似乎不起作用。

我怎样才能使它适用于任意路径?

提前谢谢你!

【问题讨论】:

  • 当您查看在更复杂情况下计算的加速度和速度曲线(即值与时间)时,它们是否有意义?请定义什么是“_can't get the approximation working”、“它工作得很好”、“这似乎不起作用”。你如何判断什么是有效的,什么是无效的?请尝试制定一个明确的问题陈述
  • 通过在近似后绘制 x 和 y 位置,当使用角度的 alpha 向量时,值会变为无穷大。使用直线时,x 和 y 值的图沿直线绘制。因此我知道这些计算是有效的。
  • 如果您可以发布初始条件,那么我们可以运行它,让我们更好地了解问题所在。
  • 我会把它们放在帖子里而不是在这里!

标签: javascript matlab simulation physics


【解决方案1】:

您的循环中有一个非常简单的错误。实际上有两个错误。

  1. 您正在使用不存在的变量 j 索引 alpha,并在循环中递增它,而不是仅使用在循环中自动递增的 k

  2. 这没有给出错误的原因是你的循环永远不会运行。因为path_y 的大小不是单个数字(大小为 1 x 1000),k=1:1:size(path_y)-1 尝试创建一个以正 1 为步长从 1 到 0 的循环。由于这是不可能的,所以循环被跳过。一种选择是在这里使用length,而不是size

但最重要的错误是:您没有在代码停止工作时逐行检查代码,以确认代码的每个部分都在按照您编写时的想法进行。如果您检查了k=1:1:size(path_y)-1 输出的内容,您应该能够很快发现这个问题。

顺便说一句,我认为您可以完全避免循环(如果您确实需要它与路径变量具有相同的大小,请在末尾附加一个零): alpha = atan(diff(path_y)./diff(path_x));

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多