For loop not working - How to properly loop inconsistent iterations with matrices?

Good day,
I am trying to loop and plot the results, but it is not working. The first iteration I made it manual because it is more of an 'initialization', and the code is not consistent as the 2,3rd, etc. iteration. When I run everything manually (no loop), it works, but when I start playing with the for loop, it gives me the following first error, which I cannot get rid of or do not know how:
In an assignment A(:) = B, the number of elements in A and B must be the same.
Error in PartA_loop (line 48)
a(i+1) = (P(i+1)*area)./m;
Below is my full code, and it appears to fail after at the 2nd iteration iteration (i=2): Please note the commented if statement area, is failing for me as well. I am not too worried about that, I would like to get the code working, and if the "if" statement works as well it's a bonus!
I know it has to do with matrices, but I think I labeled everything correctly, so it should be pulling the correct numbers.
clear all
close all
clc
% constants
d=0.015; % value is in m, or 15mm
area = (1/4)*pi*(0.015)^2;
gamma = 1.66;
m = 0.002; %in kg
time_step = 0.00003; %intervals of 0.0003
% initial conditions
Po = 3.4474E+7; % Pa
c(1) = 1400; % m/s,
x(1) = 0.508; %in meters]
V0 = pi()*((d/2)^2).*x(1);
Pv_gamma0 = Po*V0^gamma;
t(1) = x(1)./c(1);
theta(1) = atand(t(1)./x(1));
a(1) = (Po*area)/m;
u0_0 = 0; %velocity before piston started to move is 0
u(1) = u0_0 + a(1)*time_step;
hyp(1) = -sqrt((t(1)^2)+(x(1)^2));
m(1) = -(t(1)./x(1));
p1 = [x(1),0];
p2 = [0,t(1)];
figure
plot([p1(1) p2(1)],[p1(2) p2(2)])
hold on
for i=1:5
disp(i) = u(i).*time_step;
x(i+1) = x(i) + disp(i);
V(i+1) = pi().*((d/2)^2).*(x(i+1));
P(i+1) = Pv_gamma0./(V(i)^gamma);
c(i+1) = u(i) - c(i);
% if c(i+1) < 0
% c(i+1) = abs(c(i+1));
% disp('CHECK OK: NEGATIVE VALUE')
% elseif c(i+1) > 0
% disp('ERROR CHECK: POSITIVE VALUE')
% end
t(i+1) = x(i+1)./c(i+1);
theta(i+1) = atand(t(i+1)./x(i+1));
a(i+1) = (P(i+1)*area)./m;
u(i+1) = u(i) + a(i+1).*time_step;
hyp(i+1) = -sqrt(((t(i+1))^2)+((x(i+1))^2));
m(i+1) = -(t(i+1))./(x(i+1));
p1 = [x(i),time_step.*i];
p2 = [0,t(i)];
plot([p1(1) p2(1)],[p1(2) p2(2)])
hold on
array1((i+1),1:2) = p1';
end
x
u
m
c
theta
hyp
I also attached the figure on how it should look like when I run the manual code instead.
Thank you in advance, I hope someone can assist!

 Accepted Answer

In the line
a(i+1) = (P(i+1)*area)./m;
m is an array after the first iteration. Do you mean
a(i+1) = (P(i+1)*area)./m(i);

5 Comments

Good day,
No, m is a constant, so it will never change. I added the dot infront of the division, because it was giving me a different error before, I thought that was my "fix". If I remove it, this is the error that I get:
Error using /
Matrix dimensions must agree.
Error in PartA_loop (line 48)
a(i+1) = ((P(i+1))*area)/m;
cancel077, did you see this line:
m(i+1) = -(t(i+1))./(x(i+1));
There you are setting the second element of m to 0.000764164289431116.
Look, all you need to do is to set a breakpoint on the line and you'll see that the second time through, m is [-0.000714285714285714, 0.000764164289431116]. So, now, why do you insist that m is a constant and will never change when the evidence is plain that it's an array?
Well this is embarrassing! Purely name convention error. The one m is for "mass" and the other m is for slope. That is why I insisted that m is a constant. The code is now working, it is not giving me the right answer however. Most likely due to a minor error, I will decode myself later on.
In regards to the if statement within the for loop. That one however is givng me trouble as well. Any ideas?
Index exceeds matrix dimensions.
Error in PartA_loop (line 42)
disp('CHECK OK: NEGATIVE VALUE')
It works fine for me. See:
>> disp('CHECK OK: NEGATIVE VALUE')
CHECK OK: NEGATIVE VALUE
>>
I don't even see what index it's talking about on that line. There is no index at all. You don't have any variable called "disp" do you? What does this say?
which -all disp
Yeah I do have other variables called "disp", that was the issue. Just another simple mistake I did not see!
Thank you appreciate it! Just gotta figure it out now why it's failing on the 3rd iteration now.
Cheers!

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2016b

Community Treasure Hunt

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

Start Hunting!