Skip to content

Commit d576221

Browse files
committed
implement derivative for chebyshevT
1 parent 2a148b6 commit d576221

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

src/polynomials/ChebyshevT.jl

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,28 @@ function integral(p::ChebyshevT{T}, k::S) where {T,S <: Number}
107107
return ChebyshevT(a2, p.var)
108108
end
109109

110-
# function derivative(p::ChebyshevT{T}, order::Integer) where {T}
111-
# order < 0 && error("Order of derivative must be non-negative")
112-
# order == 0 && return p
113-
# hasnan(p) && return ChebyshevT(T[NaN], p.var)
114-
# order > length(p) && return zero(ChebyshevT{T})
115-
116-
# n = length(p)
117-
# a2 = Vector{T}(undef, n - order)
118-
# @inbounds for i in order:n - 1
119-
# a2[i - order + 1] = reduce(*, (i - order + 1):i, init = p[i])
120-
# end
121-
# return ChebyshevT(a2, p.var)
122-
# end
110+
function derivative(p::ChebyshevT{T}, order::Integer) where {T}
111+
order < 0 && error("Order of derivative must be non-negative")
112+
order == 0 && return p
113+
hasnan(p) && return ChebyshevT(T[NaN], p.var)
114+
order > length(p) && return zero(ChebyshevT{T})
115+
116+
n = length(p)
117+
der = Vector{T}(undef, n)
118+
for i in 1:order
119+
n -= 1
120+
resize!(der, n)
121+
for j in n:-1:2
122+
der[j] = 2j * p[j]
123+
p[j - 2] += j * p[j] / (j - 2)
124+
end
125+
if n > 1
126+
der[2] = 4p[2]
127+
end
128+
der[1] = p[1]
129+
end
130+
return ChebyshevT(der, p.var)
131+
end
123132

124133
##
125134
function companion(p::ChebyshevT{T}) where T

test/ChebyshevT.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ end
151151
cint = integral(cheb, i)
152152
res = convert(Polynomial, cint)
153153
@test res target
154+
@test derivative(cint) == cheb
154155
end
155156
end
156157

0 commit comments

Comments
 (0)