# pdeCoefficientsToDouble

Convert symbolic PDE coefficients to `double` format

Since R2021a

## Syntax

``coeffs = pdeCoefficientsToDouble(symCoeffs)``
``coeffs = pdeCoefficientsToDouble(symCoeffs,u)``

## Description

example

````coeffs = pdeCoefficientsToDouble(symCoeffs)` converts the symbolic objects of the structure `symCoeffs` to double-precision numbers or function handles. The output is a structure `coeffs` that can then be used to define the coefficients of a PDE model by calling `specifyCoefficients` in Partial Differential Equation Toolbox™. The structure `coeffs` contains the coefficients `m`, `d`, `c`, `a`, and `f` for the PDE system with the form $m\frac{{\partial }^{2}u}{\partial {t}^{2}}+d\frac{\partial u}{\partial t}-\nabla ·\left(c\otimes \nabla u\right)+au=f$that can be solved in Partial Differential Equation Toolbox. For more information, see Equations You Can Solve Using PDE Toolbox (Partial Differential Equation Toolbox).```

example

````coeffs = pdeCoefficientsToDouble(symCoeffs,u)` converts the symbolic objects of the structure `symCoeffs` to double-precision numbers or function handles for the coefficients of a PDE system with the dependent variables `u`.```

## Examples

collapse all

Create a symbolic PDE that represents the Laplacian of the variable `u(x,y)`.

```syms u(x,y) f pdeeq = laplacian(u,[x y]) == f```
```pdeeq(x, y) =  ```

Extract the coefficients of the PDE as symbolic expressions and display their values.

```symCoeffs = pdeCoefficients(pdeeq,u,'Symbolic',true); structfun(@disp,symCoeffs)```
`$0$`
`$0$`
`$\left(\begin{array}{cc}-1& 0\\ 0& -1\end{array}\right)$`
`$f$`
`$0$`

`pdeCoefficients` converts the symbolic PDE into a scalar PDE equation of the form

$m\frac{{\partial }^{2}u}{\partial {t}^{2}}+d\frac{\partial u}{\partial t}-\nabla \cdot \left(c\nabla u\right)+au=f$,

and extract the coefficients `a`, `c`, `m`, `d`, and `f` into the structure `symCoeffs`.

Choose a value for `f`. Since `symCoeffs` are symbolic objects, use `pdeCoefficientsToDouble` to convert the coefficients to `double` data type. The coefficients with `double` data type are valid inputs for the `specifyCoefficients` function in the PDE Toolbox.

```symCoeffs = subs(symCoeffs,f,-3); coeffs = pdeCoefficientsToDouble(symCoeffs)```
```coeffs = struct with fields: a: 0 c: [4x1 double] m: 0 d: 0 f: -3 ```

Solve a system of two second-order PDEs. You can solve the PDE system by extracting the PDE coefficients symbolically using `pdeCoefficients`, converting the coefficients to double-precision numbers using `pdeCoefficientsToDouble`, and specifying the coefficients in the PDE model using `specifyCoefficients`.

The system of PDEs represents the deflection of a clamped structural plate under a uniform pressure load. The system of PDEs with the dependent variables ${u}_{1}$ and ${u}_{2}$ is given by

$-{\nabla }^{2}{u}_{1}+{u}_{2}=0$,

$-D{\nabla }^{2}{u}_{2}=p$,

where $D$ is the bending stiffness of the plate given by

$D=\frac{E{h}^{3}}{12\left(1-{\nu }^{2}\right)}$,

and $E$ is the modulus of elasticity, $\nu$ is Poisson's ratio, $h$ is the plate thickness, ${u}_{1}$ is the transverse deflection of the plate, and $p$ is the pressure load.

Create a PDE model for the system of two equations.

`model = createpde(2);`

Create a square geometry. Specify the side length of the square. Then include the geometry in the PDE model.

```len = 10.0; gdm = [3 4 0 len len 0 0 0 len len]'; g = decsg(gdm,'S1',('S1')'); geometryFromEdges(model,g);```

Specify the values of the physical parameters of the system. Let the external pressure $p$ be a symbolic variable `pres` that can take any value.

```E = 1.0e6; h_thick = 0.1; nu = 0.3; D = E*h_thick^3/(12*(1 - nu^2)); syms pres```

Declare the PDE system as a system symbolic equations. Extract the coefficients of the PDE and return them in symbolic form.

```syms u1(x,y) u2(x,y) pdeeq = [-laplacian(u1) + u2; -D*laplacian(u2) - pres]; symCoeffs = pdeCoefficients(pdeeq,[u1 u2],'Symbolic',true)```
```symCoeffs = struct with fields: m: 0 a: [2x2 sym] c: [4x4 sym] f: [2x1 sym] d: 0 ```

Display the coefficients `m`, `a`, `c`, `f`, and `d`.

`structfun(@disp,symCoeffs)`
`$0$`
`$\left(\begin{array}{cc}0& 1\\ 0& 0\end{array}\right)$`
`$\left(\begin{array}{cccc}1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& \frac{25000}{273}& 0\\ 0& 0& 0& \frac{25000}{273}\end{array}\right)$`
`$\left(\begin{array}{c}0\\ \mathrm{pres}\end{array}\right)$`
`$0$`

