The book has been designed for a relatively wide audience. We assume a basic knowledge of calculus and some previous skills with a programming language. Even though the book contains a wide range of topics from basic to advanced, the reader will develop the required expertise beyond the basic, as he