[SOS!!!!!!!] Plotting with if statement.

I have a problem using the if statement. When I plot the it individually, it was fine.
but when I attempt to combine the plots with if statement, it just doesn't seem right.
Please help me, I'm stuck!!!! Here's my script:
function [x1,x2,x3,x4]=BurnFraction_2()
clear();
a = 5;
n = 4;
thetas = [-50 -20 0 20];
thetad = 60;
for i = 1:4;
theta=linspace(thetas(i),thetas(i)+thetad,100);
dum=(theta-thetas(i))/thetad;
temp=-a.*dum.^n;
xb=1-exp(temp);
if i == 1
x1 = xb;
end
if i == 2
x2 = xb;
end
if i == 3
x3 = xb;
else
x4 = xb;
end
end;
plot(theta,x1,'-',theta,x2,'--',theta,x3,'.',theta,x4,'-.','linewidth',5);
set(gca,'Xlim',[-60 80],'Ylim',[0 1],'fontsize', 18,'linewidth',2);
xlabel('Crank Angle (°)','fontsize', 18);
ylabel('Cumulative Burn Fraction','fontsize', 18);
end
Thank you! I really appreciate it!!!

1 Comment

Stephen23
Stephen23 on 3 May 2016
Edited: Stephen23 on 3 May 2016
Why do you have clear() at the beginning of your function? This is good example of cargo-cult programming: clear does nothing at all here, but is likely put there out of blind faith and habit.
What variables do you imagine that have at the very start of the function, before any variables have been defined? What does clear do ?
Why do beginners think that they need to put clear at the start of every piece of code that they write?

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 3 May 2016
Edited: Stephen23 on 3 May 2016
You made a mistake on these two lines:
theta = linspace(thetas(k),thetas(k)+thetad,100);
dum = (theta-thetas(k))/thetad;
because although you calculate a range of theta values that depends on the loop iteration, you then subtract thetas(k) from theta, so the values in dum are always going to be the same (they do not change with the loop iteration). The rest of your code then correctly plots all four identical vectors in the same location because that is what you calculated.
Try it yourself, it is easy to print the first few values of dum:
disp(dum(1:9))
inside the loop, and you will see that you are always calculating exactly the same values (which you then plot, in exactly the same position, so they look like one line).
Anyway, here is a simplified version of your code (edited after Guillaume's comment):
function [Y,X] = BurnFraction_2()
a = 5;
n = 4;
thetas = [-50 -20 0 20];
thetad = 60;
N = numel(thetas);
X = cell(1,N);
Y = cell(1,N);
for k = 1:N
theta = linspace(thetas(k),thetas(k)+thetad,100);
dum = (theta-thetas(k))/thetad;
temp = -a.*dum.^n;
X{k} = theta;
Y{k} = 1-exp(temp);
end
plot(X{1},Y{1},'-',X{2},Y{2},'--',X{3},Y{3},'.',X{4},Y{4},'-.','linewidth',5);
set(gca,'Xlim',[-60 80],'Ylim',[0 1],'fontsize', 18,'linewidth',2);
xlabel('Crank Angle (°)','fontsize', 18);
ylabel('Cumulative Burn Fraction','fontsize', 18);
which makes this:

3 Comments

@Stephen, I believe that you also need to store theta in a cell array as the out{} should be plotted with different theta.
@Wei-Ta, Huang, something that Stephen did not mention (but corrected with his solution anyway) is the use of the numbered variables, x1 to x4. As a rule, if you're numbering variables, you're doing it wrong.
Notice how much simpler the code is if you store these multiple related vectors in a cell array instead. You don't need all these if anymore.
@Guillaume: thank you, the theta values now have their own cell array.
@Guillaume,@Stephen Cobeldick: Thanks guys! I really appreciate it!!!!!!!!

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!