Opened 3 years ago

Last modified 6 months ago

#24850 new enhancement

Provide convenient Expression.convert_numeric()

Reported by: rws Owned by:
Priority: trivial Milestone: sage-8.2
Component: symbolics Keywords:
Cc: Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Description

From https://groups.google.com/forum/#!topic/sage-support/3eCHzmJ1MXY:

sage: cm = units.length.centimeter;
sage: x = 1e-6*cm;
sage: x
(1.00000000000000e-6)*centimeter
sage: x.n(digits=2)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-3595ea137553> in <module>()
----> 1 x.n(digits=Integer(2))


/home/Scratch/Install/Linux/SageMath/sage-8.1-Fedora_26-x86_64/SageMath/src/sage/structure/element.pyx in sage.structure.element.Element.n (build/cythonized/sage/structure/element.c:8063)()
    861             0.666666666666667
    862         """
--> 863         return self.numerical_approx(prec, digits, algorithm)
    864 
    865     N = deprecated_function_alias(13055, n)


/home/Scratch/Install/Linux/SageMath/sage-8.1-Fedora_26-x86_64/SageMath/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.numerical_approx (build/cythonized/sage/symbolic/expression.cpp:36128)()
   5782             res = x.pyobject()
   5783         else:
-> 5784             raise TypeError("cannot evaluate symbolic expression numerically")
   5785 
   5786         # Important -- the  we get might not be a valid output for numerical_approx in


TypeError: cannot evaluate symbolic expression numerically

Simply call _convert() with the parent keyword.

Change History (3)

comment:1 Changed 3 years ago by rws

  • Keywords beginner added
  • Priority changed from major to trivial

comment:2 Changed 3 years ago by raghukul01

The current implementation of numerical_approx has

        x = x = x._convert(kwds)

        if is_a_numeric(x._gobj):
            res = py_object_from_numeric(x._gobj)
        elif  is_a_constant(x._gobj):
            res = x.pyobject()
        else:
            raise TypeError("cannot evaluate symbolic expression numerically")

If x is a n number with units (example in ticket) then it would go to the else block, So can you suggest a check for expression which are numbers attached with units?

comment:3 Changed 6 months ago by gh-DaveWitteMorris

  • Keywords beginner removed

As suggested in the description of this ticket, and specifically stated in the sage-support discussion that is mentioned there, the _convert() method can deal with the example in this ticket:

sage: cm = units.length.centimeter;
sage: x = 1e-6*cm;
sage: x._convert({'parent':RealField(10)})
(1.0e-6)*centimeter

So this problem will be solved if #12577 is merged. And the case here (or something similar) could be added to the docstring as an example.

However, I don't think that would be a complete solution to the issue that is raised here, because attempting to evaluate sin(x)*cm numerically (when x is a variable) should give a TypeError: cannot evaluate symbolic expression numerically, but we have:

sage: var('x');
sage: (sin(x)*cm)._convert({'parent':RealField(10)})
1.0*centimeter*sin(x)
Note: See TracTickets for help on using tickets.