specifyCoefficients
This section describes how to write the m, d, or a coefficients in the system of equations
or in the eigenvalue system
The topic applies to the recommended workflow for including
coefficients in your model using specifyCoefficients
.
If there are N equations in the system, then these coefficients represent N-by-N matrices.
For constant (numeric) coefficient matrices, represent each
coefficient using a column vector with N2 components.
This column vector represents, for example, m(:)
.
For nonconstant coefficient matrices, see Nonconstant m, d, or a.
Note
The d
coefficient takes a special matrix
form when m
is nonzero. See d Coefficient When m is Nonzero.
Sometimes, your m, d, or a matrices are diagonal or symmetric. In these cases, you can represent m, d, or a using a smaller vector than one with N2 components. The following sections give the possibilities.
The software interprets a scalar m, d, or a as a diagonal matrix.
The software interprets an N-element column vector m, d, or a as a diagonal matrix.
The software interprets an N(N+1)/2-element column vector m, d, or a as a symmetric matrix. In the following diagram, • means the entry is symmetric.
Coefficient a(i,j)
is in row (j(j–1)/2+i)
of the vector a
.
The software interprets an N2-element column vector m, d, or a as a matrix.
Coefficient a(i,j)
is in row (N(j–1)+i)
of the vector a
.
Note
If both m and d are nonzero, then d must be a constant scalar or vector, not a function.
If any of the m, d, or a coefficients is not constant, represent it as a function of the form
dcoeffunction(location,state)
solvepde
or solvepdeeig
pass the
location
and state
structures to
dcoeffunction
. The function must return a matrix of size
N1-by-Nr, where:
N1 is the length of the vector representing the coefficient. There are several possible values of N1, detailed in Short m, d, or a vectors. 1 ≤ N1 ≤ N2.
Nr is the number of points in the location that the solver
passes. Nr is equal to the length of the
location.x
or any other location
field. The function should evaluate m,
d, or a at
these points.
Pass the coefficient to specifyCoefficients
as
a function handle, such as
specifyCoefficients(model,'d',@dcoeffunction,...)
location
is a structure with these fields:
location.x
location.y
location.z
location.subdomain
The fields x
, y
, and
z
represent the x-,
y-, and z- coordinates of points for
which your function calculates coefficient values. The
subdomain
field represents the subdomain numbers, which
currently apply only to 2-D models. The location fields are row vectors.
state
is a structure with these
fields:
state.u
state.ux
state.uy
state.uz
state.time
The state.u
field represents the current value of the solution
u. The state.ux
,
state.uy
, and state.uz
fields are
estimates of the solution’s partial derivatives
(∂u/∂x,
∂u/∂y, and
∂u/∂z) at the corresponding points of
the location structure. The solution and gradient estimates are
N-by-Nr matrices. The
state.time
field is a scalar representing time for
time-dependent models.
For example, suppose N =
3, and you have 2-D geometry. Suppose your d
matrix
is of the form
where s1(x,y) is 5 in subdomain 1, and is 10 in subdomain 2.
This d
is a symmetric matrix. So it is natural
to represent d
as a N(N+1)/2-Element Column Vector m, d, or a:
For that form, the following function is appropriate.
function dmatrix = dcoeffunction(location,state)
n1 = 6;
nr = numel(location.x);
dmatrix = zeros(n1,nr);
dmatrix(1,:) = ones(1,nr);
dmatrix(2,:) = 5*location.subdomain;
dmatrix(3,:) = 4*ones(1,nr);
dmatrix(4,:) = sqrt(location.x.^2 + location.y.^2);
dmatrix(5,:) = -ones(1,nr);
dmatrix(6,:) = 9*ones(1,nr);
To include this function as your d
coefficient,
pass the function handle @dcoeffunction
:
specifyCoefficients(model,'d',@dcoeffunction,...