ApproxFun.jl
ApproxFun.jl copied to clipboard
InexactError in Multivariate Fun definition
I'm trying to create a multivariate function with complex Laurent polynomials, but
Fun((x,y)->x*cos(y),Chebyshev()⊗Laurent())
yields
InexactError: Float64(0.5 + 6.123233995736765e-17im)
Stacktrace:
[1] Type at ./complex.jl:37 [inlined]
[2] convert at ./number.jl:7 [inlined]
[3] setindex! at ./array.jl:769 [inlined]
[4] macro expansion at ./multidimensional.jl:701 [inlined]
[5] macro expansion at ./cartesian.jl:64 [inlined]
[6] macro expansion at ./multidimensional.jl:696 [inlined]
[7] _unsafe_setindex!(::IndexLinear, ::Array{Float64,2}, ::Array{Complex{Float64},1}, ::Int64, ::Base.Slice{Base.OneTo{Int64}}) at ./multidimensional.jl:689
[8] _setindex! at ./multidimensional.jl:684 [inlined]
[9] setindex! at ./abstractarray.jl:1020 [inlined]
[10] *(::ApproxFun.TransformPlan{Tuple{AbstractFFTs.Plan{Float64},Int64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}},true,Tuple{Tuple{FastTransforms.ChebyshevTransformPlan{Float64,1,false,FastTransforms.ChebyshevTransformPlan{Float64,1,true,FFTW.r2rFFTWPlan{Float64,(5,),true,1}}},Int64},Tuple{ApproxFun.TransformPlan{Float64,ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},true,FFTW.cFFTWPlan{Complex{Float64},-1,true,1}}}},Int64}}}, ::Array{Float64,2}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:339
[11] * at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:347 [inlined]
[12] *(::ApproxFun.TransformPlan{Tuple{AbstractFFTs.Plan{Float64},Int64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}},false,Tuple{Tuple{FastTransforms.ChebyshevTransformPlan{Float64,1,false,FastTransforms.ChebyshevTransformPlan{Float64,1,true,FFTW.r2rFFTWPlan{Float64,(5,),true,1}}},Int64},Tuple{ApproxFun.TransformPlan{Float64,ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},true,FFTW.cFFTWPlan{Complex{Float64},-1,true,1}}}},Int64}}}, ::Array{Float64,1}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:352
[13] transform(::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Array{Float64,1}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/Space.jl:426
[14] default_Fun(::Type{Float64}, ::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Array{StaticArrays.SArray{Tuple{2},Float64,1,2},1}, ::Type{Val{false}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:47
[15] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Int64, ::Type{Val{false}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:60
[16] default_Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Int64) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:75
[17] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:124
[18] Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:180
[19] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:103
[20] Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:180
[21] top-level scope at In[260]:1```
Okay, I just found out it is fixed if a complex return type for the function is defined:
f(x::Float64,y::Float64)::ComplexF64 = x*cos(y)
Fun(f,Chebyshev() ⊗ Laurent())
works! Still it would be nice if this works without return-types!?
Yes it’s definitely a bug.
I also encounter similar issue but cannot resolve it yet.
f = Fun(Chebyshev()^2,[1,2,3,0,4,0]); f(0.5,0.4)
yields:
ERROR: InexactError: Int64(2.5) Stacktrace: [1] Type at .\float.jl:703 [inlined] [2] convert at .\number.jl:7 [inlined] [3] setindex! at .\array.jl:767 [inlined] [4] evaluate(::ProductFun{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64}, ::Float64, ::Colon) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:215 [5] evaluate at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:218 [inlined] [6] (::ProductFun{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64})(::Float64, ::Float64) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:176 [7] evaluate(::Fun{TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64,Array{Int64,1}}, ::Float64, ::Float64) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\TensorSpace.jl:481 [8] (::Fun{TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64,Array{Int64,1}})(::Float64, ::Vararg{Float64,N} where N) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Fun.jl:220 [9] top-level scope at none:0
This can probably be worked around by making the coefficients Float64
. Though I believe changing something to prectype(f)
should give a more robust fix.
I'm pretty busy right now so would appreciate any PRs.