This course provides an introduction to Computational Methods currently used in Physics. Modern programming languages (Mathematica, CUDA, C++, Python) allow to face complex problems typical of current researches in Physics, developing from scratch a complete project. A computer code is developed and is then used to compute the requested results, either at symbolic or numerical level.
Expected learning outcomes
The student will learn to: 1) use the advanced features of one or more modern programming languages; 2) structure the logical information flux needed to write a complex computer code; 3) estimate and test the validity of the results obtained with his/her code; 4) present the results and discuss the peculiarities of the methods adopted to solve the problem.
Development of a project, using advanced programming techniques, in one of the following fields. -Mathematica. Realization from scratch of a symbolic manipulation package (generation of graphs and of scattering amplitudes according to the Feynman diagrams technique, or optimization of problems, with a genetic algorithm, like the automatic writing of computer codes, the training of a neural network, the training of an expert system that plays the "Prisoner's dilemma"). -CUDA. Introduction to programming NVIDIA graphics cards in CUDA. Development of parallelized algorithms, able to run on these kind of devices. -Block-chain. Introduction to the cryptography techniques based on bloch-chains. Development of an environment that allows to set smart-contracts. The techniques are then applied to real life problems. -Quantitative finance. Development of a C++ library that allows the simulation of the temporal evolution of financial products and the evaluation of the gain of the contracts related to these products. The simulation codes run also on NVIDIA GPUs.
Prerequisites for admission
Basic knowledge of at least one programming language (C/C++/Fortran). Basic skills for the analysis and description of a problem in algorithmic form.
The course is organised in three parts. In the first part, a series of lectures on modern programming language is delivered, with the aim of providing a background for the problems and the needs that might arise during the development of the final projects. During the lectures each student must have a computer available to immediately reproduce and test the examples proposed. In the second part, the students are split in groups, choosing to focus on a specific programming language. The activity of the groups proceed in parallel . In each group a second series of lectures is delivered, to discuss the detailed features of the chosen programming language, which will be then applied in the final project. In the third part, the topics of the final projects are proposed. Each student chooses on topic and starts individually to develop the code. In the following meetings, the planning of the code, its development, the solution of bugs or of logical problems are faced, discussed and solved with the Professor. The final result is a computer code or a library of routines, whose usage allows to compute the results, numerical or symbolical, which will be illustrated in the final report.
During the course, several topics are introduced and proposed for a more detailed study. Each student has to choose one of these topics and has to elaborate it in the form of a project. The exam consists in the submission of a written report on the project and its oral discussion at the blackboard. The report will describe the problem, the methodologies used in the calculations and/or in the simulations, the final results and their soundness, the prospects to extend the approach to more complex requests in the same computational domain. The final evaluation is based on several factors: the completeness of the project, in its mandatory and complementary items; the level of the checks which have been applied to test the validity of the results presented; the level of the oral presentation of the final results.