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

Reply via email to