Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Plot inside a "for" loop

Asked by Cristian on 19 Apr 2013

Hello. I am trying to write a program that generates the pressure-volume diagram for a vehicle engine. I came up with this idea:

nn=length(0:10:720);
P=zeros(nn,1);
V=zeros(nn,1);
for alfa=0:10:720
    cont=alfa/10+1;
    cos_alfa=cosd(alfa);
    x(cont)=76.8*((1-cos_alfa)/2+0.28/4-(0.28/4)*cos_alfa^2);
    if alfa<=180
        P(cont)=0.9;
    elseif alfa>180 & alfa<=360
        P(cont)=320.612/((x(cont)+8.93023)^1.32);
    elseif alfa>360 & alfa<=540
        P(cont)=1119.9/((x(cont)+8.93023)^1.24);
    elseif alfa>540
        P(cont)=1.1;
    end
    V(cont)= 0.0448882+x(cont)*pi*(80^2)/4*(10^(-6));
end
fprintf('\n For alfa %g [degrees], cos_alfa is %g, x is %g, P is %g [bar], V is %g [l] \n',alfa,cos_alfa,x,P,V);
figure(1)
plot(V,P,'-r'),title('Diagram P-V'),xlabel('Volume [l]'),ylabel('Pressure [bar]'),grid;
fprintf('\n')

But something in not quite right. The values that are generated by the program are incorrectly calculated. I cannot figure it out. Please help me. I also made an excel table and these are the correct values:

