Error using odearguments (line 95)

5 visualizaciones (últimos 30 días)
Amritanshu Ranjan
Amritanshu Ranjan el 4 de Mzo. de 2023
Comentada: Walter Roberson el 4 de Mzo. de 2023
>> 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 comentario
Walter Roberson
Walter Roberson el 4 de Mzo. de 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.

Iniciar sesión para comentar.

Respuestas (1)

Torsten
Torsten el 4 de Mzo. de 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.

Categorías

Más información sobre Ordinary Differential Equations en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by