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

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