MATLAB中用于绘制球高度的if语句

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

我正在使用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 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]…哦,我亲爱的上帝。。。非常感谢你。。上帝保佑你,你真是个菜刀。。非常感谢: