=========================
General examples of usage
=========================

This section details the solution of two basic problems in vector
math/calculus using the :mod:`diofant.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 diofant.vector import CoordSysCartesian
  >>> Sys = CoordSysCartesian('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

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

The Problem
-----------

Prove the third rule -
`\nabla \cdot (f \vec v) = f (\nabla \cdot \vec v) + \vec v \cdot (\nabla f)`

Solution
--------

Start with a coordinate system

  >>> from diofant.vector import CoordSysCartesian
  >>> C = CoordSysCartesian('C')

The scalar field `f` and the measure numbers of the vector field
`\vec v` are all functions of the coordinate variables of the
coordinate system in general.
Hence, define Diofant functions that way.

  >>> v1, v2, v3, f = symbols('v1 v2 v3 f', cls=Function)

``v1``, ``v2`` and ``v3`` are the `X`, `Y` and `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 ``C.delop``.

  >>> lhs = (C.delop.dot(ffield * vfield)).doit()

Similarly, the RHS would be defined.

  >>> rhs = ((vfield.dot(C.delop(ffield))) + (ffield * (C.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 Diofant 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:`diofant.vector`.
