Rick
Rick

Reputation: 1814

compute x-component of vector in sympy

I'm sure this is a really basic question, but I've googled and haven't found it. Supposed I have a vector in sympy

z = 3*x + 4*y

How do I compute the x-component of the vector (i.e. the 3)? z/x doesn't give it (there's still the y-part), nor does z[x] or z.x. Surely there's a way to do this, right?

Upvotes: 1

Views: 1597

Answers (2)

Krastanov
Krastanov

Reputation: 6549

I think that calling this expression a vector is somewhat incorrect. Indeed, if you keep in your mind the assumption that x and y are some base vectors, it will work in your mind. However the library will not provide any vector-like functionality because it does not know that you want to treat this as vectors.

For vector with all the nice helper methods you can use the diffgeom submodule of sympy which provides predefined R^2 and R^3 spaces with numerous coordinate systems.

However, for your case pattern matching seems a much more natural choice. After all pattern matching is one of the basic building blocks of CASes like Mathematica and others.

In SymPy as in all other CASes you work with symbolic expressions which are basically big trees with operators at each node and some symbols at the leafs. You can match trees against some predefined patterns much in the same way in which you can use regex on strings. In sympy you use Wild to do that:

x, y = Symbols("x y")
a, b = Wild('a', exclude=[x, y]), Wild('b', exclude=[x, y])
(2*x + 3*y).match(a*x + b*y)

For the special case of linear combinations check coeff which is described in the other answer.

See: https://github.com/sympy/sympy/wiki/Idioms-and-Antipatterns#wild-and-match

Upvotes: 1

rtrwalker
rtrwalker

Reputation: 1021

Is it as simple as:

>>> from sympy.abc import x, y
>>> z = 3*x + 4*y
>>> z.coeff(x)
3

Upvotes: 2

Related Questions