For loop not working - How to properly loop inconsistent iterations with matrices?
2 views (last 30 days)
Show older comments
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!
0 Comments
Accepted Answer
Image Analyst
on 17 Nov 2018
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
Image Analyst
on 18 Nov 2018
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
More Answers (0)
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!