ApproxFun.jl icon indicating copy to clipboard operation
ApproxFun.jl copied to clipboard

Julia is crashing when computing f1+f2, where f1 and f2 have different periods

Open andreasvarga opened this issue 2 years ago • 0 comments

f(t) = sin(2*t) is a periodic function with period π but it is equally a periodic function of period , for any integer k. I was courious if this is figured out somehow by the software, but I succeeded to crash Julia or obtain StackOverflow error as shown below:

julia> s1 = Fourier(0..pi)
Fourier(【0.0,3.141592653589793❫)

julia> s2 = Fourier(0..2pi)
Fourier(【0.0,6.283185307179586❫)

julia> f1 = Fun(t-> sin(2*t),s1)
Fun(Fourier(【0.0,3.141592653589793❫),[-2.754298361189885e-18, 1.0])

julia> f2 = Fun(t-> sin(2*t),s2)
Fun(Fourier(【0.0,6.283185307179586❫),[-4.020306624191591e-17, -2.6593986539776536e-17, -1.0473104888558003e-16, 1.0000000000000002]) 
julia> f1+f1
Fun(Fourier(【0.0,3.141592653589793❫),[-5.50859672237977e-18, 2.0])

julia> f2+f2
Fun(Fourier(【0.0,6.283185307179586❫),[-8.040613248383182e-17, -5.318797307955307e-17, -2.0946209777116006e-16, 2.0000000000000004])  

julia> f1+f2
ERROR: StackOverflowError:
Stacktrace:
 [1] map(f::ApproxFunBase.var"#288#289"{PeriodicSegment{Float64}}, v::Core.SimpleVector)
   @ Base .\essentials.jl:622
 [2] ApproxFunBase.SumSpace{Tuple{CosSpace{PeriodicSegment{Float64}, Float64}, SinSpace{PeriodicSegment{Float64}, Float64}}, PeriodicSegment{Float64}, Float64}(dom::PeriodicSegment{Float64})
   @ ApproxFunBase C:\Users\Andreas\.julia\packages\ApproxFunBase\fvVRN\src\Spaces\SumSpace.jl:45
 [3] SumSpace
   @ C:\Users\Andreas\.julia\packages\ApproxFunFourier\tbptw\src\ApproxFunFourier.jl:405 [inlined]
 [4] canonicalspace
   @ C:\Users\Andreas\.julia\packages\ApproxFunFourier\tbptw\src\ApproxFunFourier.jl:97 [inlined]
 [5] map
   @ .\tuple.jl:222 [inlined]
 [6] union_rule(S1sp::ApproxFunBase.SumSpace{Tuple{CosSpace{PeriodicSegment{Float64}, Float64}, SinSpace{PeriodicSegment{Float64}, Float64}}, PeriodicSegment{Float64}, Float64}, S2sp::ApproxFunBase.SumSpace{Tuple{CosSpace{PeriodicSegment{Float64}, Float64}, SinSpace{PeriodicSegment{Float64}, Float64}}, PeriodicSegment{Float64}, Float64})
   @ ApproxFunBase C:\Users\Andreas\.julia\packages\ApproxFunBase\fvVRN\src\Spaces\ProductSpaceOperators.jl:186
 [7] union_by_union_rule(a::ApproxFunBase.SumSpace{Tuple{CosSpace{PeriodicSegment{Float64}, Float64}, SinSpace{PeriodicSegment{Float64}, Float64}}, PeriodicSegment{Float64}, Float64}, b::ApproxFunBase.SumSpace{Tuple{CosSpace{PeriodicSegment{Float64}, Float64}, SinSpace{PeriodicSegment{Float64}, Float64}}, PeriodicSegment{Float64}, Float64})
   @ ApproxFunBase C:\Users\Andreas\.julia\packages\ApproxFunBase\fvVRN\src\Space.jl:266
 [8] union(a::CosSpace{PeriodicSegment{Float64}, Float64}, b::CosSpace{PeriodicSegment{Float64}, Float64})
   @ ApproxFunBase C:\Users\Andreas\.julia\packages\ApproxFunBase\fvVRN\src\Space.jl:279

I wonder if it would be usefull to automatically adjust the period in such operations.

julia> versioninfo() Julia Version 1.7.1 Commit ac5cc99908 (2021-12-22 19:35 UTC) Platform Info: OS: Windows (x86_64-w64-mingw32) CPU: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz WORD_SIZE: 64 LIBM: libopenlibm LLVM: libLLVM-12.0.1 (ORCJIT, skylake)

ApproxFun v0.13.1

andreasvarga avatar Apr 05 '22 12:04 andreasvarga