Can't chop using SymPy in Julia

question

#1

I’m using SymPy in Julia and can’t use the chop function. As a result of my calculations I have a number like

20.663702825333246 + 2.6469779601696886e-23im

If I try to:

chop(ans)

I get this error:

MethodError: no method matching chop(::Complex{Float64})
Closest candidates are:
chop(::AbstractString) at strings/util.jl:39

Why isn’t it working, and how should I do it? (I’m working on Julia v0.5)


#2

What do you want to do, i.e. what should chop do?


#3

As you can read from the error message, chop works for strings, not numbers. Is round what you are looking for?

julia> round(20.663702825333246 + 2.6469779601696886e-23im, 10)
20.6637028253 + 0.0im

From the manual:

round(x, digits) rounds to the specified number of digits after the decimal place (or before if negative).

#4

But round isn’t defined properly for Sym Objects … Not sure what the OP wants, but perhaps round(N(x)) or x[:round]() until this is addressed.


#5

In SymPy chop: “Chops off small real or imaginary parts, or converts numbers close to zero to exact zeros.” (http://docs.sympy.org/0.7.1/modules/mpmath/general.html) round kinda does the thing, that I want, if we don’t find better solution, I will go with that.


#6

It isn’t pretty, and I doubt it should be nicer, but you can try SymPy.mpmath[:chop](x,tol=1e9), say


#7

It is unclear why you need a symbolic library, but if I understand you requirements correctly, it should be easy to implement in Julia:

numchop{T <: Real}(x::T, δ = eps(T)) = abs(x) > δ ? x : zero(T)

function numchop{T <: Real}(x::Complex{T}, δ = eps(T))
    ichop = numchop(imag(x), δ)
    rchop = numchop(real(x), δ)
    if ichop == zero(T)
        rchop
    else
        complex(rchop, ichop)
    end
end

Note that of course it is not type stable.


#8

The SymPy.mpmath[:chop](x,tol=1e9) doesn’t work, it returns a Complex{BigFloat} with a bunch of zeros at the end of both the real and imaginary parts. But the numchop function works well, thank you for your help!


#9

This is pretty late, but one of the first modules I wrote is ZChop.jl I think it does what you want. It is similar to Mathematica’s Chop.


#10

Try explicity wrapping the complex number with PyObject, as so PyObject(1 + 1 im) before calling the python function.