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