Error using odearguments (line 95)
14 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
>> BATTERcall
Error using odearguments (line 95)
@(T,Y)BATTERY(T,Y,CURRENT,TIME,R1NEW,R2NEW,C1NEW,C2NEW)
returns a vector of length 447379, but
the length of initial conditions vector
is 3. The vector returned by
@(T,Y)BATTERY(T,Y,CURRENT,TIME,R1NEW,R2NEW,C1NEW,C2NEW)
and the initial conditions vector must
have the same number of elements.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed,
solver_name, ode, tspan, y0, options,
varargin);
Error in BATTERcall (line 15)
[T,y] = ode45(@(T,y)
BATTERY(T,y,current,time,R1new,R2new,C1new,C2new),[1
3500], IC);
% main script
y(1)=0.9;y(2)=0;y(3)=0;
IC=[y(1) y(2) y(3)];
load('HPPC_parameters.mat');
R0new = interp1(SOC',R0',x1);
R1new = interp1(SOC',R1',x1);
R2new = interp1(SOC',R2',x1);
C1new = interp1(SOC',C1',x1);
C2new = interp1(SOC',C2',x1);
load('UDDSprofile.mat');
time = UDDSprofile(2:34822,2);
current = UDDSprofile(2:34822,3);
voltage = UDDSprofile(2:34822,4);
[T,y] = ode45(@(T,y) BATTERY(T,y,current,time,R1new,R2new,C1new,C2new),[1 3500], IC);
X1=y(:,1); X2=y(:,2); X3=y(:,3);
% end
% BATTERY file
function dy = BATTERY(T,y,u,time,R1new,R2new,C1new,C2new)
U = interp1(time,u,T);
Q = 1.2*3600;
dy = [-U/(Q);U./C1new - y(2)./(R1new.*C1new);U./C2new - y(3)./(R2new.*C2new)];
end
1 Kommentar
Walter Roberson
am 4 Mär. 2023
U = interp1(time,u,T);
The resulting U will not have continuous first derivatives. The mathematics of ode45() requires that the equations have continuous first and second derivatives. If you are going to use interp1() at all you need to use a method that is at least third order, such as
U = interp1(time, u, T, 'spline');
If the values in current reflect impulses of some sort (for example, the system is being stimulated every 5 seconds) then using spline would not give meaningful results, and you would need a different approach that required looping ode45 calls.
Antworten (1)
Torsten
am 4 Mär. 2023
For the code to work, x1 in the commands
R1new = interp1(SOC',R1',x1);
R2new = interp1(SOC',R2',x1);
C1new = interp1(SOC',C1',x1);
C2new = interp1(SOC',C2',x1);
must be a single value, not a vector of values.
My guess is that this is not the case.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Ordinary Differential Equations finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!