Storing while loop results in an array and plotting

1 view (last 30 days)
Hello, I have this simple code simulating free fall. The while loop works fine in the first case but i need to plot the results. I tried to put the y and v values in arrays but the results i get are wrong. How do i fix that?
clear, clc, close all, format long
% Initial values and constants
g = 10;
y = 100;
v = 0;
t = 0;
h = 0.1;
fprintf('\n\tt (sec)\t\ty (m)\t\tv (m/sec)\n')
t (sec) y (m) v (m/sec)
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t,y,v)
0.00 100.00 0.00
while y >= 0
y = y + h*v;
v = v - h*g;
t = t + h;
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t,y,v)
end
0.10 100.00 -1.00 0.20 99.90 -2.00 0.30 99.70 -3.00 0.40 99.40 -4.00 0.50 99.00 -5.00 0.60 98.50 -6.00 0.70 97.90 -7.00 0.80 97.20 -8.00 0.90 96.40 -9.00 1.00 95.50 -10.00 1.10 94.50 -11.00 1.20 93.40 -12.00 1.30 92.20 -13.00 1.40 90.90 -14.00 1.50 89.50 -15.00 1.60 88.00 -16.00 1.70 86.40 -17.00 1.80 84.70 -18.00 1.90 82.90 -19.00 2.00 81.00 -20.00 2.10 79.00 -21.00 2.20 76.90 -22.00 2.30 74.70 -23.00 2.40 72.40 -24.00 2.50 70.00 -25.00 2.60 67.50 -26.00 2.70 64.90 -27.00 2.80 62.20 -28.00 2.90 59.40 -29.00 3.00 56.50 -30.00 3.10 53.50 -31.00 3.20 50.40 -32.00 3.30 47.20 -33.00 3.40 43.90 -34.00 3.50 40.50 -35.00 3.60 37.00 -36.00 3.70 33.40 -37.00 3.80 29.70 -38.00 3.90 25.90 -39.00 4.00 22.00 -40.00 4.10 18.00 -41.00 4.20 13.90 -42.00 4.30 9.70 -43.00 4.40 5.40 -44.00 4.50 1.00 -45.00 4.60 -3.50 -46.00
subplot(2,1,1), plot(t,y), grid on
subplot(2,1,2), plot(t,v), grid on
% Alternative way - putting values in array
% Initial values and constants
g = 10;
i = 1;
y(i) = 100;
v(i) = 0;
t(i) = 0;
h = 0.1;
fprintf('\n\tt (sec)\t\ty (m)\t\tv (m/sec)\n')
t (sec) y (m) v (m/sec)
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t,y,v)
0.00 100.00 0.00
while y >= 0
y(i+1) = y(i) + h*v(i);
v(i+1) = v(i) - h*g;
t(i+1) = t(i) + h;
i = i + 1;
end
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t,y,v)
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90 2.00 2.10 2.20 2.30 2.40 2.50 2.60 2.70 2.80 2.90 3.00 3.10 3.20 3.30 3.40 3.50 3.60 3.70 3.80 3.90 4.00 4.10 4.20 4.30 4.40 4.50 4.60 100.00 100.00 99.90 99.70 99.40 99.00 98.50 97.90 97.20 96.40 95.50 94.50 93.40 92.20 90.90 89.50 88.00 86.40 84.70 82.90 81.00 79.00 76.90 74.70 72.40 70.00 67.50 64.90 62.20 59.40 56.50 53.50 50.40 47.20 43.90 40.50 37.00 33.40 29.70 25.90 22.00 18.00 13.90 9.70 5.40 1.00 -3.50 0.00 -1.00 -2.00 -3.00 -4.00 -5.00 -6.00 -7.00 -8.00 -9.00 -10.00 -11.00 -12.00 -13.00 -14.00 -15.00 -16.00 -17.00 -18.00 -19.00 -20.00 -21.00 -22.00 -23.00 -24.00 -25.00 -26.00 -27.00 -28.00 -29.00 -30.00 -31.00 -32.00 -33.00 -34.00 -35.00 -36.00 -37.00 -38.00 -39.00 -40.00 -41.00 -42.00 -43.00 -44.00 -45.00 -46.00
subplot(2,1,1), plot(t,y), grid on
subplot(2,1,2), plot(t,v), grid on

Accepted Answer

