Hello everyone, after a long time by manual calculation I just want to test sympy's ability to do integration by substitution:
http://en.wikipedia.org/wiki/Integration_by_substitution But it seems to fail. It is a known NotImplemented Feature or a (known) bug? Thanks, Friedrich Here is the test: [./sympy-0.6.5.beta3] % ./bin/isympy Python 2.4.4 console for SymPy 0.6.5.beta3 These commands were executed: >>> from __future__ import division >>> from sympy import * >>> x, y, z = symbols('xyz') >>> k, m, n = symbols('kmn', integer=True) >>> f, g, h = map(Function, 'fgh') Documentation can be found at http://sympy.org/ In [1]: print(integrate(f(x), x)) Integral(f(x), x) # That's ok # And now, instead of In [2]: print(integrate(f(2*x), x)) Integral(f(x)/2, x) # I get a long failure ending with: # ValueError: Invalid literal: 2*x is not a valid variable In [2]: print(integrate(f(2*x), x)) ERROR: An unexpected error occurred while tokenizing input The following traceback may be corrupted or invalid The error message is: ('EOF in multi-line statement', (125, 0)) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /scratch/fhagedor/src/sympy-0.6.5.beta3/<ipython console> /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/utilities/decorator.pyc in threaded_decorator(expr, *args, **kwargs) 54 return Add(*[ func(f, *args, **kwargs) for f in expr.args ]) 55 else: ---> 56 return func(expr, *args, **kwargs) 57 58 threaded_decorator.__doc__ = func.__doc__ /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/integrals/integrals.pyc in integrate(*args, **kwargs) 401 402 if isinstance(integral, Integral): --> 403 return integral.doit() 404 else: 405 return integral /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/integrals/integrals.pyc in doit(self, **hints) 132 133 for x,ab in self.limits: --> 134 antideriv = self._eval_integral(function, x) 135 136 if antideriv is None: /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/integrals/integrals.pyc in _eval_integral(self, f, x) 313 314 # fall back to the more general algorithm --> 315 h = heurisch(g, x, hints=[]) 316 317 if h is not None: /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/integrals/risch.pyc in heurisch(f, x, **kwargs) 211 return expr.subs(mapping) 212 --> 213 diffs = [ substitute(simplify(g.diff(x))) for g in terms ] 214 215 denoms = [ g.as_numer_denom()[1] for g in diffs ] /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/integrals/risch.pyc in substitute(expr) 209 210 def substitute(expr): --> 211 return expr.subs(mapping) 212 213 diffs = [ substitute(simplify(g.diff(x))) for g in terms ] /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/basic.pyc in subs(self, *args) 962 sequence = args[0] 963 if isinstance(sequence, dict): --> 964 return self._subs_dict(sequence) 965 elif isinstance(sequence, (list, tuple)): 966 return self._subs_list(sequence) /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/basic.pyc in _subs_dict(self, sequence) 1052 subst.append(pattern) 1053 subst.reverse() -> 1054 return self._subs_list(subst) 1055 1056 def _seq_subs(self, old, new): /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/basic.pyc in _subs_list(self, sequence) 1005 for old, new in sequence: 1006 if hasattr(result, 'subs'): -> 1007 result = result.subs(old, new) 1008 return result 1009 /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/basic.pyc in subs(self, *args) 969 elif len(args) == 2: 970 old, new = args --> 971 return self._subs_old_new(old, new) 972 else: 973 raise TypeError("subs accepts either 1 or 2 arguments") /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/cache.pyc in wrapper(*args, **kw_args) 83 except KeyError: 84 pass ---> 85 func_cache_it_cache[k] = r = func(*args, **kw_args) 86 return r 87 /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/basic.pyc in _subs_old_new(self, old, new) 978 old = sympify(old) 979 new = sympify(new) --> 980 return self._eval_subs(old, new) 981 982 def _eval_subs(self, old, new): /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/function.pyc in _eval_subs(self, old, new) 617 if self==old: 618 return new --> 619 return Derivative(*map(lambda x: x._eval_subs(old, new), self.args), **{'evaluate': True}) 620 621 def matches(pattern, expr, repl_dict={}, evaluate=False): /scratch/fhagedor/src/sympy-0.6.5.beta3/sympy/core/function.pyc in __new__(cls, expr, *symbols, **assumptions) 576 s = sympify(s) 577 if not isinstance(s, Symbol): --> 578 raise ValueError('Invalid literal: %s is not a valid variable' % s) 579 if not expr.has(s): 580 return S.Zero ValueError: Invalid literal: 2*x is not a valid variable --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---
