This course covers the fundamentals of optimization, from formulating a mathematical optimization problem from a problem description, to solving a mathematical optimization problem using numerical algorithms in optimization software, with an emphasis on convex optimization. The main topics include: linear algebra overview; convex sets and convex functions; convex optimization; duality theory and optimality criteria, Karush-Kuhn-Tucker conditions; reinforcement learning; unconstrained optimization algorithms: gradient method, Newton's method, quasi-Newton methods; constrained optimization algorithms: conditional gradient method, gradient projection method, alternating direction method of multipliers, interior point method, primal-dual method; stochastic gradient descent; distributed optimization; global search algorithms. Students will acquire not only theoretical knowledge of optimization, but also hands-on experience with optimization methods and software through assignments and a project.