System of differential equations with many input arguments.

조회 수: 4 (최근 30일)
Myrto Kasioumi
Myrto Kasioumi 2020년 12월 1일
댓글: Myrto Kasioumi 2020년 12월 1일
Hello,
I am trying to solve a system of five differential equations and get some plots back. The equations I have to solve are the following:
Where all correspond to derivatives of specific functions which in order to make the code for matlab I substituted them in the above functions. The code I am using for that is the following:
% l stands for \tau, u for \Theta, v for a, o for b (from utility) and j for ξ
syms S(t) P(t) c(t) h(t) z(t) A b d e g k l m n o r t u v w Y
eqn1 = diff(S,t) == A*(b*S)^(1-g)*(z^g) - v*z - c - b*S*l;
eqn2 = diff(P,t) == u*z - d*P + j*c + (1-b)*S;
eqn3 = diff(h,t) == m*((b*S)-h);
eqn4 = diff(c,t) == (((b*(A*(1-g)*b^(1-g)*S^(-g)*z^g - l -r)) - ((A*g*(b*S)^(1-g)*z^(g-1) - v) * (1 - b + j*(d+r)) * (1/u))) * (u/(u - j*(v-g*A*(b*S)^(1-g)*z^(g-1))))) + ((1/(n*c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) * ((exp(r*t)*w*m*b + b*(c*P^(-e)*h^(-o))^(1-n)*S^(-n)*b^(1-n)) + (j*e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)) - ((1-n)*e*c^(-n)*P^(-e*(1-n)-1)*(b*S*h^(-o))^(1-n)*(u*z+(1-b)*S+j*c-d*P)) + (b*(1-n)*c^(-n)*(P^(-e)*h^(-o))^(1-n)*b^(1-n)*S^(-n)*(A*(b*S)^(1-g)*z^g - c - v*z - l*b*S))));
eqn5 = diff(z,t) == (((A*g*(b*S)^(1-g)*z^(g-1)-v) / (A*g*(g-1)*(b*S)^(1-g)*z^(g-2))) * ( d + ((e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)*u) / (c^(-n)*(P*b*S*h^(-o))^(1-n))) - ((e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)*j) / (c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) + b*(A*(1-g)*b^(1-g)*S^(-g)*z^g - l + ((w*m*(u-j*(v-A*g*(b*S)^(1-g)*z^(g-1)))) / (exp(-r*t)*u*c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n)))) + ((b^(1-n)*S^(-n)*(c*P^(-e)*h^(-o))^(1-n) * (u-j*(v-A*g*(b*S)^(1-g)*z^(g-1)))) / (u*e^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) + ((1-b)*(v-A*g*(b*S)^(1-g)*z^(g-1))*(1/u)))) - ((b*z/S) * (A*(b*S)^(1-g)*z^g - v*z - c - b*S*l));
[VF,Subs] = odeToVectorField(eqn1,eqn2,eqn3,eqn4,eqn5);
odefcn = matlabFunction(VF, 'Vars',{t,A,Y,b,d,e,g,k,l,m,n,o,r,u,v,w});
A=3;
b=0.6;
d=0.3;
e=0.4;
g=0.3;
k=4;
l=2;
m=0.7;
n=2;
o=0.6;
r=0.5;
u=10;
v=2;
w=0.7;
tspan = [0 50];
y0 = [100 60 40 30 50];
[t,Y] = ode45(@(t,Y) odefcn(t,A,Y,b,d,e,g,k,l,m,n,o,r,t,u,v,w) , tspan, y0);
P = Y(:,1);
S = Y(:,2);
h = Y(:,3);
c = Y(:,4);
z = Y(:,5);
x = b*S;
q = A*((b*S).^(1-g)).*(z.^g);
figure(1)
plot(c,P)
title(sprintf('c-P'))
xlabel('Consumption (c)')
ylabel('Pollution (P)')
figure(2)
plot(c,x)
title(sprintf('C-x'))
xlabel('Consumption (c)')
ylabel('Recycling (x)')
figure(3)
plot(q,P)
title(sprintf('q-P'))
xlabel('Output (q)')
ylabel('Pollution (P)')
figure(4)
plot(q,x)
title(sprintf('q-x'))
xlabel('Output (q)')
ylabel('Recycling (x)')
I've used that code before for different functions and it was working perfectly but with those differential equations it doesn't work and it give me back the following error:
Error using
symengine>@(t,A,Y,b,d,e,g,k,l,m,n,o,r,u,v,w)[-d.*Y(1)+u.*Y(5)+Y(4).*1i-Y(2).*(b-1.0);-v.*Y(5)-Y(4)+A.*(b.*Y(2)).^(-g+1.0).*Y(5).^g-b.*l.*Y(2);m.*(b.*Y(2)-Y(3));-(u.*(b.*(l+r+A.*b.^(-g+1.0).*Y(2).^(-g).*Y(5).^g.*(g-1.0))-((v-A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0)).*(-b+d.*1i+r.*1i+1.0))./u))./(u-v.*1i+A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0).*1i)+(Y(4).^n.*(b.*Y(1).^(-e).*Y(2).*Y(3).^(-o)).^(n-1.0).*(e.*Y(1).^(e.*(n-1.0)-1.0).*(b.*Y(2).*Y(3).^(-o).*Y(4)).^(-n+1.0).*1i+b.*m.*w.*exp(r.*t)+b.*b.^(-n+1.0).*Y(2).^(-n).*(Y(1).^(-e).*Y(3).^(-o).*Y(4)).^(-n+1.0)-e.*Y(1).^(e.*(n-1.0)-1.0).*Y(4).^(-n).*(n-1.0).*(b.*Y(2).*Y(3).^(-o)).^(-n+1.0).*(d.*Y(1)-u.*Y(5)-Y(4).*1i+Y(2).*(b-1.0))+b.*b.^(-n+1.0).*(Y(1).^(-e).*Y(3).^(-o)).^(-n+1.0).*Y(2).^(-n).*Y(4).^(-n).*(n-1.0).*(v.*Y(5)+Y(4)-A.*(b.*Y(2)).^(-g+1.0).*Y(5).^g+b.*l.*Y(2))))./n;(b.*Y(5).*(v.*Y(5)+Y(4)-A.*(b.*Y(2)).^(-g+1.0).*Y(5).^g+b.*l.*Y(2)))./Y(2)-((b.*Y(2)).^(g-1.0).*Y(5).^(-g+2.0).*(v-A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0)).*(d-b.*(l+A.*b.^(-g+1.0).*Y(2).^(-g).*Y(5).^g.*(g-1.0)-(m.*w.*exp(r.*t).*Y(4).^n.*(u-v.*1i+A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0).*1i).*(b.*Y(1).^(-e).*Y(2).*Y(3).^(-o)).^(n-1.0))./u)-((v-A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0)).*(b-1.0))./u-e.*Y(1).^(e.*(n-1.0)-1.0).*Y(4).^n.*(b.*Y(2).*Y(3).^(-o).*Y(4)).^(-n+1.0).*(b.*Y(1).^(-e).*Y(2).*Y(3).^(-o)).^(n-1.0).*1i+e.*u.*Y(1).^(e.*(n-1.0)-1.0).*Y(4).^n.*(b.*Y(1).*Y(2).*Y(3).^(-o)).^(n-1.0).*(b.*Y(2).*Y(3).^(-o).*Y(4)).^(-n+1.0)+(b.^(-n+1.0).*e.^n.*Y(2).^(-n).*(u-v.*1i+A.*g.*(b.*Y(2)).^(-g+1.0).*Y(5).^(g-1.0).*1i).*(Y(1).^(-e).*Y(3).^(-o).*Y(4)).^(-n+1.0).*(b.*Y(1).^(-e).*Y(2).*Y(3).^(-o)).^(n-1.0))./u))./(A.*g.*(g-1.0))]
Too many input arguments.
Error in @(t,Y)odefcn(t,A,Y,b,d,e,g,k,l,m,n,o,r,t,u,v,w)
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);
So now I do not know how to move on. I understand that the system of differential equations I am using has many arguments as the error message says as well, but most of them are parameters which I define giving numerical values for them. Shouldn't Matlab be able to solve that?
Any help would be very much appreciated (any idea, thought, solution or anything else).
Thank you so much in advance.

