# 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 thecoeff() 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