Solving a system of equations using the solve function in a for loop?

I am attempting to design a closed loop heat excahnger system where a transfer fluid transfers heat from a high constant temperature source to a phase changing material, I am using the solve function to solve some equations simultaneously but I am getting an error everytime I try to run the loop
Note: any variable seen here other than what is being calculated for is predifined (I can provide them if that helps in finding a solution.
%% Charging loop
%initial conditions
Epcm(1)=0;
Ef(1)=0;
Eoil(1)=0;
Toil_PCM_to_EG(1)=20;
Toil_EG_to_PCM(1)=20;
TPCM(1)=20;
q(1)=0;
time_step=1;
for t=2:time_step:3600
syms Toil_EG_to_PCM(t)
eqn=mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))==((UE).*AsE.*(TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))-(TE-Toil_EG_to_PCM(t)))./log((TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))./(TE-Toil_EG_to_PCM(t)));
S=solve(eqn,Toil_EG_to_PCM(t));
if TPCM(t)<Tmelt
syms q(t) TPCM(t) Toil_PCM_to_EG(t)
eq1=Toil_PCM_to_EG(t)==S-q(t)./(mdoto.*Co);
eq2=q(t)==(((S+Toil_PCM_to_EG(t))./2)-((TPCM(t)+TPCM(t-time_step))./2)/Rtp);
eq3=q(t).*time_step==mPCM.*Cpl.*(TPCM(t)+TPCM(t-time_step));
sol=solve([e1 eq2 eq3],[q(t) Toil_PCM_to_EG(t) TPCM(t)]);
qsol=sol.q(t);
osol=sol.Toil_PCM_to_EG(t);
psol=sol.TPCM(t);
Epcm(t)=qsol.*time_step +Epcm(t-time_step);
Ef(t)=0;
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol).*time_step-Eoil(t-time_step);
else
if Ef(t)<mPCM*Lf
TPCM(t)=Tmelt;
syms q(t) TPCM(t)
eq1=Toil_PCM_to_EG(t)==S-q(t)./(mdoto.*Co);
eq2=q(t)==(((S+Toil_PCM_to_EG(t))./2)-(Tmelt)/Rtp);
sol=solve([e1 eq2 ],[q(t) Toil_PCM_to_EG(t) ]);
qsol=sol.q(t);
osol=sol.Toil_PCM_to_EG(t);
Epcm(t)=qsol.*time_step +Epcm(t-time_step);
Ef(t)=qsol.*time_step +Ef(t-time_step);
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol)*time_step-Eoil(t-time_step);
else
syms q(t) TPCM(t) Toil_PCM_to_EG(t)
eq1=Toil_PCM_to_EG(t)==S-q(t)./(mdoto.*Co);
eq2=q(t)==(((S+Toil_PCM_to_EG(t))./2)-((TPCM(t)+TPCM(t-time_step))./2)/Rtp);
eq3=q(t).*time_step==mPCM.*Cps.*(TPCM(t)+TPCM(t-time_step));
sol=solve([e1 eq2 eq3],[q(t) Toil_PCM_to_EG(t) TPCM(t)]);
qsol=sol.q(t);
osol=sol.Toil_PCM_to_EG(t);
psol=sol.TPCM(t);
Epcm(t)=qsol.*time_step +Epcm(t-time_step);
Ef(t)=mPCM.*Lf;
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol).*time_step-Eoil(t-time_step);
end
end
end

Answers (1)

Remove all the (t) in the symbolic variables, so use
syms q TPCM Toil_PCM_to_EG
instead of
syms q(t) TPCM(t) Toil_PCM_to_EG(t)
After solving, you can write the results in numerical arrays that you can index with t.

6 Comments

