Automatic creation of a symbolic function from a numeric one sounds like a 
good idea to me, if feasible. I'm coming to Sage from Mathematica, where 
one doesn't need to think about such issues. It's confusing to new users 
when numeric functions fail unexpectedly.

On Sunday, May 22, 2016 at 1:14:13 AM UTC-7, Volker Braun wrote:
>
> 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