index must be a positive integer or logical.
1 次查看(过去 30 天)
显示 更早的评论
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
0 个评论
采纳的回答
Image Analyst
2015-9-16
Have you seen the FAQ on this? http://matlab.wikia.com/wiki/FAQ#How_do_I_fix_the_error_.22Subscript_indices_must_either_be_real_positive_integers_or_logicals..22.3F
I think that describes it well enough that you can figure it out using the debugger.
3 个评论
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.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Energy Storage 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!