# SymPy.jl

When functions are linear in parameters, we can decompose a matrix of polynomials into a matrix of coefficients and a matrix of variables. To achieve this, we can use the `SymPy`

package.

First we need to ensure that Julia recognizes variables and treats them as symbols.

```
using SymPy
x, y = symbols("x, y")
```

Then we can simply invoke the`coeff()`

method to extract coefficients from the polynomials.

```
p = x + 0.5*y + 1
p.coeff(x)
p.coeff(y)
```

Output:

```
1
0.500000000000000
```

Next, suppose we have matrix of polynomials, \(P(x;\theta)\) denoted by `Pm`

below in Julia. Note that each element of `Pm`

is linear in the parameters. Thus, we can represent `Pm`

as the multiplication of a matrix of coefficients, \(C(\theta)\) denoted by `C`

in Julia, and a vector of variables \( \mathbf{x}\), `[x,y]`

.

$$ P(x;\theta) = C(\theta) \cdot \mathbf{x} $$

```
Pm= [2*x+ 3*y; 1*x+5*y]
# number of polynomials, M
M=length(Pm)
# number of variables, L
L=2
# create C, coefficient matrix
C=zeros(L, M)
for i in 1:M
C[i, 1]=p[i].coeff(x)
C[i, 2]=p[i].coeff(y)
end
C
```

Output:

```
2×2 Matrix{Float64}:
2.0 3.0
1.0 5.0
```

Notice that multiplying `C`

by `[x, y]`

is equivalent to `Pm`

.

```
C*[x, y]
```

Output:

```
2-element Vector{Sym}:
2.0⋅x + 3.0⋅y
1.0⋅x + 5.0⋅y
```