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

Réponses (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 commentaires

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.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Symbolic Math Toolbox dans Centre d'aide et File Exchange

Produits

Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by