MATLAB中用于绘制球高度的if语句
我正在使用MATLAB计算弹丸运动时球的高度。这是我的密码:MATLAB中用于绘制球高度的if语句,matlab,Matlab,我正在使用MATLAB计算弹丸运动时球的高度。这是我的密码: v = 10; teta = 20; % angle of the projectile motion vx = v*cos(teta); % velocity in x axis vy = v*sin(teta); % velocity in y axis x = 0:10; y = zeros(length(x),1); for xx=1:length(x) % here I calcula
v = 10;
teta = 20; % angle of the projectile motion
vx = v*cos(teta); % velocity in x axis
vy = v*sin(teta); % velocity in y axis
x = 0:10;
y = zeros(length(x),1);
for xx=1:length(x)
% here I calculate the height of the ball in y axis
y(xx,:) = vy*(xx/vx)-(0.5*9.81*(xx./vx)^2);
% here I want to break the system when the height of the ball is
% zero (on the ground surface)
if y(xx,:) == 0
break
end
end
plot(x,y, '*')
问题是,当我绘制运动时,当高度为零时,它不会停止
但对于y轴的负值,它将继续
我的if语句中有什么错误?永远不要将浮点数或双倍数与整数进行比较。当你说如果yxx,:==0,只有当高度正好为零时,你才打破循环,这永远不会发生,只要看看存储在y中的值
如果要防止数据为负数,应尝试使用yxx:<0。请记住,如果使用这种方法,您应该始终删除添加到y的最后一个值,因为当该语句中断循环时,您已经存储了第一个负值。所以,只需加上yxx=0;在换行符之前。永远不要将浮点数或双倍数与整数进行比较。当你说如果yxx,:==0,只有当高度正好为零时,你才打破循环,这永远不会发生,只要看看存储在y中的值 如果要防止数据为负数,应尝试使用yxx:<0。请记住,如果使用这种方法,您应该始终删除添加到y的最后一个值,因为当该语句中断循环时,您已经存储了第一个负值。所以,只需加上yxx=0;在换行符之前。您完全可以避免for循环:
v=10;
theta=20; % angle of the projectile motion
vx=v*cos(theta); % velocity in x axis
vy=v*sin(theta); % velocity in y axis
x=0:0.1:10;
y=zeros(size(x));
y=vy.*(x./vx)-(0.5*9.81*(x./vx).^2); %% Calculate values for all x
x=x(y>=0); %% keep the x values where y>=0
y=y(y>=0); %% keep the y valuse where y>=0
plot(x,y,'*')
您完全可以避免for循环:
v=10;
theta=20; % angle of the projectile motion
vx=v*cos(theta); % velocity in x axis
vy=v*sin(theta); % velocity in y axis
x=0:0.1:10;
y=zeros(size(x));
y=vy.*(x./vx)-(0.5*9.81*(x./vx).^2); %% Calculate values for all x
x=x(y>=0); %% keep the x values where y>=0
y=y(y>=0); %% keep the y valuse where y>=0
plot(x,y,'*')
我要做的是使用恒定的时间增量,而不是使用恒定的x增量。这不仅更加直观,而且还为将来升级提供了更好的构建块。这种方法可以更容易地包含其他效果,如空气阻力、3D、反弹等。。。这是迈向更先进的方法的一块垫脚石,用矢量值运动方程的数值积分来进行这些计算;有关一些示例,请参见MATLAB中的ode45
下面是一个弹性球的示例:
v = 100; % initial speed
theta = 20; % initial angle (°) with X-axis
vx = v * cosd(theta); % initial velocity in x axis
vy = v * sind(theta); % initial velocity in y axis
T = 0 : 0.01 : 50; % times to sample
x = zeros(length(T),1);
y = zeros(length(T),1);
ay = -9.80665; % gravity
ax = 0; % ...wind perhaps
ex = 0.9; % elasticity in X-direction
ey = 0.5; % elasticity in Y-direction
for ii = 2:numel(T)
% Update time step
dt = T(ii) -T(ii-1);
% Update speed
vx = vx + ax*dt;
vy = vy + ay*dt;
% Update position
x(ii) = x(ii-1) + [vx ax/2] * dt.^(1:2)';
y(ii) = y(ii-1) + [vy ay/2] * dt.^(1:2)';
% Bounce the ball!
if y(ii) <= 0
y(ii) = 0;
vx = ex* vx;
vy = abs( ey*vy );
end
end
clf, hold on
plot(x,y)
我要做的是使用恒定的时间增量,而不是使用恒定的x增量。这不仅更加直观,而且还为将来升级提供了更好的构建块。这种方法可以更容易地包含其他效果,如空气阻力、3D、反弹等。。。这是迈向更先进的方法的一块垫脚石,用矢量值运动方程的数值积分来进行这些计算;有关一些示例,请参见MATLAB中的ode45
下面是一个弹性球的示例:
v = 100; % initial speed
theta = 20; % initial angle (°) with X-axis
vx = v * cosd(theta); % initial velocity in x axis
vy = v * sind(theta); % initial velocity in y axis
T = 0 : 0.01 : 50; % times to sample
x = zeros(length(T),1);
y = zeros(length(T),1);
ay = -9.80665; % gravity
ax = 0; % ...wind perhaps
ex = 0.9; % elasticity in X-direction
ey = 0.5; % elasticity in Y-direction
for ii = 2:numel(T)
% Update time step
dt = T(ii) -T(ii-1);
% Update speed
vx = vx + ax*dt;
vy = vy + ay*dt;
% Update position
x(ii) = x(ii-1) + [vx ax/2] * dt.^(1:2)';
y(ii) = y(ii-1) + [vy ay/2] * dt.^(1:2)';
% Bounce the ball!
if y(ii) <= 0
y(ii) = 0;
vx = ex* vx;
vy = abs( ey*vy );
end
end
clf, hold on
plot(x,y)
您可以在不中断for循环的情况下计算所有值,然后只绘制所需的值,即plotxy>=0,yy>=0,“*”;另一方面,当y沿第二维度的大小为1时,不必写yxx。实际上,MATLAB将每个变量视为size1*size2*..*sizeN*1*1*1*1*1*1。。。。。谢谢你。。我得到了图,它从2的高度开始,不是从0的高度开始吗?好吧,如果你想你的初始高度是0,你不想你的初始xx是0吗?是的,我有0,,,这里x=0:10;您可以在不中断for循环的情况下计算所有值,然后只绘制所需的值,即plotxy>=0,yy>=0,“*”;另一方面,当y沿第二维度的大小为1时,不必写yxx。实际上,MATLAB将每个变量视为size1*size2*..*sizeN*1*1*1*1*1*1。。。。。谢谢你。。我得到了图,它从2的高度开始,不是从0的高度开始吗?好吧,如果你想你的初始高度是0,你不想你的初始xx是0吗?是的,我有0,,,这里x=0:10;非常感谢你。。我得到了这个图,它从2的高度开始,不是从0的高度开始吗?我认为你使用的迭代器xx是错误的,就像它是x长度一样。尝试使用yxx,:=vy*xxx/vx-0.5*9.81*xxx./vx^2。以后你应该避免使用类似的名字,以免混淆。非常感谢。。我得到了这个图,它从2的高度开始,不是从0的高度开始吗?我认为你使用的迭代器xx是错误的,就像它是x长度一样。尝试使用yxx,:=vy*xxx/vx-0.5*9.81*xxx./vx^2。以后你应该避免使用类似的名字,以免混淆。非常感谢。。我得到了图,它显示了从0到7的x轴,我看不到曲线的末端,当曲线末端的棉铃高度应该为零时??高度为零时为什么不显示终点??我甚至改变了x向量的长度,但我得到了相同的结果,因为下一个点低于0。它的值是-0.0102。要得到点[x,0],你必须外推该点。如果你只想看到0以上的曲线,忘记任何x=xy>0的东西,在绘图命令后使用setgca,'ylim',[0,5]…哦,我亲爱的上帝。。。非常感谢你。。上帝保佑你,你真是个菜刀。。非常感谢:非常感谢。。我得到了图,它显示了x
轴从0到7,我看不到曲线的尽头时,铃的高度在曲线的尽头应该是零??高度为零时为什么不显示终点??我甚至改变了x向量的长度,但我得到了相同的结果,因为下一个点低于0。它的值是-0.0102。要得到点[x,0],你必须外推该点。如果你只想看到0以上的曲线,忘记任何x=xy>0的东西,在绘图命令后使用setgca,'ylim',[0,5]…哦,我亲爱的上帝。。。非常感谢你。。上帝保佑你,你真是个菜刀。。非常感谢: