How to determine the coefficients of a polynom

How can I determine the coefficients of a polynom?

using Symbolics

@variables R a b c d U J Q s

input = 2s + 4U*a*s^2 + Q*(J+s)

function split_s(input::Num)

res = split_s(input)

# expected output:
# the factors of s², of s and without s
# [4U*a, 2+Q, Q*J]

here maybe you’ll find some ideas for your problem

1 Like
split_s(input::Num, v::Num) = 
  vcat([Symbolics.coeff(input, v^i) for i in, v):-1:1],
  substitute(input, v => 0))


julia> split_s(input,s)
 2 + Q
1 Like

Perfect! Thank you very much.

My code now:

function split_s(input)
    inp = simplify(input, expand=true)
    vcat([Num(Symbolics.coeff(inp, s^i)) for i in, s):-1:1],
    substitute(inp, s => 0))

two questions:
what is the need to have Num() wrapped on Symbolics.coeff(inp, s^i)?
why doesn’t Symbolics.coeff(inp, s^0) give what you would expect?

You are right, this was done quite hastily. I’ll remove it from the answer. TBH not really an expert on Symbolics.jl, just fiddled around. Oops… my code doesn’t actually have this. Was confused by reply to me. Tagging @ufechner7

If I do not wrap this I get an vector of any, and if I then try to create a transfer function with tf(num, den) it fails.

julia> include("mwes/mwe20.jl")
4-element Vector{Any}:
  2 + Q + J*Q

julia> input
2s + (s + J*s)*Q + 4U*a*(s^3)

It seems like someone has already thought of this feature.
The biggest difficulty is understanding that the second argument must be a tuple.

julia> polynomial_coeffs(input, s)
ERROR: MethodError: no method matching iterate(::SymbolicUtils.BasicSymbolic{Real})

julia> polynomial_coeffs(input, (s,))
(Dict{Any, Any}(s^2 => 4U*a, s => 2 + Q, 1 => J*Q), 0)

help?> polynomial_coeffs
search: polynomial_coeffs

  polynomial_coeffs(expr, vars)

  Find coefficients of a polynomial in vars.

  Returns a tuple of two elements:

    1. A dictionary of coefficients keyed by
       monomials in vars

    2. A residual expression which is the
       constant term
1 Like