Spaces:
Sleeping
Sleeping
| ========================= | |
| General examples of usage | |
| ========================= | |
| This section details the solution of two basic problems in vector | |
| math/calculus using the :mod:`sympy.vector` package. | |
| Quadrilateral problem | |
| ===================== | |
| The Problem | |
| ----------- | |
| *OABC is any quadrilateral in 3D space. P is the | |
| midpoint of OA, Q is the midpoint of AB, R is the midpoint of BC | |
| and S is the midpoint of OC. Prove that PQ is parallel to SR* | |
| Solution | |
| -------- | |
| The solution to this problem demonstrates the usage of ``Point``, | |
| and basic operations on ``Vector``. | |
| Define a coordinate system | |
| >>> from sympy.vector import CoordSys3D | |
| >>> Sys = CoordSys3D('Sys') | |
| Define point O to be Sys' origin. We can do this without | |
| loss of generality | |
| >>> O = Sys.origin | |
| Define point A with respect to O | |
| >>> from sympy import symbols | |
| >>> a1, a2, a3 = symbols('a1 a2 a3') | |
| >>> A = O.locate_new('A', a1*Sys.i + a2*Sys.j + a3*Sys.k) | |
| Similarly define points B and C | |
| >>> b1, b2, b3 = symbols('b1 b2 b3') | |
| >>> B = O.locate_new('B', b1*Sys.i + b2*Sys.j + b3*Sys.k) | |
| >>> c1, c2, c3 = symbols('c1 c2 c3') | |
| >>> C = O.locate_new('C', c1*Sys.i + c2*Sys.j + c3*Sys.k) | |
| P is the midpoint of OA. Lets locate it with respect to O | |
| (you could also define it with respect to A). | |
| >>> P = O.locate_new('P', A.position_wrt(O) + (O.position_wrt(A) / 2)) | |
| Similarly define points Q, R and S as per the problem definitions. | |
| >>> Q = A.locate_new('Q', B.position_wrt(A) / 2) | |
| >>> R = B.locate_new('R', C.position_wrt(B) / 2) | |
| >>> S = O.locate_new('R', C.position_wrt(O) / 2) | |
| Now compute the vectors in the directions specified by PQ and SR. | |
| >>> PQ = Q.position_wrt(P) | |
| >>> SR = R.position_wrt(S) | |
| Compute cross product | |
| >>> PQ.cross(SR) | |
| 0 | |
| Since the cross product is a zero vector, the two vectors have to be | |
| parallel, thus proving that PQ || SR. | |
| Third product rule for Del operator | |
| =================================== | |
| See | |
| --- | |
| .. [WikiDel] https://en.wikipedia.org/wiki/Del | |
| The Problem | |
| ----------- | |
| Prove the third rule - | |
| \cdot (f \vec v) = f (\nabla \cdot \vec v) + \vec v \cdot (\nabla f)` | |
| Solution | |
| -------- | |
| Start with a coordinate system | |
| >>> from sympy.vector import CoordSys3D, Del | |
| >>> delop = Del() | |
| >>> C = CoordSys3D('C') | |
| The scalar field :math:`f` and the measure numbers of the vector field | |
| v` are all functions of the coordinate variables of the | |
| coordinate system in general. | |
| Hence, define SymPy functions that way. | |
| >>> from sympy import symbols, Function | |
| >>> v1, v2, v3, f = symbols('v1 v2 v3 f', cls=Function) | |
| ``v1``, ``v2`` and ``v3`` are the :math:`X`, :math:`Y` and :math:`Z` | |
| components of the vector field respectively. | |
| Define the vector field as ``vfield`` and the scalar field as ``sfield``. | |
| >>> vfield = v1(C.x, C.y, C.z)*C.i + v2(C.x, C.y, C.z)*C.j + v3(C.x, C.y, C.z)*C.k | |
| >>> ffield = f(C.x, C.y, C.z) | |
| Construct the expression for the LHS of the equation using ``Del()``. | |
| >>> lhs = (delop.dot(ffield * vfield)).doit() | |
| Similarly, the RHS would be defined. | |
| >>> rhs = ((vfield.dot(delop(ffield))) + (ffield * (delop.dot(vfield)))).doit() | |
| Now, to prove the product rule, we would just need to equate the expanded and | |
| simplified versions of the lhs and the rhs, so that the SymPy expressions match. | |
| >>> lhs.expand().simplify() == rhs.expand().doit().simplify() | |
| True | |
| Thus, the general form of the third product rule mentioned above can be proven | |
| using :mod:`sympy.vector`. | |