Substitute a value for `pres` using the `subs` function. Since the outputs of `subs` are symbolic objects, use the `pdeCoefficientsToDouble` function to convert the coefficients to the `double` data type, which makes them valid inputs for the PDE Toolbox.

```symCoeffs = subs(symCoeffs,pres,2); coeffs = pdeCoefficientsToDouble(symCoeffs)```
```coeffs = struct with fields: a: [4x1 double] c: [16x1 double] m: 0 d: 0 f: [2x1 double] ```

Specify the PDE coefficients for the PDE model.

```specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);```

Specify spring stiffness. Specify boundary conditions by defining distributed springs on all four edges.

```k = 1e7; bOuter = applyBoundaryCondition(model,'neumann','Edge',(1:4), ... 'g',[0 0],'q',[0 0; k 0]);```

Specify the mesh size of the geometry and generate a mesh for the PDE model.

```hmax = len/20; generateMesh(model,'Hmax',hmax);```

Solve the model.

`res = solvepde(model);`

Access the solution at the nodal locations.

`u = res.NodalSolution;`

Plot the transverse deflection of the plate.

```numNodes = size(model.Mesh.Nodes,2); figure; pdeplot(model,'XYData',u(1:numNodes),'contour','on') title 'Transverse Deflection'``` Find the transverse deflection at the plate center.

`wMax = min(u(1:numNodes,1))`
```wMax = -0.2763 ```

Compare the result with the deflection at the plate center computed analytically.

```pres = 2; wMax = -.0138*pres*len^4/(E*h_thick^3)```
```wMax = -0.2760 ```

Since R2023a

Create a PDE system of four equations with four dependent variables, $\mathit{A}$, $\mathit{E}$, $\mathit{P}$, and $\mathit{T}$.

```syms A(x,y,z,t) E(x,y,z,t) P(x,y,z,t) T(x,y,z,t) eqn1 = diff(A,t) == -A*E*(-exp(T)); eqn2 = diff(P,t) == -P*E*(-exp(T)); eqn3 = diff(E,t) == -A*E*(-exp(T)) - P*E*(-exp(T)); eqn4 = diff(T,t) == laplacian(T,[x y z]) + A*E*(-exp(T)) + P*E*(-exp(T)); pdeeq = [eqn1; eqn2; eqn3; eqn4]```
```pdeeq(x, y, z, t) =  ```

Extract the coefficients of the PDE system as symbolic expressions. Specify the variable `u` to represent the dependent variables.

```u = [A E P T]; symCoeffs = pdeCoefficients(pdeeq,u,'Symbolic',true)```
```symCoeffs = struct with fields: m: [4x4 sym] a: [4x4 sym] c: [12x12 sym] f: [4x1 sym] d: [4x4 sym] ```

Display the coefficients `m`, `a`, `c`, `f`, and `d`.

`structfun(@disp,symCoeffs)`
`$\left(\begin{array}{cccc}0& 0& 0& 0\\ 0& 0& 0& 0\\ 0& 0& 0& 0\\ 0& 0& 0& 0\end{array}\right)$`

`$\left(\begin{array}{cccccccccccc}0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 1& 0& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 1& 0\\ 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 1\end{array}\right)$`
`$\left(\begin{array}{c}0\\ 0\\ 0\\ 0\end{array}\right)$`
`$\left(\begin{array}{cccc}1& 0& 0& 0\\ 0& 0& 1& 0\\ 0& 1& 0& 0\\ 0& 0& 0& 1\end{array}\right)$`

Convert the coefficients to the `double` data type so that they are valid inputs for the `specifyCoefficients` function in Partial Differential Equation Toolbox. Because the `a` coefficient in `symCoeffs` contains the dependent variables and is not constant, calling `pdeCoefficientsToDouble(symCoeffs)` without the second input argument can return an error. Instead, specify the second argument as the dependent variables `u` when using `pdeCoefficientsToDouble`.

`coeffs = pdeCoefficientsToDouble(symCoeffs,u)`
```coeffs = struct with fields: a: @makeCoefficient/coefficientFunction c: [144x1 double] m: 0 d: [16x1 double] f: 0 ```

## Input Arguments

collapse all

Coefficients of PDE in symbolic form, specified as a structure of symbolic expressions.

Since R2023a

Dependent variables of PDE, specified as a symbolic function. The argument `u` must contain stationary or time-dependent variables in two or three dimensions.

Example: `syms E(x,y,z,t) B(x,y,z,t); u = [E B];`

## Output Arguments

collapse all

Coefficients of PDE operating on doubles, returned as a structure of double-precision numbers and function handles as required by the `specifyCoefficients` function. The fields of the structure are `a`, `c`, `m`, `d`, and `f`. For details on interpreting the coefficients in the format required by Partial Differential Equation Toolbox, see:

When `pdeCoefficientsToDouble` returns a coefficient as a function handle, the function handle takes two structures as input arguments, `location` and `state`, and returns double-precision output. The function handle is displayed as `@makeCoefficient/coefficientFunction` in the Command Window. To display the formula of the function handle in `coeffs.f` in symbolic form, use `coeffs.f('show')`.

In some cases, not all generated coefficients can be used by `specifyCoefficients`. For example, the `d` coefficient must take a special matrix form when `m` is nonzero. For more details, see d Coefficient When m Is Nonzero (Partial Differential Equation Toolbox).

## Version History

Introduced in R2021a

expand all