syms Toil_EG_to_PCM mdoto Co Toil_PCM_to_EG UE AsE TE mdotex Ca
eqn=mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))==((UE).*AsE.*(TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))-(TE-Toil_EG_to_PCM(t)))./log((TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))./(TE-Toil_EG_to_PCM(t)));
S=solve(eqn,Toil_EG_to_PCM(t));
I've removed the indexing from the symbolic variables however I am unable to remove them from the eqn since there is a part of the equation that draws from a previous timestep, would there be a workaround to this?
This is the error I am getting:
Index exceeds the number of array elements. Index must not exceed 1.
Error in indexing (line 1075)
R_tilde = builtin('subsref',L_tilde,Idx);
Error in PCM_chargining_loop (line 65)
eqn=mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))==((UE).*AsE.*(TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))-(TE-Toil_EG_to_PCM(t)))./log((TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-Toil_PCM_to_EG(t-time_step))./(TE-Toil_EG_to_PCM(t)));
>>
In your eqn expression, there are still the indexed expressions for Toil_EG_to_PCM and Toil_PCM_to_EG which are symbolic variables.
The t-indexed symbolic variables can not be part the equation.
For usual numeric arrays this is not a problem.
%% Charging loop
%initial conditions
Epcm(1)=0;
Ef(1)=0;
Eoil(1)=0;
Toil_PCM_to_EG(1)=20;
Toil_EG_to_PCM(1)=20;
TPCM(1)=20;
q(1)=0;
time_step=1;
for t=2:time_step:3600
syms Toil_EG_to_PCM mdoto Co Toil_PCM_to_EG UE AsE TE mdotex Ca
eqn=mdoto.*Co.*(Toil_EG_to_PCM-Toil_PCM_to_EG)==(UE).*AsE.*(TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM-Toil_PCM_to_EG-Toil_PCM_to_EG)-(TE-Toil_EG_to_PCM))./log((TE-((mdoto.*Co)./(mdotex.*Ca)).*(Toil_EG_to_PCM-Toil_PCM_to_EG)-Toil_PCM_to_EG)./(TE-Toil_EG_to_PCM));
Toil_EG_to_PCM(t)=solve(eqn,Toil_EG_to_PCM);
if TPCM(t)<Tmelt
TPCM(t)=(q(t-time_step)*time_step)/(mPCM*Cps);
syms q TPCM Toil_PCM_to_EG mdoto Co Toil_EG_to_PCM Rtp
eq1=Toil_PCM_to_EG==Toil_EG_to_PCM-q./(mdoto.*Co);
eq2=q==(Toil_EG_to_PCM-TPCM)/Rtp;
sol=solve([e1 eq2 ],[q Toil_PCM_to_EG TPCM]);
q(t)=sol.q;
Toil_PCM_to_EG(t+time_step)=sol.Toil_PCM_to_EG;
Epcm(t)=q(t)*time_step +Epcm(t-time_step);
Ef(t)=0;
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol).*time_step-Eoil(t-time_step);
else
if Ef(t)<mPCM*Lf
TPCM(t)=Tmelt;
syms q TPCM mdoto Co Toil_EG_to_PCM Rtp Toil_PCM_to_EG
eq1=Toil_PCM_to_EG==Toil_EG_to_PCM-q./(mdoto.*Co);
eq2=q==(Toil_EG_to_PCM-Tmelt)/Rtp;
sol=solve([e1 eq2 ],[q Toil_PCM_to_EG ]);
q(t)=sol.q;
Toil_PCM_to_EG(t+time_step)=sol.Toil_PCM_to_EG;
Epcm(t)=q(t).*time_step +Epcm(t-time_step);
Ef(t)=q(t).*time_step +Ef(t-time_step);
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol)*time_step-Eoil(t-time_step);
else
syms q TPCM Toil_PCM_to_EG mdoto Co Toil_EG_to_PCM Rtp
eq1=Toil_PCM_to_EG(t)==Toil_EG_to_PCM-q(t)./(mdoto.*Co);
eq2=q==(Toil_EG_to_PCM-TPCM)/Rtp;
sol=solve([e1 eq2 ],[q Toil_PCM_to_EG]);
q(t)=sol.q;
Toil_PCM_to_EG(t+time_step)=sol.Toil_PCM_to_EG;
Epcm(t)=q(t).*time_step +Epcm(t-time_step);
Ef(t)=mPCM.*Lf;
Eoil(t)=(mdoto.*Co.*(Toil_EG_to_PCM(t)-Toil_PCM_to_EG(t-time_step))-qsol).*time_step-Eoil(t-time_step);
end
end
end
I have removed the indexing from the symbolic equations and attempted to add them on later as seen in the solve function but I ended up coming across this error :
Warning: Unable to find explicit solution. For options, see help.
> In sym/solve (line 317)
In PCM_chargining_loop (line 66)
Unable to perform assignment because the left and right sides have a different number of elements.
Error in sym/privsubsasgn (line 1307)
L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);
Error in indexing (line 1138)
C = privsubsasgn(L,R,inds{:});
Error in PCM_chargining_loop (line 66)
Toil_EG_to_PCM(t)=solve(eqn,Toil_EG_to_PCM);
Appreciate all thus far and thank you in advance.
syms q TPCM Toil_PCM_to_EG mdoto Co Toil_EG_to_PCM Rtp
eq1=Toil_PCM_to_EG(t)==Toil_EG_to_PCM-q(t)./(mdoto.*Co);
Don't you see that you still have the t-indexing for the symbolic variables Toil_PCM_to_EG and q ?
I didn't check for other instances in your code.
And don't name the numerical variables in which you write results equal to the symbolic ones. E.g you have symbolic q and numerical q(t). Same for Toil_PCM_to_EG and maybe others.

Sign in to comment.

Products

Release

R2022a

Asked:

on 3 Nov 2022

Edited:

on 6 Nov 2022

Community Treasure Hunt

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

Start Hunting!