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