필터 지우기
필터 지우기

index must be a positive integer or logical.

조회 수: 1 (최근 30일)
Michel de Jongh
Michel de Jongh 2015년 9월 16일
편집: Michel de Jongh 2015년 9월 16일

Hi all,

Currently I'm trying to create a battery simulation in matlab simulink. I'm still in the middle of myresearch so I'm trying different things. I came across this book: 'Electric Vehicle Technology Explained' by James Larminie & John Lowry. I wanted to try one of their scripts for battery simulation but I keep getting the following error:

    Attempted to access open_circuit_voltage_LA(0,6); index must be a positive integer or logical. 
Error in TEST (line 28)
V(0)= open_circuit_voltage_LA(0,NoCells) - I(1)*Rin;

I was hoping you guys could help me out and explain to me the problem and solution. Thanks a bunch, I'll post the code down below.

CODE:
% M file for Figure 2.15
% Simple battery discharge experiment for a large 5 cell NiCad
% battery.
% Form some arrays for holding data.
% Time will run from 0 to 10000 seconds
T=(0:50:50000);
DoD=zeros(1,1001); % Depth of discharge, start off fully charged.
V=zeros(1,1001); % Battery voltage will be calculated at each time
			% step, so fill array with zeros initially.
I=linspace(100,100,1001); % Make current constant, and = 20 amps
NoCells=6	;% 6 cell battery
Capacity=50;  % This is the normal "10 hour" capacity
k=1.12		;% Peukert coefficient, not much greater than 1.
deltaT = 50;	% Take 50 second time steps, OK for constant current
% Calculated values
Rin= (0.022/Capacity)*NoCells;	% Internal resistance
PeuCap= ((Capacity/10)^k)*10; % See equations 2.7 to 2.9
% Starting voltage set outside loop
V(0)= open_circuit_voltage_LA(0,NoCells) - I(1)*Rin;
for n=2:1001
 I_cor= (I(n))^k; % Current corrected by Peukert
 DoD(n)= ((PeuCap * DoD(n-1)) + ((I_cor * deltaT)/3600))/PeuCap;
 if DoD(n)>1 
    DoD(n)=1;
 end
 V(n)=open_circuit_voltage_LA(DoD(n),NoCells) - I(n)*Rin;
 % We will say that the battery is "dead" if the
 % depth of discharge exceeds 99%
 if DoD(n)>0.99
    V(n)=0;
    end
end
C=zeros(1,1001);
C(1)=0;
for n=2:1001
 if V(n)>0
    C(n)=C(n-1)+ ((I(n)*deltaT)/3600);
 else 
    C(n)=C(n-1);
 end
end
for n=1:1001
 I(n)=5;
end
V2=zeros(1,1001);
% Starting voltage set outside loop
V2(1)= open_circuit_voltage_LA(0,NoCells) - I(1)*Rin;
for n=2:1001
 I_cor= (I(n))^k; % Current corrected by Peukert
 DoD(n)= ((PeuCap * DoD(n-1)) + ((I_cor * deltaT)/3600))/PeuCap;
 if DoD(n)>1 
    DoD(n)=1;
 end
 V2(n)=open_circuit_voltage_LA(DoD(n),NoCells) - I(n)*Rin;
 % We will say that the battery is "dead" if the
 % depth of discharge exceeds 99%
 if DoD(n)>0.99
    V2(n)= 0;
    end
end
C2=zeros(1,1001);
C2(1)=0;
for n=2:1001
 if V2(n)>0
    C2(n)=C2(n-1)+ ((I(n)*deltaT)/3600);
 else 
    C2(n)=C2(n-1);
 end
end
for n=1:1001
 I(n)=50;
end
V3=zeros(1,1001);
% Starting voltage set outside loop
V3(1)= open_circuit_voltage_LA(0,NoCells) - I(1)*Rin;
for n=2:1001
 I_cor= (I(n))^k; % Current corrected by Peukert
 DoD(n)= ((PeuCap * DoD(n-1)) + ((I_cor * deltaT)/3600))/PeuCap;
 if DoD(n)>1 
    DoD(n)=1;
 end
 V3(n)=open_circuit_voltage_LA(DoD(n),NoCells) - I(n)*Rin;
 % We will say that the battery is "dead" if the
 % depth of discharge exceeds 99%
 if DoD(n)>0.99
    V3(n)= 0;
    end
end
C3=zeros(1,1001);
C3(1)=0;
for n=2:1001
 if V3(n)>0
    C3(n)=C3(n-1)+ ((I(n)*deltaT)/3600);
 else 
    C3(n)=C3(n-1);
 end
end
plot(C,V,'b.',C2,V2,'r.',C3,V3,'m.');
axis([0 55 7 14]);
end

채택된 답변

Image Analyst
Image Analyst 2015년 9월 16일
I think that describes it well enough that you can figure it out using the debugger.
  댓글 수: 3
Image Analyst
Image Analyst 2015년 9월 16일
OK, I tried to run it but after removing the extra "end" I could not get past this line:
V(0)= open_circuit_voltage_LA(0,NoCells) - I(1)*Rin;
You should provide open_circuit_voltage_LA and any other data necessary to demonstrate the error.
Michel de Jongh
Michel de Jongh 2015년 9월 16일
편집: Michel de Jongh 2015년 9월 16일
That is the exact line that I keep getting stuck on. This is the exact code I got from the book mentioned above. (except for the extra end btw) I believe it is supposed to calculate open_circuit_voltage_LA.
I didn't get any other data with this code. Even when I state that open_circuit_voltage_LA = 6; I still get the same error.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Energy Storage에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by