Skip to content

Commit 2a148b6

Browse files
committed
implment chebyshevT integral
1 parent 04dc78d commit 2a148b6

File tree

2 files changed

+38
-14
lines changed

2 files changed

+38
-14
lines changed

src/polynomials/ChebyshevT.jl

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,26 @@ function vander(P::Type{<:ChebyshevT}, x::AbstractVector{T}, n::Integer) where {
8686
return A
8787
end
8888

89-
##
90-
# function integral(p::ChebyshevT{T}, k::S) where {T,S <: Number}
91-
# R = promote_type(eltype(one(T) / 1), S)
92-
# if hasnan(p) || isnan(k)
93-
# return ChebyshevT([NaN])
94-
# end
95-
# n = length(p)
96-
# a2 = Vector{R}(undef, n + 1)
97-
# a2[1] = k
98-
# @inbounds for i in 1:n
99-
# a2[i + 1] = p[i - 1] / i
100-
# end
101-
# return ChebyshevT(a2, p.var)
102-
# end
89+
function integral(p::ChebyshevT{T}, k::S) where {T,S <: Number}
90+
R = promote_type(eltype(one(T) / 1), S)
91+
if hasnan(p) || isnan(k)
92+
return ChebyshevT([NaN])
93+
end
94+
n = length(p)
95+
if n == 1
96+
return ChebyshevT{R}([k, p[0]])
97+
end
98+
a2 = Vector{R}(undef, n + 1)
99+
a2[1] = zero(R)
100+
a2[2] = p[0]
101+
a2[3] = p[1] / 4
102+
@inbounds for i in 2:n - 1
103+
a2[i + 2] = p[i] / (2 * (i + 1))
104+
a2[i] -= p[i] / (2 * (i - 1))
105+
end
106+
a2[1] += R(k) - ChebyshevT(a2)(0)
107+
return ChebyshevT(a2, p.var)
108+
end
103109

104110
# function derivative(p::ChebyshevT{T}, order::Integer) where {T}
105111
# order < 0 && error("Order of derivative must be non-negative")

test/ChebyshevT.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,24 @@ end
136136
@test gcd(c1, c2) ChebyshevT(6)
137137
end
138138

139+
@testset "integrals derivatives" begin
140+
c1 = one(ChebyshevT{Int})
141+
@test integral(c1) == ChebyshevT([0, 1])
142+
for k in [-3, 0, 2]
143+
@test integral(c1, k) == ChebyshevT([k, 1])
144+
end
145+
146+
for i in 0:4
147+
scl = i + 1
148+
p = Polynomial(push!(zeros(i), 1))
149+
target = Polynomial(push!(append!(Float64[i], zeros(i)), 1 / scl))
150+
cheb = convert(ChebyshevT, p)
151+
cint = integral(cheb, i)
152+
res = convert(Polynomial, cint)
153+
@test res target
154+
end
155+
end
156+
139157
@testset "z-series" for i in 0:5
140158
# c to z
141159
input = append!([2], ones(i))

0 commit comments

Comments
 (0)