PDE toolbox: Undefined function 'mtimes' for input arguments of type 'function_handle'.

6 Ansichten (letzte 30 Tage)
Hi everyone,
I have a bit of a hard time finding a way to use the output of my function handle:
effStress = @(~,state) (2700*9.81*4000*1e-6)-state.u;
K = 1e-12-(0.04343*((0.012+0.013)/2));
Dcore=(K*effStress);
I understand that I apparently cannot multiply K with effStress, but even a matrix multiplication doesnt work.
Could anyone help me on that?
Cheers, Flo
  2 Kommentare
Dennis
Dennis am 2 Okt. 2018
You probably need to provide an input to effStress. Small example:
eff=@(a) a+1; %eff is a function handle
%A=3*eff; %this does not work
A=3*eff(3) %this does.
Flo brd
Flo brd am 2 Okt. 2018
I did try something similar. It didn't work. My issue is that I am working with the PDE toolbox. I am trying to apply a non-constant variable (with the C coefficient if that helps)

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Stephen23
Stephen23 am 2 Okt. 2018
Bearbeitet: Stephen23 am 2 Okt. 2018
A function handle is not a numeric array, it cannot be multiplied. You could either
1. evaluate the function to get a numeric value, and multiply that value:
>> S.u = 4;
>> effStress = @(~,state) (2700*9.81*4000*1e-6)-state.u;
>> K = 1e-12-(0.04343*((0.012+0.013)/2));
>> K*effStress(0,S) % evaluate effStress to get an output.
ans = -0.055345
2. define a new function that calls your function:
>> fun = @(s)K*effStress(0,s); % does not evaluate effStress.
>> fun(S)
ans = -0.055345
  5 Kommentare
Flo brd
Flo brd am 3 Okt. 2018
Bearbeitet: Flo brd am 3 Okt. 2018
Sorry for the lack of data I was able to provide in the first place. So as said earlier, I am working with the PDE toolbox. I am trying solve for the equation of fick, and that works well I guess. Now I need to update a non-constant variable as the PDE solver solves the partial differential equation.
Here is the code we are interested in
N=1;
model = createpde(N);
%define boxes et generate mesh
height = 10;
length = 30;
r1 = [3 4 0 10 10 0 0 0 height height];
r2 = [3 4 10 20 20 10 0 0 height height];
r3 = [3 4 20 length length 20 0 0 height height];
gdm = [r1; r2;r3]';
g = decsg(gdm,'R1+R2+R3',['R1'; 'R2'; 'R3']');
geometryFromEdges(model,g);
msh =generateMesh(model,'Hmax',2);
nodes = msh.Nodes;
%set id to nodes
nodes(3,:)= linspace(1,size(nodes,2),size(nodes,2));
% BC
applyBoundaryCondition(model,'dirichlet','edge',[7,8,9,4,5,6],'h',0);
applyBoundaryCondition(model,'dirichlet','edge',[3,10,1,2],'h',1);
%specify coefficients for the equation described in the PDE
a =0;
f = 0;
d = 1;
Dcore= @(location, state) Diffusivity(location, state, 1e-16,6000, 2700, 200);
specifyCoefficients(model,'m',0,'d',d,'c',Dcore,'a',a,'f',f, 'face',1);
Followed by the Diffusivity function:
function Dh = Diffusivity(location,state,ki,depth,density,T)
N = 1; % Number of equations
nr = length(location.x); % Number of columns
Eff = zeros(N,nr); % Allocate to avoid size issue
confiningStress = density*9.81*depth;
effStress= (confiningStress*1e-6) - state.u;
tmp = effStress .*Eff;
Cp = 0.000000001;
T = T+273.15;
A=2.414*10^-5;
B=247.8;
C=140;
%temperature dependent viscosity
u = A*10^(B/(T-C));
%pressure dependent k
gamma = 0.1;
K=ki-(0.2*gamma.*tmp);
Dh = K./(u*Cp);
end
that compiles, but I am really unsure I've understood the way the c coefficient works https://uk.mathworks.com/help/pde/ug/c-coefficient-for-systems-for-specifycoefficients.html#bu5xabm-1
In my understanding, state.u represents the state of the equation u at a certain point of the solving process. As my function depends on a value u, I am trying to get that value through state.u to update Dcore accordingly.
Am I right in my understanding of function handle?
I've tried using those threads as a base reflection:
Cheers, Flo
Flo brd
Flo brd am 3 Okt. 2018
I changed a bit my function, following what I've understood from the matlab help (and I am pretty my understanding is wrong), and my error changed to a warning. it doesn't compile but maybe you help me on that one too. here is my function:
function Dh = Diffusivity(location,state,ki, depth,density, T)
N = 1; % Number of equations
nr = numel(location.x); % Number of columns
Dh = zeros(N,nr); % Allocate to avoid size issue
% Eff(1,:) = ones(1,nr);
confiningStress = density*9.81*depth*1e-6;
matConf = zeros(1,nr);
matConf(1,:)=confiningStress;
Cp = 0.000000001;
T = T+273.15;
A=2.414*10^-5;
B=247.8;
C=140;
%temperature dependent viscosity
u = A*10^(B/(T-C));
%pressure dependent k
gamma =0.1
Dh(1,:)=(ki-(0.2*gamma.*(matConf(1,:) - state.u(1,:))))./(u*Cp);
end
the error is now
Warning: Failure at t=1.132789e-12. Unable to meet integration tolerances without reducing the step size below the smallest value allowed (3.231174e-27) at time t.
I am completely lost.
Flo

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by