채택된 답변

Stephan
Stephan 2020년 12월 1일
편집: Stephan 2020년 12월 1일
Try:
% l stands for \tau, u for \Theta, v for a, o for b (from utility) and j for ξ
syms S(t) P(t) c(t) h(t) z(t) A b d e g k l m n o r t u v w Y
eqn1 = diff(S,t) == A*(b*S)^(1-g)*(z^g) - v*z - c - b*S*l;
eqn2 = diff(P,t) == u*z - d*P + j*c + (1-b)*S;
eqn3 = diff(h,t) == m*((b*S)-h);
eqn4 = diff(c,t) == (((b*(A*(1-g)*b^(1-g)*S^(-g)*z^g - l -r)) - ((A*g*(b*S)^(1-g)*z^(g-1) - v) * (1 - b + j*(d+r)) * (1/u))) * (u/(u - j*(v-g*A*(b*S)^(1-g)*z^(g-1))))) + ((1/(n*c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) * ((exp(r*t)*w*m*b + b*(c*P^(-e)*h^(-o))^(1-n)*S^(-n)*b^(1-n)) + (j*e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)) - ((1-n)*e*c^(-n)*P^(-e*(1-n)-1)*(b*S*h^(-o))^(1-n)*(u*z+(1-b)*S+j*c-d*P)) + (b*(1-n)*c^(-n)*(P^(-e)*h^(-o))^(1-n)*b^(1-n)*S^(-n)*(A*(b*S)^(1-g)*z^g - c - v*z - l*b*S))));
eqn5 = diff(z,t) == (((A*g*(b*S)^(1-g)*z^(g-1)-v) / (A*g*(g-1)*(b*S)^(1-g)*z^(g-2))) * ( d + ((e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)*u) / (c^(-n)*(P*b*S*h^(-o))^(1-n))) - ((e*P^(-e*(1-n)-1)*(c*b*S*h^(-o))^(1-n)*j) / (c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) + b*(A*(1-g)*b^(1-g)*S^(-g)*z^g - l + ((w*m*(u-j*(v-A*g*(b*S)^(1-g)*z^(g-1)))) / (exp(-r*t)*u*c^(-n)*(P^(-e)*b*S*h^(-o))^(1-n)))) + ((b^(1-n)*S^(-n)*(c*P^(-e)*h^(-o))^(1-n) * (u-j*(v-A*g*(b*S)^(1-g)*z^(g-1)))) / (u*e^(-n)*(P^(-e)*b*S*h^(-o))^(1-n))) + ((1-b)*(v-A*g*(b*S)^(1-g)*z^(g-1))*(1/u)))) - ((b*z/S) * (A*(b*S)^(1-g)*z^g - v*z - c - b*S*l));
[VF,Subs] = odeToVectorField(eqn1,eqn2,eqn3,eqn4,eqn5);
odefcn = matlabFunction(VF, 'Vars',{t,Y,A,b,d,e,g,k,l,m,n,o,r,u,v,w});
A=3;
b=0.6;
d=0.3;
e=0.4;
g=0.3;
k=4;
l=2;
m=0.7;
n=2;
o=0.6;
r=0.5;
u=10;
v=2;
w=0.7;
tspan = [0 50];
y0 = [100 60 40 30 50];
[t,Y] = ode45(@(t,Y) odefcn(t,Y,A,b,d,e,g,k,l,m,n,o,r,u,v,w) , tspan, y0);
P = Y(:,1);
S = Y(:,2);
h = Y(:,3);
c = Y(:,4);
z = Y(:,5);
x = b*S;
q = A*((b*S).^(1-g)).*(z.^g);
figure(1)
plot(c,P)
title(sprintf('c-P'))
xlabel('Consumption (c)')
ylabel('Pollution (P)')
figure(2)
plot(c,x)
title(sprintf('C-x'))
xlabel('Consumption (c)')
ylabel('Recycling (x)')
figure(3)
plot(q,P)
title(sprintf('q-P'))
xlabel('Output (q)')
ylabel('Pollution (P)')
figure(4)
plot(q,x)
title(sprintf('q-x'))
xlabel('Output (q)')
ylabel('Recycling (x)')
3 reasons:
[t,Y] = ode45(@(t,Y) odefcn(t,A,Y,b,d,e,g,k,l,m,n,o,r,t,u,v,w) , tspan, y0);
% ^ ^ ^
% | | |
% -----> Change order ----> t already at first position
odefcn = matlabFunction(VF, 'Vars',{t,A,Y,b,d,e,g,k,l,m,n,o,r,u,v,w});
% ^ ^
% | |
% SAME HERE -----> Change order
  댓글 수: 3
Stephan
Stephan 2020년 12월 1일
Your system appears to be stiff. try to use ode15s or similar stiff solvers. Also you could try to use odeset and try to reduce tolerance values if this is possible for your case. Do you need to calculate the full time between 0 and 50? This could also help. It is a bit of experimenting.
Myrto Kasioumi
Myrto Kasioumi 2020년 12월 1일
Thank you that helped me a lot.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Ordinary Differential Equations에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by