#   α	Cos(α)	         x	        P[bar]	V[l]
#   0	1	        0	        0,9	0,044888245
#   10	0,984807753	0,74548852	0,9	0,048635479
#   20	0,939692621	2,944675899	0,9	0,0596898
#   30	0,866025404	6,488624495	0,9	0,077503629
#   40	0,766044443	11,20512708	0,9	0,101211357
#   50	0,64278761	16,87172209	0,9	0,12969477
#   60	0,5	        23,232	        0,9	0,161665014
#   70	0,342020143	30,01355396	0,9	0,195752822
#   80	0,173648178	36,94580374	0,9	0,23059811
#   90	6,12574E-17	43,776	        0,9	0,264930421
#   100	-0,173648178	50,28198379	0,9	0,297633062
#   110	-0,342020143	56,28070097	0,9	0,327785904
#   120	-0,5	        61,632	        0,9	0,354684466
#   130	-0,64278761	66,23781051	0,9	0,377835795
#   140	-0,766044443	70,03734031	0,9	0,396934315
#   150	-0,866025404	72,99937551	0,9	0,411823128
#   160	-0,939692621	75,11306918	0,9	0,422447711
#   170	-0,984807753	76,37872395	0,9	0,428809586
#   180	-1	        76,8	        0,9	0,43092715
#   190	-0,984807753	76,37872395	0,905871259	0,428809586
#   200	-0,939692621	75,11306918	0,923921965	0,422447711
#   210	-0,866025404	72,99937551	0,955514834	0,411823128
#   220	-0,766044443	70,03734031	1,003106372	0,396934315
#   230	-0,64278761	66,23781051	1,070571086	0,377835795
#   240	-0,5	        61,632	        1,163761373	0,354684466
#   250	-0,342020143	56,28070097	1,291446563	0,327785904
#   260	-0,173648178	50,28198379	1,466886302	0,297633062
#   270	-1,83772E-16	43,776	1,710494123	0,264930421
#   280	0,173648178	36,94580374	2,054404795	0,23059811
#   290	0,342020143	30,01355396	2,550357131	0,195752822
#   300	0,5	23,232	3,283087245	0,161665014
#   310	0,64278761	16,87172209	4,391348961	0,12969477
#   320	0,766044443	11,20512708	6,091903227	0,101211357
#   330	0,866025404	6,488624495	8,664639763	0,077503629
#   340	0,939692621	2,944675899	12,23115402	0,0596898
#   350	0,984807753	0,74548852	16,02792799	0,048635479
#   360	1	0	17,81724439	0,044888245
#   361	0,999847695	0,007485963	74,07242254	0,044925873
#   362	0,999390827	0,029940075	73,84231701	0,04503874
#   364	0,99756405	0,119699901	72,93523792	0,045489922
#   365	0,996194698	0,186960353	72,2686271	0,04582801
#   366	0,994521895	0,269098467	71,46935741	0,046240881
#   368	0,990268069	0,477834722	69,50837079	0,047290104
#   370	0,984807753	0,74548852	67,13210745	0,048635479
#   380	0,939692621	2,944675899	52,07581649	0,0596898
#   390	0,866025404	6,488624495	37,66976556	0,077503629
#   400	0,766044443	11,20512708	27,05627337	0,101211357
#   410	0,64278761	16,87172209	19,8942875	0,12969477
#   420	0,5	23,232	15,13799475	0,161665014
#   430	0,342020143	30,01355396	11,94082367	0,195752822
#   440	0,173648178	36,94580374	9,745657003	0,23059811
#   450	3,06287E-16	43,776	8,204814666	0,264930421
#   460	-0,173648178	50,28198379	7,102113193	0,297633062
#   470	-0,342020143	56,28070097	6,301157072	0,327785904
#   480	-0,5	61,632	5,714101556	0,354684466
#   490	-0,64278761	66,23781051	5,283192082	0,377835795
#   500	-0,766044443	70,03734031	4,969825313	0,396934315
#   510	-0,866025404	72,99937551	4,748002461	0,411823128
#   520	-0,939692621	75,11306918	4,600380691	0,422447711
#   530	-0,984807753	76,37872395	4,515899646	0,428809586
#   540	-1	76,8	4,488399041	0,43092715
#   550	-0,984807753	76,37872395	1,1	0,428809586
#   560	-0,939692621	75,11306918	1,1	0,422447711
#   570	-0,866025404	72,99937551	1,1	0,411823128
#   580	-0,766044443	70,03734031	1,1	0,396934315
#   590	-0,64278761	66,23781051	1,1	0,377835795
#   600	-0,5	61,632	1,1	0,354684466
#   610	-0,342020143	56,28070097	1,1	0,327785904
#   620	-0,173648178	50,28198379	1,1	0,297633062
#   630	-4,28802E-16	43,776	1,1	0,264930421
#   640	0,173648178	36,94580374	1,1	0,23059811
#   650	0,342020143	30,01355396	1,1	0,195752822
#   660	0,5	23,232	1,1	0,161665014
#   670	0,64278761	16,87172209	1,1	0,12969477
#   680	0,766044443	11,20512708	1,1	0,101211357
#   690	0,866025404	6,488624495	1,1	0,077503629
#   700	0,939692621	2,944675899	1,1	0,0596898
#   710	0,984807753	0,74548852	1,1	0,048635479
#   720	1	        0	        1,1	0,044888245

5 Comments

Cristian on 19 Apr 2013

Ok, thanks, but it doesn't change anything, any other ideas please? All suggestions are welcome.

nn=length(0:10:720);
P=zeros(nn,1);
V=zeros(nn,1);
for alfa=0:10:720
    cont=alfa/10+1;
    cos_alfa=cosd(alfa);
    x(cont)=76.8*((1-cos_alfa)/2+0.28/4-(0.28/4)*cos_alfa^2);
    if (alfa<=180)
        P(cont)=0.9;
    elseif ((alfa>180) && (alfa<=360))
        P(cont)=320.612/((x(cont)+8.93023)^1.32);
    elseif ((alfa>360) && (alfa<=540))
        P(cont)=1119.9/((x(cont)+8.93023)^1.24);
    elseif (alfa>540)
        P(cont)=1.1;
    end
    V(cont)= 0.0448882+x(cont)*pi*(80^2)/4*(10^(-6));
end
fprintf('\n For alfa %g [degrees], cos_alfa is %g, x is %g, P is %g [bar], V is %g [l] \n',alfa,cos_alfa,x,P,V);
figure(1)
plot(V,P,'-r'),title('Diagram P-V'),xlabel('Volume [l]'),ylabel('Pressure [bar]'),grid;
fprintf('\n')
the cyclist on 19 Apr 2013

