Well, derivating by a vector containing Symbols is fine, but I am not familiar with the application cases where the derivative is performed using a vector containing expressions...
2013/11/1 F. B. <[email protected]> > By the way, as far as you work on 1D and 2D arrays, you don't need numpy, > sympy can already handle those things. Greater dimensions are not yet > supported in sympy, unless you use tensor products in the diffgeom module, > but the representation of n-dim arrays is very strange there. As pointed > out by Aaron in a PR, you don't get a real advantage on dtype=object in > numpy over a possible pure python implementation. > > Indexed derivatives are an urgent need for modern physics, otherwise it is > really hard to transcribe formulae to a CAS. We need them in the tensor > module. > > There is already some stuff in the diffgeom module, which provides > differential and covariant derivatives for its field objects. I think it > only works within the diffgeom module. > > Concerning derivatives by a vector, the diffgeom module handles them in a > clean way. I mean, you define a manifold, then a patch on the manifold, and > finally a coordinate system on the patch. The coordinate system specifies > the basis symbols, which you can use on scalar, vector, and tensor fields > defined on that patch. As an example: > > >>> from sympy import Function > >>> from sympy.diffgeom.rn import R2 > >>> from sympy.diffgeom import Differential > >>> from sympy import pprint > > >>> g = Function('g') > >>> s_field = R2.x**2 * R2.y > > >>> e_x, e_y, = R2.e_x, R2.e_y > > > >>> dg = Differential(s_field) > > >>> pprint(dg(e_x)) > 2*x*y > >>> pprint(dg(e_y)) > 2 > x > > > That is, the diffgeom already handles a far more general case. It would be > nice to have the diffgeom module interact with other parts of sympy, rather > than implementing everything separately. > > By the way, there is a problem associated with derivatives by a vector: > how do you handle non-single-symbol expression in the derivative? I.e., if > *v = [a, b, a**2 + sin(b)]*, how do you handle a derivation of a matrix > by v? In the diffgeom module you define the coordinate system, the > coordinate symbols are instances of BaseScalarField, not generic > expressions. > > In any case, indexed derivations are a special case of the more general > tools already implemented in diffgeom, I mean, by your method you are > assuming: > > 1. a flat space. > 2. a single patch on the flat space. > 3. an ill-defined coordinate system, (you put it every time inside the > derivation). > 4. Euclidean metric (i.e. no difference between covariant and > contravariant components of the objects to be derived). > > I think that what is really worth, is to make diffgeom interact with > matrices and vectors, and maybe simplify its usage when the 4 points here > above are verified. > > On Thursday, October 31, 2013 8:52:45 PM UTC+1, Aaron Meurer wrote: > >> Ideally, we would implement these rules symbolically, so that they work >> even for something like MatrixSymbol('x', n, n). See >> https://code.google.com/p/**sympy/issues/detail?id=2759<https://code.google.com/p/sympy/issues/detail?id=2759>. >> Getting this working would be a really nice feature for SymPy. >> >> Aaron Meurer >> >> >> On Thu, Oct 31, 2013 at 4:09 AM, Saullo Castro <[email protected]>wrote: >> >>> I have the functional: >>> >>> >>> <https://lh5.googleusercontent.com/-YyVcmvfWlB8/UnIq_SuBdjI/AAAAAAAABYE/NkiWxG35LS8/s1600/fig1.png> >>> >>> Where A is a function of "v". The non-linear system of equations >>> necessary to find "v" is obtained doing: >>> >>> >>> <https://lh5.googleusercontent.com/-SElccyNi1xo/UnIrNKzuKxI/AAAAAAAABYM/xd6tHk0SJT0/s1600/fig2.png> >>> >>> According to the differentiation rules, this system could be written in >>> matrix form as: >>> >>> >>> <https://lh6.googleusercontent.com/-Qm0cHaMnEAA/UnIrYLIfs5I/AAAAAAAABYU/ocDPAfGA4ic/s1600/fig3.png> >>> >>> So I've implemented in Sympy, with the help of NumPy "ndarray" the >>> differentiation about a vector. In this case the shape of (\partial A / >>> \partial v is (n X n X n), where "n" is the length of vector "v". >>> >>> The function is simple: >>> def vdiff(x, vector): >>> x = np.array(x) >>> shape = x.shape >>> ans = [np.array([e.diff(vi) for e in x.ravel()]) for vi in vector] >>> ans = [a.reshape(shape) for a in ans] >>> return np.array(ans).swapaxes(0, 1) >>> >>> >>> >>> And I've tested with two different cases: >>> >>> def test_00(): >>> from sympy.abc import a, b, c, x >>> A11 = x*a*c**2 >>> A12 = x**2*a*b*c >>> A13 = x**2*a**3*b**5 >>> A21 = x**3*a**2*b*c >>> A22 = x**4*a*b**2*c**5 >>> A23 = 5*x**4*a*b**2*c >>> A31 = x**4*a*b**2*c**4 >>> A32 = 4*x**4*a*b**2*c**2 >>> A33 = 4*x**4*a**5*b**2*c >>> A = np.array([[A11, A12, A13], >>> [A21, A22, A23], >>> [A31, A32, A33]]) >>> v = np.array([a, b, c]) >>> F = (v.T.dot(A)).dot(v) >>> Av = vdiff(A, v) >>> p1 = v.dot(A) >>> p2 = A.dot(v) >>> p3 = v.dot(Av.dot(v)) >>> new = p1 + p2 + p3 >>> ref = np.array([F.diff(a), F.diff(b), F.diff(c)]) >>> print sympy.simplify(Matrix(ref-new)**) >>> >>> def test_01(): >>> from sympy.abc import a, b, c, x >>> sympy.var('c1, c2') >>> A11 = x*a*c**2 >>> A12 = x**2*a*b*c >>> A13 = x**2*a**3*b**5 >>> A21 = x**3*a**2*b*c >>> A22 = x**4*a*b**2*c**5 >>> A23 = 5*x**4*a*b**2*c >>> A = np.array([[A11, A12, A13], >>> [A21, A22, A23]]) >>> v = np.array([a, b, c]) >>> cc = np.array([c1, c2]) >>> F = cc.dot(A.dot(v)) >>> ref = np.array([F.diff(a), F.diff(b), F.diff(c)]) >>> Av = vdiff(A, v) >>> p1 = cc.dot(A) >>> p2 = cc.dot(Av.dot(v)) >>> new = p1 + p2 >>> print sympy.simplify(Matrix(ref-new)**) >>> >>> >>> I'd like to share here and get some feedback in case someone has a more >>> straightforward way to implement this... >>> >>> >>> Thank you! >>> >>> Saullo >>> >>> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sympy" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to sympy+un...@**googlegroups.com. >>> To post to this group, send email to [email protected]. >>> >>> Visit this group at >>> http://groups.google.com/**group/sympy<http://groups.google.com/group/sympy> >>> . >>> For more options, visit >>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >>> . >>> >> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "sympy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sympy/P8Q3G5bHe-U/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > For more options, visit https://groups.google.com/groups/opt_out. > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. For more options, visit https://groups.google.com/groups/opt_out.
