That is the issue here. The problem is that undefined functions do
evalf name lookups. For example
In [9]: Function("sin")(1.0)
Out[9]: 0.841470984807897
We should change it so that only direct subclasses of Function do
this, not UndefinedFunctions.
In the mean time, Jason, a workaround would be to use Function(u'φ').
Aaron Meurer
On Thu, Mar 10, 2016 at 2:04 PM, Sartaj Singh <[email protected]> wrote:
> Also type(phi) gives sympy.core.function.UndefinedFunction. This is
> confusing.
>
> On 11 March 2016 at 00:31, Aaron Meurer <[email protected]> wrote:
>>
>> Since this seems to break only when the function name is "phi", this
>> looks like an instance of https://github.com/sympy/sympy/issues/6938.
>> But I'm not quite sure what other SymPy function is named "phi". I
>> didn't find any in a quick grep.
>>
>> Aaron Meurer
>>
>> On Thu, Mar 10, 2016 at 1:54 PM, Sartaj Singh <[email protected]>
>> wrote:
>> > Apparently, this also does not work,
>> >
>> > # leosartaj at Mothership in ~/projects/sympy on git:master o [0:09:48]
>> > $ isympy
>> > IPython console for SymPy 1.0.1.dev (Python 2.7.11-64-bit) (ground
>> > types:
>> > python)
>> >
>> > These commands were executed:
>> >>>> from __future__ import division
>> >>>> from sympy import *
>> >>>> x, y, z, t = symbols('x y z t')
>> >>>> k, m, n = symbols('k m n', integer=True)
>> >>>> f, g, h = symbols('f g h', cls=Function)
>> >>>> init_printing()
>> >
>> > Documentation can be found at http://docs.sympy.org/dev
>> >
>> > In [1]: phi = symbols('phi', cls=Function)
>> >
>> > In [2]: phi(5.0)
>> >
>> > ---------------------------------------------------------------------------
>> > TypeError Traceback (most recent call
>> > last)
>> > <ipython-input-2-68868fcc8946> in <module>()
>> > ----> 1 phi(5.0)
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/function.pyc in __new__(cls,
>> > *args, **options)
>> > 718 def __new__(cls, *args, **options):
>> > 719 args = list(map(sympify, args))
>> > --> 720 obj = super(AppliedUndef, cls).__new__(cls, *args,
>> > **options)
>> > 721 return obj
>> > 722
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/cache.pyc in wrapper(*args,
>> > **kwargs)
>> > 93 retval = cfunc(*args, **kwargs)
>> > 94 except TypeError:
>> > ---> 95 retval = func(*args, **kwargs)
>> > 96 return retval
>> > 97
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/function.pyc in __new__(cls,
>> > *args, **options)
>> > 390 pr2 = min(cls._should_evalf(a) for a in result.args)
>> > 391 if pr2 > 0:
>> > --> 392 return result.evalf(mlib.libmpf.prec_to_dps(pr))
>> > 393 return result
>> > 394
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/evalf.pyc in evalf(self, n,
>> > subs,
>> > maxn, chop, strict, quad, verbose)
>> > 1384 options['quad'] = quad
>> > 1385 try:
>> > -> 1386 result = evalf(self, prec + 4, options)
>> > 1387 except NotImplementedError:
>> > 1388 # Fall back to the ordinary evalf
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/evalf.pyc in evalf(x, prec,
>> > options)
>> > 1282 if 'subs' in options:
>> > 1283 x = x.subs(evalf_subs(prec, options['subs']))
>> > -> 1284 xe = x._eval_evalf(prec)
>> > 1285 re, im = xe.as_real_imag()
>> > 1286 if re.has(re_) or im.has(im_):
>> >
>> > /home/leosartaj/projects/sympy/sympy/core/function.pyc in
>> > _eval_evalf(self,
>> > prec)
>> > 501
>> > 502 with mpmath.workprec(prec):
>> > --> 503 v = func(*args)
>> > 504
>> > 505 return Expr._from_mpmath(v, prec)
>> >
>> >
>> > /home/leosartaj/anaconda/envs/my/lib/python2.7/site-packages/mpmath/ctx_mp_python.pyc
>> > in __call__(self, prec, dps, rounding)
>> > 344 if not rounding: rounding = rounding2
>> > 345 if dps: prec = dps_to_prec(dps)
>> > --> 346 return self.context.make_mpf(self.func(prec, rounding))
>> > 347
>> > 348 @property
>> >
>> >
>> > /home/leosartaj/anaconda/envs/my/lib/python2.7/site-packages/mpmath/libmp/libelefun.pyc
>> > in f(prec, rnd)
>> > 114 def f(prec, rnd=round_fast):
>> > 115 wp = prec + 20
>> > --> 116 v = fixed(wp)
>> > 117 if rnd in (round_up, round_ceiling):
>> > 118 v += 1
>> >
>> >
>> > /home/leosartaj/anaconda/envs/my/lib/python2.7/site-packages/mpmath/libmp/libelefun.pyc
>> > in g(prec, **kwargs)
>> > 95 memo_prec = f.memo_prec
>> > 96 if prec <= memo_prec:
>> > ---> 97 return f.memo_val >> (memo_prec-prec)
>> > 98 newprec = int(prec*1.05+10)
>> > 99 f.memo_val = f(newprec, **kwargs)
>> >
>> > TypeError: unsupported operand type(s) for >>: 'long' and 'mpf'
>> >
>> >
>> > This does work though,
>> >
>> >>>> phi(5)
>> > φ(5)
>> >
>> > However,
>> >
>> >>>> p = symbols('p', cls=Function)
>> >>>> p(5.0)
>> > p(5.0)
>> >
>> >>>> p(t).xreplace({t: 5.0})
>> > p(5.0) # works without any problems
>> >
>> >
>> > By My understanding, is symbols with cls=Function arg not expected to
>> > make
>> > an undefined function?
>> >
>> >
>> > On Friday, 11 March 2016 00:03:38 UTC+5:30, Jason Moore wrote:
>> >>
>> >> I don't understand this behavior:
>> >>
>> >> Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec 7 2015,
>> >> 11:16:01)
>> >> Type "copyright", "credits" or "license" for more information.
>> >>
>> >> IPython 4.1.2 -- An enhanced Interactive Python.
>> >> ? -> Introduction and overview of IPython's features.
>> >> %quickref -> Quick reference.
>> >> help -> Python's own help system.
>> >> object? -> Details about 'object', use 'object??' for extra details.
>> >>
>> >> In [1]: from sympy import *
>> >>
>> >> In [2]: phi = symbols('phi', cls=Function)
>> >>
>> >> In [3]: t = symbols('t')
>> >>
>> >> In [4]: phi(t).xreplace({t: 0})
>> >> Out[4]: phi(0)
>> >>
>> >> In [5]: phi(t).xreplace({t: 0.0})
>> >> Out[5]: 1.61803398874989
>> >>
>> >> In [6]: phi(t).xreplace({t: 5.0})
>> >>
>> >>
>> >> ---------------------------------------------------------------------------
>> >> KeyError Traceback (most recent call
>> >> last)
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/evalf.py
>> >> in evalf(x, prec, options)
>> >> 1209 try:
>> >> -> 1210 rf = evalf_table[x.func]
>> >> 1211 r = rf(x, prec, options)
>> >>
>> >> KeyError: phi
>> >>
>> >> During handling of the above exception, another exception occurred:
>> >>
>> >> TypeError Traceback (most recent call
>> >> last)
>> >> <ipython-input-6-ec5c48b4cb2f> in <module>()
>> >> ----> 1 phi(t).xreplace({t: 5.0})
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/basic.py
>> >> in xreplace(self, rule)
>> >> 1086 args = tuple(args)
>> >> 1087 if not _aresame(args, self.args):
>> >> -> 1088 return self.func(*args)
>> >> 1089 return self
>> >> 1090
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/function.py
>> >> in __new__(cls, *args, **options)
>> >> 683 def __new__(cls, *args, **options):
>> >> 684 args = list(map(sympify, args))
>> >> --> 685 obj = super(AppliedUndef, cls).__new__(cls, *args,
>> >> **options)
>> >> 686 return obj
>> >> 687
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/function.py
>> >> in __new__(cls, *args, **options)
>> >> 380 pr2 = min(cls._should_evalf(a) for a in result.args)
>> >> 381 if pr2 > 0:
>> >> --> 382 return result.evalf(mlib.libmpf.prec_to_dps(pr))
>> >> 383 return result
>> >> 384
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/evalf.py
>> >> in evalf(self, n, subs, maxn, chop, strict, quad, verbose)
>> >> 1315 options['quad'] = quad
>> >> 1316 try:
>> >> -> 1317 result = evalf(self, prec + 4, options)
>> >> 1318 except NotImplementedError:
>> >> 1319 # Fall back to the ordinary evalf
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/evalf.py
>> >> in evalf(x, prec, options)
>> >> 1215 if 'subs' in options:
>> >> 1216 x = x.subs(evalf_subs(prec, options['subs']))
>> >> -> 1217 re, im = x._eval_evalf(prec).as_real_imag()
>> >> 1218 if re.has(re_) or im.has(im_):
>> >> 1219 raise NotImplementedError
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/core/function.py
>> >> in _eval_evalf(self, prec)
>> >> 484
>> >> 485 with mpmath.workprec(prec):
>> >> --> 486 v = func(*args)
>> >> 487
>> >> 488 return Expr._from_mpmath(v, prec)
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/mpmath/ctx_mp_python.py
>> >> in __call__(self, prec, dps, rounding)
>> >> 344 if not rounding: rounding = rounding2
>> >> 345 if dps: prec = dps_to_prec(dps)
>> >> --> 346 return self.context.make_mpf(self.func(prec, rounding))
>> >> 347
>> >> 348 @property
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/mpmath/libmp/libelefun.py
>> >> in f(prec, rnd)
>> >> 114 def f(prec, rnd=round_fast):
>> >> 115 wp = prec + 20
>> >> --> 116 v = fixed(wp)
>> >> 117 if rnd in (round_up, round_ceiling):
>> >> 118 v += 1
>> >>
>> >>
>> >>
>> >> /home/moorepants/miniconda3/lib/python3.5/site-packages/sympy/mpmath/libmp/libelefun.py
>> >> in g(prec, **kwargs)
>> >> 95 memo_prec = f.memo_prec
>> >> 96 if prec <= memo_prec:
>> >> ---> 97 return f.memo_val >> (memo_prec-prec)
>> >> 98 newprec = int(prec*1.05+10)
>> >> 99 f.memo_val = f(newprec, **kwargs)
>> >>
>> >> TypeError: unsupported operand type(s) for >>: 'int' and 'mpf'
>> >>
>> >> Can someone explain to me what is going on? I would expect "t" to be
>> >> simply replaced with the number.
>> >>
>> >> Jason
>> >> moorepants.info
>> >> +01 530-601-9791
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "sympy" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to [email protected].
>> > To post to this group, send email to [email protected].
>> > Visit this group at https://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/sympy/b40c4bb2-e74a-4399-8a40-879e380ea65e%40googlegroups.com.
>> >
>> > For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "sympy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at https://groups.google.com/group/sympy.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/sympy/CAKgW%3D6J93TOhZxUL2D-qq55v%3D6_GgfWK6e38rx66gtq%2BHazTQw%40mail.gmail.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>
>
>
> --
> Regards
> Sartaj Singh
>
> Mathematics and Computing,
> Indian Institute of Technology,
> Varanasi - 221 005 INDIA
>
> E-mail: [email protected], [email protected]
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/CAC%2BH8-GshNsi%2BRheh50aHcXsMeQS5KBsJLOG%3DtRUGqGZCkgotg%40mail.gmail.com.
>
> For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/CAKgW%3D6LF083v9etxFe3SYcfqH2tp0%3DbEQg1coBiRayT8SGUeew%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.