Piecewise functions are symbolic functions now; The problem is that your g 
doesn't define a symbolic function, so you can't use it as input to 
piecewise:

sage: g(x)
...
TypeError: unable to simplify to float approximation. You can manually 
define a symbolic function whose numeric evaluation is prescribed:

sage: def gnum(self, x, **kwds):
....:         var('u')
....:         return numerical_integral(u^2,0,x)[0] 
sage: gsym = function('gsym', nargs=1, evalf_func=gnum)
sage: gsym(x)
gsym(x)
sage: gsym(1)
gsym(1)
sage: gsym(1).n()
0.3333333333333333

Then you can use it to define a piecewise function
 
sage: piecewise([[(0,1), gsym(x)]])

We should probably automatically try that if g(x) raises an exception, 
though there might be further implication...



On Sunday, May 22, 2016 at 1:38:06 AM UTC+2, paulmasson wrote:
>
> Another problem I've encountered concerns including numerical integrals in 
> piecewise functions. This used to work in Sage 6.9:
>
> def g(x):
>     var('u')
>     return numerical_integral(u^2,0,x)[0]
>
> f=piecewise([ [(0,1), g ] ])
>
> but now gives the error message
>
>
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent call last)
> <ipython-input-1-d490d0695d4b> in <module>()
>       4 
>       5 
> ----> 6 f=piecewise([ [(Integer(0),Integer(1)), g ] ])
>       7 
>
> /home/sc_serv/sage/src/sage/misc/lazy_import.pyx in 
> sage.misc.lazy_import.LazyImport.__call__ 
> (/home/sc_serv/sage/src/build/cythonized/sage/misc/lazy_import.c:3628)()
>     384             True
>     385         """
> --> 386         return self._get_object()(*args, **kwds)
>     387 
>     388     def __repr__(self):
>
> /home/sc_serv/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
>  in __call__(self, function_pieces, **kwds)
>     149                     function = function()
>     150                 else:
> --> 151                     function = function(var)
>     152             function = SR(function)
>     153             if var is None and len(function.variables()) > 0:
>
> <ipython-input-1-d490d0695d4b> in g(x)
>       1 def g(x):
>       2     var('u')
> ----> 3     return numerical_integral(u**Integer(2),Integer(0),x)[Integer(0)]
>       4 
>       5 
>
> /home/sc_serv/sage/src/sage/gsl/integration.pyx in 
> sage.gsl.integration.numerical_integral 
> (/home/sc_serv/sage/src/build/cythonized/sage/gsl/integration.c:3387)()
>     329       else:
>     330          _a=a
> --> 331          _b=b
>     332          W = <gsl_integration_workspace*> 
> gsl_integration_workspace_alloc(n)
>     333          sig_on()
>
> /home/sc_serv/sage/src/sage/symbolic/expression.pyx in 
> sage.symbolic.expression.Expression.__float__ 
> (/home/sc_serv/sage/src/build/cythonized/sage/symbolic/expression.cpp:10403)()
>    1384             return float(self._eval_self(float))
>    1385         except TypeError:
> -> 1386             raise TypeError("unable to simplify to float 
> approximation")
>    1387 
>    1388     def __complex__(self):
>
> TypeError: unable to simplify to float approximation
>
>
> which makes no sense since a numerical integral is already a float. Is 
> there some other new behavior I'm missing?
>
>

-- 
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