This is a lot of code and output to look at. Can you be much more specific about what is wrong? Can you post the smallest possible example that illustrates the problem?

Ahmed A. Selman on 20 Apr 2013

So interesting.

I've ran the code you posted, and got some nice figure. Then I've copied your data into a text file, imported it to Excel, re-imported it to Matlab, and draw P vs. V, and got the very same, very nice, figure. SO where is the problem.. :)

If you think there is some problem with the code, then re-check your math, and your excel data as well.. please.

Cristian

Products

No products are associated with this question.

2 Answers

Answer by proecsm on 19 Apr 2013
Accepted answer

Please see comments in code. I checked a couple of values and they agree with your excel table, but it is up to you to verify that it is indeed providing the correct calculations

clc;clear,close all
nn=length(0:10:720);
P=zeros(nn,1);
V=zeros(nn,1);
for alfa=0:10:720
    cont=alfa/10+1;
    cos_alfa=cosd(alfa);
    x(cont)=76.8*((1-cos_alfa)/2+0.28/4-(0.28/4)*cos_alfa^2);
    if (alfa<=180)
        P(cont)=0.9;
    elseif (alfa<=360)   % you do not need the && statement, if it greater than 180 don't test for it
        P(cont)=320.612/((x(cont)+8.93023)^1.32);
    elseif (alfa<=540)
        P(cont)=1119.9/((x(cont)+8.93023)^1.24);
    else                       % last statement is an 'else' since other options are exhausted
        P(cont)=1.1;
    end
    V(cont)= 0.0448882+x(cont)*pi*(80^2)/4*(10^(-6));
end
%fprintf('\n For alfa %g [degrees], cos_alfa is %g, x is %g, P is %g [bar], V is %g [l] \n',alfa,cos_alfa,x,P,V);
figure(1)
plot(V,P,'-r'),title('Diagram P-V'),xlabel('Volume [l]'),ylabel('Pressure [bar]'),grid;
fprintf('\n')
fprintf('x\t\t\tP[bar]\t\t\tV[l]\n')         %table output might be clearer
fprintf('%-6.4f\t\t\t%-6.4f\t\t\t%-6.4f\n',[x' P V]')

0 Comments

proecsm
Answer by Neelakanda Bharathiraja on 20 Apr 2013

You program generates P and V values for the alfa=0:10:720. That has an increment of 10. But the Excel table has the expected values for alfa=[0:10:360 361 362 364 365 366 368 370:10:720].

Here are the two solutions: 1.If you compare the generated data with the Excel file by ignoring the rows for alfa = 361 362 364 365 366 368, then everything works fine!

2. Modify the code to work for alfa = 361 362 364 365 366 368. Here is the modified code.

 nn=length([0:10:360 361 362 364 365 366 368 370:10:720]);
 P=zeros(nn,1);
 V=zeros(nn,1);
 cont = 1; 
for alfa=[0:10:360 361 362 364 365 366 368 370:10:720]
    cos_alfa=cosd(alfa);
    x(cont)=76.8*((1-cos_alfa)/2+0.28/4-(0.28/4)*cos_alfa^2);
    if alfa<=180
        P(cont)=0.9;
    elseif alfa>180 & alfa<=360
        P(cont)=320.612/((x(cont)+8.93023)^1.32);
    elseif alfa>360 & alfa<=540
        P(cont)=1119.9/((x(cont)+8.93023)^1.24);
    elseif alfa>540
        P(cont)=1.1;
    end
    V(cont)= 0.0448882+x(cont)*pi*(80^2)/4*(10^(-6));
    cont = cont +1;
end
fprintf('\n For alfa %g [degrees], cos_alfa is %g, x is %g, P is %g [bar], V is %g [l] \n',alfa,cos_alfa,x,P,V);
figure(1)
plot(V,P,'-r'),title('Diagram P-V'),xlabel('Volume [l]'),ylabel('Pressure [bar]'),grid;
fprintf('\n')  

By the way, there is no Plot inside a "for" loop in the code!!!

0 Comments

Neelakanda Bharathiraja

Contact us