solving 13 interdependent odes simultaneously by ode45

5 次查看(过去 30 天)
qgin=12;
c_g_in=[1 2 3 4 5 6 ];
c=zeros(13,1);
c_l_in=[1 3 5 7 3 5 ];
vg=27;
kla=[13 34 5 6 7 7 ];
vl=65;
m=[23 3 5 2 1 4];
ql=123;
v_max=[1 2 3 5 7 1];
for i=1:6
v(i)=-v_max(i).*c(i);
end
yxco=12;
R=8.314;
yxh2=23;
xp=45;
mu=-v(1)*yxco-v(2)*yxh2;
kd=15;
c0=[1 2 3 0 0 0 0 0 0 2 5 6 2];
c0g=c0(1:6);
psat=[1 23 45 54 67 86];
ngout=qgin*sum(c_g_in,'all')-kla(1)*((c(1)/m(1))-c(7))*vl-kla(2)*((c(2)/m(2))-c(8))*vl-kla(3)*((c(3)/m(3))-c(9))*vl+kla(4)*((c(10)/m(4))-c(4))*vl+kla(5)*((c(11)/m(5))-c(5))*vl+kla(6)*((c(12)/m(6))-c(6))*vl;
qgout=ngout*R*t/(sum((psat.*c0g),'all'));
[t,c]=ode45(@(t,c)odef(c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd),[0,600],c0)
function de = odef(c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd)
de=zeros(1,13);
de(1)=((qgin.*c_g_in(1)-qgout.*c(1))./vg)-kla(1).*(vl/vg).*((c(1)./m(1))-c(7));
de(2)=((qgin.*c_g_in(2)-qgout.*c(2))./vg)-kla(2).*(vl/vg).*((c(2)./m(2))-c(8));
de(3)=((qgin.*c_g_in(3)-qgout.*c(3))./vg)-kla(3).*(vl/vg).*((c(3)./m(3))-c(9));
de(4)=((qgin.*c_g_in(4)-qgout.*c(4))/vg)+kla(4).*(vl/vg).*((c(10)./m(4))-c(4));
de(5)=((qgin.*c_g_in(5)-qgout.*c(5))/vg)+kla(5).*(vl/vg).*((c(11)./m(5))-c(5));
de(6)=((qgin.*c_g_in(6)-qgout.*c(6))/vg)+kla(6).*(vl/vg).*((c(12)./m(6))-c(6));
de(7)=((ql/vl).*(c_l_in(1)-c(7))+kla(1).*((c(1)./m(1))-c(7))+v(1).*c(13));
de(8)=((ql/vl).*(c_l_in(2)-c(8))+kla(2).*((c(2)./m(2))-c(8))+v(2).*c(13));
de(9)=((ql/vl).*(c_l_in(3)-c(9))+kla(3).*((c(3)./m(3))-c(9))+v(3).*c(13));
de(10)=((ql/vl).*(c_l_in(4)-c(10))-kla(4).*((c(10)./m(4))-c4)+v(4).*c(13));
de(11)=((ql/vl).*(c_l_in(5)-c(11))-kla(5).*((c(11)./m(5))-c5)+v(5).*c(13));
de(12)=((ql/vl).*(c_l_in(6)-c(12))-kla(6).*((c(12)./m(6))-c6)+v(6).*c(13));
de(13)=((ql/vl).*(-c(13).*xp)+mu.*c(13)-kd.*c(13));
end
above is the code i wrote to solve the 13 odes simultaneously.i have done everything i could but i was unable to solve it. the errors kept popping out:
The following error occurred converting
from sym to double:
Unable to convert expression containing
symbolic variables into double array.
Apply 'subs' function first to
substitute values for variables.
Error in udhd>odef (line 29)
de(1)=((qgin.*c_g_in(1)-qgout.*c(1))./vg)-kla(1).*(vl/vg).*((c(1)./m(1))-c(7));
Error in
udhd>@(t,c)odef(c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd)
(line 26)
[t,c]=ode45(@(t,c)odef(c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd),[0,600],c0)
Error in odearguments (line 90)
f0 = feval(ode,t0,y0,args{:}); %
ODE15I sets args{1} to yp0.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed,
solver_name, ode, tspan, y0, options,
varargin);
Error in udhd (line 26)
[t,c]=ode45(@(t,c)odef(c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd),[0,600],c0)
the above code which i typed was in reference with this
function dydt = odefcn(t,y,A,B)
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = (A/B)*t.*y(1);
A = 1;
B = 2;
tspan = [0 5];
y0 = [0 0.01];
[t,y] = ode45(@(t,y) odefcn(t,y,A,B), tspan, y0);
the abive code i typed can be found on link below
<https://www.mathworks.com/help/matlab/ref/ode45.html solve non stiff odes with ode45>

