On Thursday 27 November 2008 22:03:57 Ondrej Certik wrote:
> This looks good to me. Could you please also create more tests for the
> line_integrate? You can add them as additional patches.
>
> Ondrej
>
> On Thu, Nov 27, 2008 at 9:57 PM, Ondrej Certik <[EMAIL PROTECTED]> wrote:
> > From: Priit Laes <[EMAIL PROTECTED]>
> >
> > ---
> >  sympy/integrals/__init__.py                 |    2 +-
> >  sympy/integrals/integrals.py                |   45
> > +++++++++++++++++++++++++++ sympy/integrals/tests/test_lineintegrals.py |
> >    9 +++++
> >  3 files changed, 55 insertions(+), 1 deletions(-)
> >  create mode 100644 sympy/integrals/tests/test_lineintegrals.py
> >
> > diff --git a/sympy/integrals/__init__.py b/sympy/integrals/__init__.py
> > index 6027264..7abce35 100644
> > --- a/sympy/integrals/__init__.py
> > +++ b/sympy/integrals/__init__.py
> > @@ -5,4 +5,4 @@ Out[3]: log(x)
> >  In [4]: integrate(sin(x),x)
> >  Out[4]: -cos(x)
> >  """
> > -from integrals import integrate, Integral
> > +from integrals import integrate, Integral, line_integrate
> > diff --git a/sympy/integrals/integrals.py b/sympy/integrals/integrals.py
> > index 8094919..d541569 100644
> > --- a/sympy/integrals/integrals.py
> > +++ b/sympy/integrals/integrals.py
> > @@ -10,6 +10,7 @@ from sympy.series import limit
> >  from sympy.polys import Poly
> >  from sympy.solvers import solve
> >  from sympy.functions import DiracDelta, Heaviside, Piecewise
> > +from sympy.geometry import Curve
> >
> >  class Integral(Basic):
> >     """Represents unevaluated integral."""
> > @@ -377,3 +378,47 @@ def integrate(*args, **kwargs):
> >         return integral.doit()
> >     else:
> >         return integral
> > +
> > +
> > [EMAIL PROTECTED](use_add=False)
> > +def line_integrate(field, curve, vars):
                                                        ^^^
> > +    """line_integrate(field, Curve, variables)
> > +
> > +       Compute the line integral.
> > +
> > +       Examples
> > +       --------
> > +       >>> from sympy import *
> > +       >>> x, y, t = symbols('xyt')
> > +       >>> C = Curve([E**t + 1, E**t - 1], (t, 0, ln(2)))
> > +       >>> line_integrate(x + y, C, [x, y])
> > +       3*sqrt(2)
> > +
> > +    """
> > +    F = sympify(field)
> > +    if not F:
> > +        raise ValueError("Expecting function specifying field as first
> > argument.") +    if not isinstance(curve, Curve):
> > +        raise ValueError("Expecting Curve entity as second argument.")
> > +    if not isinstance(vars, (list, tuple)):
> > +        raise ValueError("Expecting list/tuple for variables.")
> > +    if len(curve.functions) != len(vars):
> > +        raise ValueError("Field variable size does not match curve
> > dimension.") +
> > +    if curve.parameter in vars:
> > +        raise ValueError("Curve parameter clashes with field
> > parameters.") +
> > +    # Calculate derivatives for line parameter functions
> > +    # F(r) -> F(r(t)) and finally F(r(t)*r'(t))
> > +    Ft = F
> > +    dldt = 0
> > +    for i, var in enumerate(vars):
> > +        _f = curve.functions[i]
> > +        _dn = diff(_f, curve.parameter)
> > +        # ...arc length
> > +        dldt = dldt + (_dn * _dn)
> > +        Ft = Ft.subs(var, _f)
> > +    Ft = Ft * dldt**(S(1)/2)
> > +
> > +    integral = Integral(Ft, curve.limits).doit()
> > +    return integral
> > diff --git a/sympy/integrals/tests/test_lineintegrals.py
> > b/sympy/integrals/tests/test_lineintegrals.py new file mode 100644
> > index 0000000..1cb8a8c
> > --- /dev/null
> > +++ b/sympy/integrals/tests/test_lineintegrals.py
> > @@ -0,0 +1,9 @@
> > +from sympy import (symbols, integrate, Integral, diff, sin, cos, pi, E,
> > ln, +        sympify, Curve, line_integrate, sqrt)
> > +
> > +s, t, x, y, z = symbols('stxyz')
> > +
> > +def test_lineintegral():
> > +    c = Curve([E**t + 1, E**t - 1], (t, 0, ln(2)))
> > +    assert line_integrate(x + y, c, [x, y]) == 3*sqrt(2)
> > +
> > --
> > 1.6.0.4

Nice patch!
Just a comment: vars is a python keyword, I think is better to change it to 
something better.

Sorry for the late review!

Cheers,
Riccardo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy-patches" group.
To post to this group, send email to sympy-patches@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sympy-patches?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to