Hi,
I tried creating a polynomial ratio:
using Polynomials
julia> a=Rational{Poly}(Poly([1,2]),Poly([3]))
, but got the following error:
ERROR: TypeError: Rational: in T, expected T<:Integer, got Type{Polynomials.Poly{T<:Number}}
It seems that the JuliaDSP group has crated a workaround, called the PolynomialRatio
:
DSP.Filters.PolynomialRatio{T<:Number}
Would it not be preferable to instead find a way to support Poly
directly from Rational
, given that polynomial ratios are not an uncommon occurance?
Since Rational{T} <: Number
, I’m not sure Rational{Poly}
makes sense…it’s probably better to make your own type that replicates the behaviour of Rational
The built in Rational{T}
type is designed for integer T
. Designing a type to represent rational functions (ratios of polynomials) would seem to have very little code in common with this except for a few trivial methods, so I’m not sure how much you could gain by making the built-in type more abstract—you would end up having to redefine most of the methods anyway.
(Making the built-in type more abstract is technically difficult because Julia does not have multiple inheritance. You might want to define an AbstractRational{T}
type that allows T
to be anything and defines a few simple methods, and then define Rational{T<:Integer} <: AbstractRational{T}, Number
, but Julia doesn’t allow that. So you can only make Rational
more abstract at the price of it not being a subtype of Number
, and that is too high a price to pay for sharing a trivial amount of code.)
1 Like
There is https://github.com/aytekinar/RationalFunctions.jl
That may be of help for the task at hand.
2 Likes
Well, Rational{Poly}
is sort of a number… it just has an unknown in there.
In all seriousness:
I see what you and Steven are saying. I was not thinking that Rational
was a <: Number
.
@j_verzani: I see that you also created your own “rational” object: RationalFunction
to get your module working.
Maybe we could just define the //(Poly, Poly)
operator to help construct the DSP module’s PolynomialRatio
in order to keep things easier to read… or maybe even have it added directly to the Polynomials module.
I noticed @j_verzani uses /(Poly, Poly)
to construct his polynomials, but I feel like the //(Poly, Poly)
operator is more consistent with Julia’s current implementation.
The RationalFunctions.jl package is the contribution of @aytekinar. At first, I thought //
was a better choice, but the focus of that package seems more for polys over Float64 or Complex{Float64}, so it seems to me now that /
is the better choice.