Done and thanks!

workaround before the ticket is merged:

sage: from sage.libs.pynac.pynac import register_symbol
sage: register_symbol(abs, {'fricas': 'abs'})

(would it be better not to create symbolic functions for functions returned 
by fricas unknown to sage?)

Martin

Am Samstag, 30. März 2019 21:03:38 UTC+1 schrieb Frédéric Chapoton:
>
> I have made https://trac.sagemath.org/ticket/27577, which needs review 
> (very simple ticket)
>
> Frederic
>
> Le samedi 30 mars 2019 10:56:59 UTC+1, Emmanuel Charpentier a écrit :
>>
>> *TL;DR :* Sage can produce a symbolic expression :
>>
>>    - that it can't evaluate numerically when correcly substiuted, AND
>>    - that can be evaluated when typed manually.
>>
>> The problem seems ti be bound to absolute values.
>>
>> That, IMHO, is a first-class bug...
>>
>> *Demonstation :* I think that some results produced by fricas' 
>> integrator are wrong, and wanted to show it numerically.
>>
>> Problem setup :
>> x,y=var("x,y", domain="real")
>> assume(x>-1,x<1,y>-1,y<1,x^2+y^2<1)
>> eps1=var("eps1", latex_name="\\varepsilon_1", domain="positive")
>> eps2=var("eps2", latex_name="\\varepsilon_2", domain="positive")
>> assume(eps1<1,eps2<1, eps1^2+eps2^2<1)
>> f(x,y)=sqrt(1-x^2-y^2)
>>
>> Define the integral on a given rectangle as a function :
>>
>> foo(eps1,eps2)=f(x).integrate(x,0,eps1, 
>> algorithm="fricas").integrate(y,0,eps2, algorithm="fricas")
>>
>> Use it :
>>
>> sage: bar=foo(1/10,1/10)
>> sage: bar
>> 299/12000*pi - 1/198*sqrt(11)*pi*abs(-3/2*sqrt(11)) + 7/1500*sqrt(1/2)
>> + 1/6*arctan(9799/140*sqrt(1/2)) - 299/6000*arctan(14*sqrt(1/2)) +
>> 299/6000*arctan(1/7*sqrt(1/2))
>>
>> So far so good. But when I want a numerical approximation :
>>
>> sage: bar.n()
>>
>> ---------------------------------------------------------------------------
>> TypeError                                 Traceback (most recent call 
>> last)
>> <ipython-input-104-425a0225c048> in <module>()
>> ----> 1 bar.n()
>>
>> /usr/local/sage-8/local/lib/python2.7/site-packages/sage/structure/element.pyx
>>  
>> in sage.structure.element.Element.n 
>> (build/cythonized/sage/structure/element.c:8020)()
>>     859             0.666666666666667
>>     860         """
>> --> 861         return self.numerical_approx(prec, digits, algorithm)
>>     862 
>>     863     def _mpmath_(self, prec=53, rounding=None):
>>
>> /usr/local/sage-8/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>>  
>> in sage.symbolic.expression.Expression.numerical_approx 
>> (build/cythonized/sage/symbolic/expression.cpp:33969)()
>>    5949             res = x.pyobject()
>>    5950         else:
>> -> 5951             raise TypeError("cannot evaluate symbolic expression 
>> numerically")
>>    5952 
>>    5953         # Important -- the  we get might not be a valid output 
>> for numerical_approx in
>>
>> TypeError: cannot evaluate symbolic expression numerically
>>
>> Let's debug it :
>>
>> def tryit(x):
>>     try:
>>         return x.n()
>>     except:
>>         return "Failed..."
>>
>> Let's see :
>>
>> sage: gee=[[u,tryit(u)] for u in bar.operands()]
>> sage: gee
>> [[299/12000*pi, 0.0782780169519457],
>>  [-1/198*sqrt(11)*pi*abs(-3/2*sqrt(11)), 'Failed...'],
>>  [7/1500*sqrt(1/2), 0.00329983164553722],
>>  [1/6*arctan(9799/140*sqrt(1/2)), 0.258432327173397],
>>  [-299/6000*arctan(14*sqrt(1/2)), -0.0732611082333419],
>>  [299/6000*arctan(1/7*sqrt(1/2)), 0.00501690871860373]]
>>
>> However, when I copy and paste the very same expression (or type it 
>> manually), it can be numerically approximated :
>>
>> sage: (-1/198*sqrt(11)*pi*abs(-3/2*sqrt(11))).n()
>> -0.261799387799149
>>
>> Diving recusively :
>>
>> sage: [[u,tryit(u)] for u in bar.operands()[1].operands()]
>> [[sqrt(11), 3.31662479035540],
>>  [pi, 3.14159265358979],
>>  [abs(-3/2*sqrt(11)), 'Failed...'],
>>  [-1/198, -0.00505050505050505]]
>>
>> Again, the litigious expression can be evaluated by copy 'n paste :
>>
>> sage: abs(-3/2*sqrt(11)).n()
>> 4.97493718553310
>>
>> BUT the semi-obvious workaround fails :
>>
>> sage: SR(repr(bar.operands()[1])).n()
>>
>> ---------------------------------------------------------------------------
>> TypeError                                 Traceback (most recent call 
>> last)
>> <ipython-input-117-e426b18b4666> in <module>()
>> ----> 1 SR(repr(bar.operands()[Integer(1)])).n()
>>
>> /usr/local/sage-8/local/lib/python2.7/site-packages/sage/structure/element.pyx
>>  
>> in sage.structure.element.Element.n 
>> (build/cythonized/sage/structure/element.c:8020)()
>>     859             0.666666666666667
>>     860         """
>> --> 861         return self.numerical_approx(prec, digits, algorithm)
>>     862 
>>     863     def _mpmath_(self, prec=53, rounding=None):
>>
>> /usr/local/sage-8/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>>  
>> in sage.symbolic.expression.Expression.numerical_approx 
>> (build/cythonized/sage/symbolic/expression.cpp:33969)()
>>    5949             res = x.pyobject()
>>    5950         else:
>> -> 5951             raise TypeError("cannot evaluate symbolic expression 
>> numerically")
>>    5952 
>>    5953         # Important -- the  we get might not be a valid output 
>> for numerical_approx in
>>
>> TypeError: cannot evaluate symbolic expression numerically
>>
>> Recurse again :
>>
>> sage: [[u,tryit(u)] for u in bar.operands()[1].operands()[2].operands()]
>> [[-3/2*sqrt(11), -4.97493718553310]]
>>
>> Therefore, the problem seems to be with the numerical approximation of an 
>> absolute value.
>>
>> I'm stuck.
>>
>> Two questions :
>>
>>    - Ticket worthy (yes, IMHO)
>>    - Workaround suggestions ?
>>
>>
>> HTH,
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to