Torsten
Torsten on 5 Jan 2025
Edited: Torsten on 5 Jan 2025
Why do you think the results you get from the second part of your code are wrong ?
g = 10;
y(1) = 100;
v(1) = 0;
t(1) = 0;
h = 0.1;
i = 1;
while y(i) >= 0
i = i + 1;
y(i) = y(i-1) + h*v(i-1);
v(i) = v(i-1) - h*g;
t(i) = t(i-1) + h;
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t(i),y(i),v(i))
end
0.10 100.00 -1.00 0.20 99.90 -2.00 0.30 99.70 -3.00 0.40 99.40 -4.00 0.50 99.00 -5.00 0.60 98.50 -6.00 0.70 97.90 -7.00 0.80 97.20 -8.00 0.90 96.40 -9.00 1.00 95.50 -10.00 1.10 94.50 -11.00 1.20 93.40 -12.00 1.30 92.20 -13.00 1.40 90.90 -14.00 1.50 89.50 -15.00 1.60 88.00 -16.00 1.70 86.40 -17.00 1.80 84.70 -18.00 1.90 82.90 -19.00 2.00 81.00 -20.00 2.10 79.00 -21.00 2.20 76.90 -22.00 2.30 74.70 -23.00 2.40 72.40 -24.00 2.50 70.00 -25.00 2.60 67.50 -26.00 2.70 64.90 -27.00 2.80 62.20 -28.00 2.90 59.40 -29.00 3.00 56.50 -30.00 3.10 53.50 -31.00 3.20 50.40 -32.00 3.30 47.20 -33.00 3.40 43.90 -34.00 3.50 40.50 -35.00 3.60 37.00 -36.00 3.70 33.40 -37.00 3.80 29.70 -38.00 3.90 25.90 -39.00 4.00 22.00 -40.00 4.10 18.00 -41.00 4.20 13.90 -42.00 4.30 9.70 -43.00 4.40 5.40 -44.00 4.50 1.00 -45.00 4.60 -3.50 -46.00
y = y(1:end-1);
v = v(1:end-1);
t = t(1:end-1);
subplot(2,1,1), plot(t,y), grid on
subplot(2,1,2), plot(t,v), grid on
  1 Comment
Torsten
Torsten on 5 Jan 2025
Edited: Torsten on 5 Jan 2025
The below code linearly interpolates the time point t0 when y becomes 0 between the last two values for y, namely (t(end-1),y(end-1)) and (t(end),y(end)) with y(end-1) > 0 and y(end) <= 0:
g = 10;
y(1) = 100;
v(1) = 0;
t(1) = 0;
h = 0.1;
i = 1;
while y(i) > 0
i = i + 1;
y(i) = y(i-1) + h*v(i-1);
v(i) = v(i-1) - h*g;
t(i) = t(i-1) + h;
fprintf('\n\t%.2f\t\t%.2f\t\t%.2f\n',t(i),y(i),v(i))
end
0.10 100.00 -1.00 0.20 99.90 -2.00 0.30 99.70 -3.00 0.40 99.40 -4.00 0.50 99.00 -5.00 0.60 98.50 -6.00 0.70 97.90 -7.00 0.80 97.20 -8.00 0.90 96.40 -9.00 1.00 95.50 -10.00 1.10 94.50 -11.00 1.20 93.40 -12.00 1.30 92.20 -13.00 1.40 90.90 -14.00 1.50 89.50 -15.00 1.60 88.00 -16.00 1.70 86.40 -17.00 1.80 84.70 -18.00 1.90 82.90 -19.00 2.00 81.00 -20.00 2.10 79.00 -21.00 2.20 76.90 -22.00 2.30 74.70 -23.00 2.40 72.40 -24.00 2.50 70.00 -25.00 2.60 67.50 -26.00 2.70 64.90 -27.00 2.80 62.20 -28.00 2.90 59.40 -29.00 3.00 56.50 -30.00 3.10 53.50 -31.00 3.20 50.40 -32.00 3.30 47.20 -33.00 3.40 43.90 -34.00 3.50 40.50 -35.00 3.60 37.00 -36.00 3.70 33.40 -37.00 3.80 29.70 -38.00 3.90 25.90 -39.00 4.00 22.00 -40.00 4.10 18.00 -41.00 4.20 13.90 -42.00 4.30 9.70 -43.00 4.40 5.40 -44.00 4.50 1.00 -45.00 4.60 -3.50 -46.00
t0 = (y(end)*t(end-1)-y(end-1)*t(end))/(y(end)-y(end-1));
t0 - t(end-1)
ans = 0.0222
y(end) = 0;
v(end) = v(end-1) - (t0-t(end-1))*g;
t(end) = t0;
subplot(2,1,1), plot(t,y), grid on
subplot(2,1,2), plot(t,v), grid on

Sign in to comment.

More Answers (0)

Products


Release

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!