ODE45 - must return a column vector.

I have following code:
B = readtable('t13.xlsx');
t13 = table2array(B);
c = readtable('ambient.xlsx');
ambient = table2array(c);
d = readtable('solar.xlsx');
solar = table2array(d);
tspan = [0 50];
y0 = 20;
[t,y14] = ode45(@(t,y14) odefcn(t,y14,t13,solar,ambient), tspan, y0);
function dy14dt = odefcn(t,y14,t13,solar,ambient)
dy14dt = zeros(50,1)
dy14dt = [-1.3461*y14 - 1.3556*t13 + 4.3505*solar -1.3556*ambient];
%dy14dt= dy14dt(:);
end
I am getting an error as follows:
Error using odearguments
@(T,Y14)ODEFCN(T,Y14,T13,SOLAR,AMBIENT) must return a column vector.
Error in ode45 (line 107)
odearguments(odeIsFuncHandle,odeTreatAsMFile, solver_name, ode, tspan, y0, options, varargin);
Error in validation (line 11)
[t,y14] = ode45(@(t,y14) odefcn(t,y14,t13,solar,ambient), [0 41.5], y0);
Based on one of the previous post, I tried putting this line: dy14dt= dy14dt(:); but it did not work. Kindly help me to solve this error. Thanks!

 Respuesta aceptada

Torsten
Torsten el 27 de En. de 2023
B = readtable('t13.xlsx');
t13 = table2array(B);
c = readtable('ambient.xlsx');
ambient = table2array(c);
d = readtable('solar.xlsx');
solar = table2array(d);
tspan = [0 50];
y0 = 20;
[t,y14] = ode45(@(t,y14) odefcn(t,y14,t13,solar,ambient), tspan, y0);
plot(t,y14)
function dy14dt = odefcn(t,y14,t13,solar,ambient)
solart = interp1(t13,solar,t);
ambientt = interp1(t13,ambient,t);
dy14dt = -1.3461*y14 - 1.3556*t + 4.3505*solart -1.3556*ambientt;
end

9 comentarios

Shraddha Inamdar
Shraddha Inamdar el 27 de En. de 2023
Hi Torsten,
Thank you very much for the answer. The code suggested by you does work without error but the results are different from expected. Can you please tell me why solart and ambientt are added, it will help me in understanding. Thank you!
Bjorn Gustavsson
Bjorn Gustavsson el 27 de En. de 2023
What is your ode modeling? It would be helpful if you could describe that, preferably both in words and the mathematical equations.
Shraddha Inamdar
Shraddha Inamdar el 27 de En. de 2023
y14 is the value of temperature and solar, ambient and t13 are the values that influence this temperature.
dy14/dt = -1.3461*y14 - 1.3556*t13 + 4.3505*solar -1.3556*ambient
Torsten
Torsten el 27 de En. de 2023
Editada: Torsten el 27 de En. de 2023
You have arrays t13, solar and ambient. I suspect that solar and ambient are factors that influence y14 at times t13. Thus, when the solver tells you to return dy14/dt at time t, you must compute
dy14/dt = -1.3461*y14 - 1.3556*t + 4.3505*solar(t) - 1.3556*ambient(t)
where solar(t), ambient(t) are taken as approximate values for "solar" and "ambient" from your arrays at time t.
"Approximate values" means that you interpolate their values from the graphs (t13,solar) and (t13,ambient).
Is my understanding correct ?
Shraddha Inamdar
Shraddha Inamdar el 28 de En. de 2023
Hello Torsten,
Thank you for your reply.
Actually, solar, ambient and t13, all three factors are indepedent and influence y14.
t13 is not a time value but a temperature value.
Torsten
Torsten el 28 de En. de 2023
Editada: Torsten el 28 de En. de 2023
So at time t, you have calculated a temperature y14 and you must supply t13, solar and ambient for the equation
dy14dt = [-1.3461*y14 - 1.3556*t13 + 4.3505*solar -1.3556*ambient];
to calculate the time derivative of y14.
What are the values from these arrays t13, solar and ambient do you have to use for this ?
Is there a time vector "T" as independent variable in the background such that t13(i), solar(i) and ambient(i) are the values measured at time T(i) ?
Shraddha Inamdar
Shraddha Inamdar el 28 de En. de 2023
Yes, there is a time vector 'T' as independent variable in background and t13(i), solar(i) and ambient(i) are the values measured at time T(i).
Then insert this time vector T and use
B = readtable('t13.xlsx');
t13 = table2array(B);
c = readtable('ambient.xlsx');
ambient = table2array(c);
d = readtable('solar.xlsx');
solar = table2array(d);
T = ??
tspan = [0 50];
y0 = 20;
[t,y14] = ode45(@(t,y14) odefcn(t,y14,T,t13,solar,ambient), tspan, y0);
plot(t,y14)
function dy14dt = odefcn(t,y14,T,t13,solar,ambient)
t13t = interp1(T,t13,t);
solart = interp1(T,solar,t);
ambientt = interp1(T,ambient,t);
dy14dt = -1.3461*y14 - 1.3556*t13t + 4.3505*solart -1.3556*ambientt;
end
Shraddha Inamdar
Shraddha Inamdar el 31 de En. de 2023
It worked. Thank you!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Solar Power en Centro de ayuda y File Exchange.

Productos

Versión

R2022a

Etiquetas

Preguntada:

el 27 de En. de 2023

Comentada:

el 31 de En. de 2023

Community Treasure Hunt

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

Start Hunting!

Translated by