Can I solve a system of nolinear parabolic PDE using PDE toolbox in MATLAB?

1 view (last 30 days)
I have a system of two parabolic PDEs with c coefficient of second equation as a function of solution of both first and second equation. I defined c coefficient as a function handle, but getting error: Function handle specifying a coefficient must accept two input arguments and return one output argument.
My function handle is: function c = ccofficient(region,state)
Dref = 2.592e-5; % reference humidity diffucion coefficient in m^2/day alpha = 0.05; % represents Dh,min/Dh,max n = 10; % characterises spread of the drop in Dh U = 25; % activation energy of moisture diffusion process in kJ/mol Tref = 23; % Reference temperature at which Dh,ref measured te = 28; % hydration period of concrete in days hc = 0.75; % value of pore relative humidity at which Dh drops halfway between Dh,max and Dh,min. R = -0.03056; % gas constant in Joule/(mol^oC) t = state.time; n1 = 2; nr = numel(region.x); c = zeros(n1,nr); c(1,:) = k*ones(1,n1); c(2,:) = Dref*(alpha+(1-alpha)+(1+((1-state.u(:,2,t))/(1-hc)).^n))*exp(U/R*(1/Tref-1/(state.u(:,1,t))))... *0.3+(13/te).^0.5;
Kindly suggest me how to write function handle for this type of nonlinear parabolic system of PDE.
  3 Comments
Aditi
Aditi on 14 Apr 2017
function cmatrix = ccoeffunction(region,state)
Dref = 2.592e-5; % reference humidity diffucion coefficient in m^2/day
alpha = 0.05; % represents Dh,min/Dh,max
n = 10; % characterises spread of the drop in Dh
U = 25; % activation energy of moisture diffusion process in kJ/mol
Bh = 0.02592; % Surface humidity transfer coefficient
Tref = 23; % Reference temperature at which Dh,ref measured
te = 28; % hydration period of concrete in days
hc = 0.75; % value of pore relative humidity at which Dh drops halfway between Dh,max and Dh,min.
R = -0.03056; % gas constant in Joule/(mol^oC)
n1 = 2;
nr = numel(region.x);
cmatrix = zeros(n1,nr);
cmatrix(1,:) = k*ones(1,nr);
cmatrix(2,:) = Dref*(alpha+(1-alpha)+(1+((1-state.u(:,2))/(1-hc)).^n))*exp(U/R*(1/Tref-1/(state.u(:,1))))...
*0.3+(13/te).^0.5;
This is my code for the function handle to define coefficient c. I have rectified the initial code by eliminating t = state.time. and now getting error in line nr = numel(region.x).
Aditi
Aditi on 15 Apr 2017
function cmatrix = ccoeffunction(region,state)
n1 = 9;
nr = numel(region.x);
cmatrix = zeros(n1,nr);
cmatrix(1,:) = ones(1,nr);
cmatrix(2,:) = 2*ones(1,nr);
cmatrix(3,:) = 8*ones(1,nr);
cmatrix(4,:) = 1+region.x.^2 + region.y.^2;
cmatrix(5,:) = state.u(2,:)./(1 + state.u(1,:).^2 + state.u(3,:).^2);
cmatrix(6,:) = cmatrix(4,:);
cmatrix(7,:) = 5*region.subdomain;
cmatrix(8,:) = -ones(1,nr);
cmatrix(9,:) = cmatrix(7,:);
I created a function for c coefficient using the above example given in MATLAB documentation.
My problem is a system of parabolic equations. I want to make sure that parabolic non linear system of PDE can be solved using PDE toolbox in MATLAB.
However when I write the state.u as mentioned above error shows up:
Function handle specifying a coefficient must accept two input arguments and return one output argument.

Sign in to comment.

Accepted Answer

Ravi Kumar
Ravi Kumar on 14 Apr 2017
Hi Aditi,
This error generally indicates that the function for c, ccoefficient, did not return a output value. This could be due to a syntax error in the function. You can insert a breakpoint in the function and step through the code to identify the line containing error.
Regards,
Ravi
  4 Comments
Aditi
Aditi on 15 Apr 2017
>> ccoeffunction
Not enough input arguments.
Error in ccoeffunction (line 32)
nr = numel(region.subdomain);
Aditi
Aditi on 15 Apr 2017
cmatrix(2,:) = Dref*(alpha+(1-alpha)+(1+((1-state.u(:,2))/(1-hc)).^n))*exp(U/R*(1/Tref-1/(state.u(:,1))))...
*0.3+(13/te).^0.5;
I was able to resolve the error as mentioned in my previous comment
nr = numel(region.subdomain);
Kindly guide me how to write the state.u in cmatrix(2,:) above, as I am still getting error
Error using pde.CoefficientAssignment/checkCoefFcnHdlArgCounts (line 531) Function handle specifying a coefficient must accept two input arguments and return one output argument.
Error in pde.CoefficientAssignment/checkFcnHdlArgCounts (line 267) self.checkCoefFcnHdlArgCounts(self.c, systemsize, ndims);
Error in pde.CoefficientAssignment (line 105) obj.checkFcnHdlArgCounts(systemsize, numdims);
Error in pde.PDEModel/specifyCoefficients (line 121) coef = pde.CoefficientAssignment(coefcont,argsToPass{:});
Error in combinedll (line 48) specifyCoefficients(pdem,'m',0,'c',@ccoeffunction,'a',0,'f',f,'d',d);
Note here, my result u is time varying, and I am solving two PDEs.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!