## Plot inside a "for" loop

on 19 Apr 2013

### bym (view profile)

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
```

Cristian

### Cristian (view profile)

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

### the cyclist (view profile)

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

### Ahmed A. Selman (view profile)

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.

## Products

No products are associated with this question.

### bym (view profile)

on 19 Apr 2013

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]')
```

### Neelakanda Bharathiraja (view profile)

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!!!