我在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
但这似乎不起作用。
如何让这项工作适用于任意路径?
提前谢谢!
答案 0 :(得分:0)
循环中有一个非常简单的错误。实际上有两个错误。
您使用变量alpha
索引j
,该变量不存在并在循环中递增,而不是仅使用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));