Numerical computations historically play a crucial role in natural sciences and engineering. These days however, it’s not only traditional «hard sciences»: whether you do digital humanities or biotechnology, whether you design novel materials or build artificial intelligence systems, virtually any quantitative work involves some amount of numerical computing . These days, you hardly ever implement the whole computation yourselves from scratch. We rely on libraries which package tried-and-tested, battle-hardened numerical primitives. It is vanishingly rare however that a library contains a single pre-packaged routine which does all what you need. Numerical computing involves assembling these building blocks into computational pipelines. This kind of work requires a general understanding of basic numerical methods, their strengths and weaknesses, their limitations and their failure modes. And this is exactly what this course is about. It is meant to be an introductory, foundational course in numerical analysis, with the focus on basic ideas. We will review and develop basic characteristics of numerical algorithms (convergence, approximation, stability, computational complexity and so on), and will illustrate them with several classic problems in numerical mathematics. You will also work on implementing abstract mathematical constructions into working prototypes of numerical code. Upon completion of this course, you will have an overview of the main ideas of numerical computing, and will have a solid foundation for reading up on and working with more advanced numerical needs of your specific subject area. As prerequisites for this course, we assume a basic command of college-level mathematics (linear algebra and calculus, mostly), and a basic level of programming proficiency.