matlab/javascript 中的过山车模拟
Rollercoaster simulation in matlab/javascript
我在使用 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
但这似乎不起作用。
我怎样才能让它适用于任意路径?
提前致谢!
你的循环中有一个非常简单的错误。实际上有两个错误。
您正在使用一个不存在的变量 j
索引 alpha
,并在循环中递增它,而不是仅仅使用 k
,在循环中自动递增。
这没有给出错误的原因是你的循环永远不会运行。因为 path_y
的大小不是单个数字(大小为 1 x 1000),所以 k=1:1:size(path_y)-1
尝试创建一个从 1 到 0 的循环,步长为正 1。因为这不是如果不可能,循环将被跳过。一种选择是在此处使用 length
,而不是 size
。
但最重要的错误是:当代码停止工作时,您没有逐行检查代码以确认代码的每一部分都按照您编写时的想法进行。如果您检查了 k=1:1:size(path_y)-1
输出的内容,您应该能够很快识别出这个问题。
顺便说一句,我认为你可以完全避免循环(如果你真的需要它与路径变量具有相同的大小,则在末尾附加一个零):
alpha = atan(diff(path_y)./diff(path_x));
我在使用 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
但这似乎不起作用。
我怎样才能让它适用于任意路径?
提前致谢!
你的循环中有一个非常简单的错误。实际上有两个错误。
您正在使用一个不存在的变量
j
索引alpha
,并在循环中递增它,而不是仅仅使用k
,在循环中自动递增。这没有给出错误的原因是你的循环永远不会运行。因为
path_y
的大小不是单个数字(大小为 1 x 1000),所以k=1:1:size(path_y)-1
尝试创建一个从 1 到 0 的循环,步长为正 1。因为这不是如果不可能,循环将被跳过。一种选择是在此处使用length
,而不是size
。
但最重要的错误是:当代码停止工作时,您没有逐行检查代码以确认代码的每一部分都按照您编写时的想法进行。如果您检查了 k=1:1:size(path_y)-1
输出的内容,您应该能够很快识别出这个问题。
顺便说一句,我认为你可以完全避免循环(如果你真的需要它与路径变量具有相同的大小,则在末尾附加一个零):
alpha = atan(diff(path_y)./diff(path_x));