Find initial and fine time values for motion
이전 댓글 표시
Neglecting air resistance I want to find the initial time and final time for when the height of the ball is greater than or equal to 6 and the velocity is equal to or less than 16. The ball is launched at a 40 degree angle with an initial velocity of 20m/s and gravity is defined as 9.81 m/s. I got the times for which the conditions are met (.841 to 1.78 seconds), is there a way just to see the first and final time?
clear;
g = 9.81;
v_0= 20;
theta = 40;
vx_0 = v_0*cosd(theta);
vy_0 = v_0*sind(theta);
x0 = 0;
y0 = 0;
T = roots ([-0.5*g vy_0 0]);
T = T(2,1);
t = [0:.01:T];
for t = [0:.001:T] vx(1) = vx_0; vy(1) = vy_0 -g*(t); y(1) = y0 + vy_0*(t) - (0.5)*g*(t)^2; v(1) = sqrt(vx.^2 + vy.^2); if y >= 6 & v<=16 ; vx(1) = vx_0; vy(1) = vy_0 -g*(1); y(1) = y0 + vy_0*(t) - (0.5)*g*(t)^2; v(1) = sqrt(vx.^2 + vy.^2); disp(t) else
t = t + 1;
end
end
답변 (2개)
Chad Greene
2015년 3월 31일
편집: Chad Greene
2015년 3월 31일
It looks like
t(find(v>=16,1,'first'))
should be the first time the ball is greater than or equal to 16.
A tip: instead of using sqrt(vx.^2 + vy.^2), you can use hypot(vx,vy), which is less cluttered and leaves less room for error.
댓글 수: 2
Ken Cheema
2015년 3월 31일
Chad Greene
2015년 3월 31일
Whoa, I just took a longer look at your code. There are a number of issues I'm going to try and clear up for you. May take a few minutes.
Chad Greene
2015년 3월 31일
편집: Chad Greene
2015년 3월 31일
Some major issues:
1. The first time t is declared, you then immediately overwrite it when you say for t = [0:.001:T]. Then you've got an outlandish t = t+1 in that for loop! Doh! Were you intending to continue to the next t?
2. Vectors never get populated in your loop. It just keeps overwriting the first value in vx every time it says vx(1), and then you keep overwriting vy(1) and so on.
Minor issues:
- Your calculations could be done most efficiently without any loops at all if you use the diff function.
- The diff function aside, there's really no reason to use loops for most of your variables. vx never changes, and v and y can be calculated at the end of the loop, after vy is populated.
I usually don't do folks' homework for them, but you showed real effort, and you already have the answers, so why the heck not. Run this:
% Set initial conditions:
v_0= 20;
theta = 40;
vx_0 = v_0*cosd(theta);
vy_0 = v_0*sind(theta);
x0 = 0;
y0 = 0;
% constants:
g = 9.81;
T = roots ([-0.5*g vy_0 0]);
T = T(2,1);
t = 0:.001:T;
% preallocate array to make computation faster:
vy = NaN(size(t));
% Set initial values in array:
vy(1) = vy_0 -g*(t(1));
for n = 2:length(t)
delta_t = t(n)-t(n-1);
vy(n) = vy(n-1) - g*delta_t;
end
y = y0 + vy_0*t - 0.5*g*t.^2;
v = hypot(vx_0,vy);
subplot(2,1,1)
plot(t,y,'b')
hold on
plot([t(1) t(end)],[6 6],'r')
box off
axis tight
xlabel('time (s)')
ylabel('height (m)')
subplot(2,1,2)
plot(t,vx_0*ones(size(t)),'b')
hold on
plot(t,vy,'r')
plot(t,v,'k','linewidth',3)
legend('v_x','v_y','v','location','southwest')
box off
axis tight
xlabel('time (s)')
ylabel('velocity (m/s)')
firsttime = t(find(y>=6 & v<=16,1,'first'))
lasttime = t(find(y>=6 & v<=16,1,'last'))
subplot(2,1,1)
plot([firsttime firsttime],[min(y) max(y)],'k')
text(firsttime,5,' the first time!')
plot([lasttime lasttime],[min(y) max(y)],'k')
text(lasttime,2,' the {\it last} time!')
allconditionsmet = y>=6 & v<=16;
plot(t(allconditionsmet),y(allconditionsmet),'mo')
댓글 수: 2
Ken Cheema
2015년 3월 31일
Chad Greene
2015년 3월 31일
There's a lot of new stuff there. Try to go through it line by line and understand what's going on. Let me know if you have questions--learning these concepts now will really pay off.
카테고리
도움말 센터 및 File Exchange에서 Mathematics에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!