回答(1 个)

Alan Stevens
Alan Stevens 2021-3-17
Well, the following works. I wouldn't know if the results make sense!
qgin=12;
c_g_in=[1 2 3 4 5 6 ];
c=zeros(13,1);
c_l_in=[1 3 5 7 3 5 ];
vg=27;
kla=[13 34 5 6 7 7 ];
vl=65;
m=[23 3 5 2 1 4];
ql=123;
v_max=[1 2 3 5 7 1];
for i=1:6
v(i)=-v_max(i).*c(i);
end
yxco=12;
R=8.314;
yxh2=23;
xp=45;
mu=-v(1)*yxco-v(2)*yxh2;
kd=15;
c0=[1 2 3 0 0 0 0 0 0 2 5 6 2];
c0g=c0(1:6);
psat=[1 23 45 54 67 86];
ngout=qgin*sum(c_g_in,'all')-kla(1)*((c(1)/m(1))-c(7))*vl-kla(2)*((c(2)/m(2))-c(8))*vl-kla(3)*((c(3)/m(3))-c(9))*vl+kla(4)*((c(10)/m(4))-c(4))*vl+kla(5)*((c(11)/m(5))-c(5))*vl+kla(6)*((c(12)/m(6))-c(6))*vl;
qgout=ngout*R/(sum((psat.*c0g),'all')); % t not yet defined so put it in odef
% ode45 must have t as first argument
% Need to pass v to odef
[t,c]=ode45(@(t,c)odef(t,c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd,v),[0,600],c0);
plot(t,c),grid
xlabel('t'),ylabel('c')
function de = odef(t,c,qgin,c_g_in,qgout,kla,vg,vl,m,c_l_in,ql,xp,mu,kd,v)
qgout = qgout*t;
de=zeros(13,1); % Needs to be a column vector
de(1)=((qgin.*c_g_in(1)-qgout.*c(1))./vg)-kla(1).*(vl/vg).*((c(1)./m(1))-c(7));
de(2)=((qgin.*c_g_in(2)-qgout.*c(2))./vg)-kla(2).*(vl/vg).*((c(2)./m(2))-c(8));
de(3)=((qgin.*c_g_in(3)-qgout.*c(3))./vg)-kla(3).*(vl/vg).*((c(3)./m(3))-c(9));
de(4)=((qgin.*c_g_in(4)-qgout.*c(4))/vg)+kla(4).*(vl/vg).*((c(10)./m(4))-c(4));
de(5)=((qgin.*c_g_in(5)-qgout.*c(5))/vg)+kla(5).*(vl/vg).*((c(11)./m(5))-c(5));
de(6)=((qgin.*c_g_in(6)-qgout.*c(6))/vg)+kla(6).*(vl/vg).*((c(12)./m(6))-c(6));
de(7)=((ql/vl).*(c_l_in(1)-c(7))+kla(1).*((c(1)./m(1))-c(7))+v(1).*c(13));
de(8)=((ql/vl).*(c_l_in(2)-c(8))+kla(2).*((c(2)./m(2))-c(8))+v(2).*c(13));
de(9)=((ql/vl).*(c_l_in(3)-c(9))+kla(3).*((c(3)./m(3))-c(9))+v(3).*c(13));
de(10)=((ql/vl).*(c_l_in(4)-c(10))-kla(4).*((c(10)./m(4))-c(4))+v(4).*c(13));
de(11)=((ql/vl).*(c_l_in(5)-c(11))-kla(5).*((c(11)./m(5))-c(5))+v(5).*c(13));
de(12)=((ql/vl).*(c_l_in(6)-c(12))-kla(6).*((c(12)./m(6))-c(6))+v(6).*c(13));
de(13)=((ql/vl).*(-c(13).*xp)+mu.*c(13)-kd.*c(13));
end

类别

Help CenterFile Exchange 中查找有关 Ordinary Differential Equations 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by