Hello
I have a problem when trying solve this system of ODEs. I have tried both with the ode45 solver and by constructing a RK4 for loop as well. Both codes results in NaN answers.. I have checked the equations etc. a number of times but can't seem to find the issue. I would if you could help to see if I have missed something? Below is seen the system of two ODEs that I'm trying to solve along with the input and ICs. The system is to be solved simultaneously for R(t) and Pg(t).
Code 1 with ode solver(function file and script file):
%Function file
function diffeqs=ode_sys(t,var)R=var(1); %dependent variable 1
Pg=var(2); %dependent variable 2
Pg0 = 5.6*10^6; %Saturation pressure(Pa)
Pa = 1.013*10^5; %Ambient pressure(Pa)
Sigma = 0.045; %Surface tension(kg/s^2)
Rho = 80; %Density (kg/m^3)
Eta = 1.5*10^2; %Viscosity(Pa*s)
MCO2 = 0.044; %Molarmass (kg/mol)
D = 6.317e-10; %Diffusion coefficient(m^2/s)
KH = 1.839e-5; %Henry's konstant
T = 373.15; %Temperature(K)
Rmin = 2*Sigma/(Pg0-Pa); %Minimum radius
R0 = 1.8e-8; %R0
a = 7.99e-3; %kg^2/s*m^4
%dR/dt
diffeqs(1,1) = R*((Pg-Pa-2*Sigma/R)/4*Eta);%dPg/dt
diffeqs(2,1) = a*((Pg0-Pg)^2/(Pg*R^3-Pg0*R0^3))-3*Pg*(diffeqs(1,1)/R); end%Script file
dt=0.01;trange=0:dt:300;ICs=[1.8e-8,5.6*10^6]; %I.C
[tsol,varsol]=ode45(@ode_sys,trange,ICs);figureplot(tsol,varsol(:,1)*1e9); %plot af R
title('Radius vs t')xlabel('t(s)')xlim([0 300])ylim([0 10000])ylabel('radius(nm)')figureplot(tsol,varsol(:,2)); %plot af Pg
title('Pg vs t')xlabel('t(s)')xlim([0 300])ylabel('Pg(Pa)')
Alternative method with RK4 approach:
Pg0 = 5.6*10^6; %Pressure saturation(Pa)
Pa = 1.013*10^5; %TAmbient pressure(Pa)
Sigma = 0.045; %Surface tension(kg/s^2)Rho = 1120; %Density(kg/m^3)
Eta = 1.5*10^2; %Viskosity(Pa*s)
MCO2 = 0.044; %M of CO2 (kg/mol)
D = 6.317e-10; %Diffusion constant(m^2/s)
KH = 1.839e-5; %Henry's konstantT = 373.15; %Temperature(K)Rmin = 2*Sigma/(Pg0-Pa); %Minimum radius (m)
R0 = Rmin*1.1; %R0 (m)
a = 7.99e-3; %kg^2/s*m^4 (se mathcad)
%Function handle for R
fR=@(t,R,Pg) R*((Pg-Pa-2*Sigma/R)/4*Eta);%Function handle for Pg
fPg=@(t,R,Pg) a*((Pg0-Pg)^2/(Pg*R^3-Pg0*R0^3))-3*Pg*(R*((Pg-Pa-2*Sigma/R)/(4*Eta))/R); %I.Ct(1) = 0;R(1) = R0;Pg(1) = Pg0;dt=0.1;tfinal = 300;N=ceil(tfinal/dt);%Update loop
for i=1:N %Update time
t(i+1)=t(i)+dt; %Update R og Pg
k1R = fR(t(i), R(i), Pg(i)); k1Pg = fPg(t(i), R(i), Pg(i)); k2R = fR(t(i)+dt/2, R(i)+dt/2*k1R, Pg(i)+dt/2*k1Pg); k2Pg = fPg(t(i)+dt/2, R(i)+dt/2*k1R, Pg(i)+dt/2*k1Pg); k3R = fR(t(i)+dt/2, R(i)+dt/2*k2R, Pg(i)+dt/2*k2Pg); k3Pg = fPg(t(i)+dt/2, R(i)+dt/2*k2R, Pg(i)+dt/2*k2Pg); k4R = fR(t(i)+dt, R(i)+dt*k3R, Pg(i)+dt*k3Pg); k4Pg = fPg(t(i)+dt, R(i)+dt*k3R, Pg(i)+dt*k3Pg); R(i+1) = R(i) + dt/6*(k1R + 2*k2R + 2*k3R + k4R); Pg(i+1) = Pg(i) + dt/6*(k1Pg + 2*k2Pg + 2*k3Pg + k4Pg);end
Regards
Kaare
Best Answer