Skip to content

pFq with Matrix argument #60

Open
Open
@MikaelSlevinsky

Description

@MikaelSlevinsky

This could be pretty useful. In Base, exp(z::Matrix{BigFloat}) doesn't exist but we could support it with some minor modifications of the rational algorithms

julia> using LinearAlgebra

julia> @inline errcheck(x::Matrix, y::Matrix, tol) = (norm(x-y) > max(norm(x), norm(y))*tol)
errcheck (generic function with 1 method)

julia> function pFqdrummond(::Tuple{}, ::Tuple{}, z::Matrix{T}; kmax::Int = 10_000) where T
           if norm(z) < eps(real(T))
               return Matrix{T}(I, size(z, 1), size(z, 2))
           end
           ζ = inv(z)
           Nlo = Matrix{T}(I, size(z, 1), size(z, 2))
           Dlo = Matrix{T}(I, size(z, 1), size(z, 2))
           Tlo = Nlo/Dlo
           Nhi = (2I - z)*Nlo + 2z
           Dhi = (2I - z)*Dlo
           Thi = Nhi/Dhi
           k = 1
           Nhi, Nlo = ((k+2)*I-z)*Nhi + k*z*Nlo + z*z, Nhi
           Dhi, Dlo = ((k+2)*I-z)*Dhi + k*z*Dlo, Dhi
           Thi, Tlo = Nhi/Dhi, Thi
           k += 1
           while k < kmax && errcheck(Tlo, Thi, 10eps(real(T)))
               Nhi, Nlo = ((k+2)*I-z)*Nhi + k*z*Nlo, Nhi
               Dhi, Dlo = ((k+2)*I-z)*Dhi + k*z*Dlo, Dhi
               Thi, Tlo = Nhi/Dhi, Thi
               k += 1
           end
           return Thi
       end
pFqdrummond (generic function with 1 method)

julia> Z = big.(rand(2, 2))
2×2 Matrix{BigFloat}:
 0.82811   0.0613331
 0.449884  0.073366

julia> pFqdrummond((), (), Z)
2×2 Matrix{BigFloat}:
 2.31398   0.0990111
 0.726256  1.09558

julia> exp(Float64.(Z))
2×2 Matrix{Float64}:
 2.31398   0.0990111
 0.726256  1.09558

julia> pFqdrummond((), (), Z) - exp(Float64.(Z))
2×2 Matrix{BigFloat}:
 6.85325e-16   3.73548e-17
 2.05869e-16  -7.37797e-17

julia> exp(Z)
ERROR: MethodError: no method matching exp(::Matrix{BigFloat})
Closest candidates are:
  exp(::Union{Float16, Float32, Float64}) at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/base/special/exp.jl:296
  exp(::StridedMatrix{var"#s859"} where var"#s859"<:Union{Float32, Float64, ComplexF32, ComplexF64}) at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/stdlib/v1.7/LinearAlgebra/src/dense.jl:560
  exp(::StridedMatrix{var"#s859"} where var"#s859"<:Union{Integer, Complex{<:Integer}}) at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/stdlib/v1.7/LinearAlgebra/src/dense.jl:561
  ...
Stacktrace:
 [1] top-level scope
   @ REPL[7]:1

julia> 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions