**Self-Paced Creating PDE/FDM Software Frameworks and Applications in C++11 by Daniel Duffy**

**Self-Paced course****Location: Globally online****This course can be included as part of the Annual Subscription Service.****This course can be taken In House**

**Outline:**

The goal of this hands-on course is to introduce the new language features in C++ 11 and apply them to the design and implementation of frameworks to approximate the solution of partial differential equations (PDE) using the finite difference method (FDM). We design the frameworks with reusability and extendibility in mind so that you add your own solvers to the framework or apply design techniques to other kinds of applications in computational finance. In particular, we combine the object-oriented and functional programming models that C+11 supports and we encapsulate the algorithms in a next-generation design patterns object network.

The course style and contents have the same level of detail as in Daniel J. Duffy’s courses on www.datasimfinancial.com and www.datasim.nl.

**Topics Covered**

- New language features in C++11.
- Applying C++11 in computational finance.
- Functional programming and multi-paradigm design.
- Creating software frameworks for one-factor (and two-factor) PDE models.
- Modern FDM: ADI, ADE, MOL, Crank Nicolson.

**Benefits of Course**

- New language features in C++11.
- Being effective with C++11; what to use now and what to use later.
- Incremental build-up of topics; learn step-by-step project.
- Practical exercises and end-of-course project.
- Modern C++11, design and PDE models.

**Prerequisites**

We assume that the student has a good working knowledge of C++ as well as a good mathematical background. In particular, some knowledge of finite differences for PDEs is assumed. This is a course on bringing C++11 and PDE/FDM together. If you have queries on this course please do not hesitate to contact me dduffy AT datasim.nl.

**Originator and Trainer**

Daniel J. Duffy is founder of Datasim Financial. He has been using C++ since 1989 and has a PhD in Numerical Analysis from Trinity College (Dublin University).

**Lectures:**

**Lecture 1. New Fundamental Language Features in C++11**

In this lecture we discuss the new syntax that makes C++11 a ‘better C++’ in terms of understandability and reliability of code. Topics include: *auto*, *decltype*, *noexcept*, *constexpr*, *nullptr*, *uniform initialization* and *initializer lists*, *template typedef*, *default template parameters*, *new fundamental data types*.

**Lecture 2. Advanced Language Features in C++11**

In this lecture we discuss features that improve the efficiency and robustness of C++ code. Topics include: *variadic templates*, *move semantics* A-Z and *smart pointers*. We shall use these features when developing PDE models in C++.

**Lecture 3. Introduction to Functional Programming in C++11**

C+11 is a multiparadigm programming language. In this lecture we give a short overview of the functional programming (FP) model and how C++11 supports it. Topics include: FP essentials, from function pointers to *universal function wrappers*, *higher-order functions*, *strict and delayed variables*, C++ *binders* and *lambda functions*.

We shall see how powerful and useful the functional programming model is when developing mathematical algorithms for the finite difference method.

**Lecture 4. Data Structures**

In this lecture we introduce a number of new data types. Topics include: *tuple*, *union*, *fixed-size arrays* and *unordered containers*. We show some examples of use, including how to use them in design patterns code.

**Lecture 5. Applied Functional Programming in C++11**

In this lecture we apply C++ to the creation of next-generation design patterns and classes that model a number of essential entities in the PDE software framework. The focus is on creating code that is portable and that can be extended to suit a wide range of PDE models. It is the combination of the object-oriented and functional programming models that provides the foundation for flexible software. Topics include: implementing *Bridge*, *Whole-Part*, *Adapter* and other design patterns.

**Lecture 6. Creating Software Frameworks**

In this lecture we introduce a framework that can accommodate one-factor (and later two-factor) option pricing problems. The framework is based on experience with several software projects that have proved to be successful. The focus is on applying and integrating the topics from the first five lectures to produce customisable applications. Of particular importance is applying system patterns such as *Layers *and *Builder*.

**Lecture 7. One-Factor Option Pricers**

In this lecture we implement several popular finite difference schemes and we add them to the framework. Included are *Crank-Nicolson*, *implicit Euler* and *Richardson extrapolation*. We discuss how to model boundary conditions and payoff functions. We also pay attention to the choice of matrix solver (for example, *Eigen*, *Boost uBLAS* or minimal library) and efficiency issues.

**Lecture 8. Advanced Option Pricers**

We elaborate on the topics in lecture 7 by discussing nonlinear PDEs in computational finance, for example *uncertain volatility models* (UVM), anchoring (*Asian-style problem*) and early exercise features. We use both the *Method of Lines* (MOL) in Boost and *Alternating Direction Explicit* (ADE) to produce high-order accurate and efficient schemes.

**Lecture 9. Two-Factor Option Pricing Models**

In this lecture we give an overview of the main finite difference methods to price two-factor option problems. Topics include: *Alternating Direction Implicit* (ADI), ADE, MOL and the *Method of Fractional* *Steps* (‘Soviet Splitting’). We set up the systems in each case and we give examples in comptutational finance such as baskets, Heston and Asian-style PDEs.

**Lecture 10. Project Discussion**

The main focus of the projects is to take a focused and well-defined problem, solve it with one or more finite difference schemes and implement the schemes using C++11 and related design patterns.

Some suggestions:

- The Method of Lines (MOL) using the Boost C++
*odeint*library. - PDEs with uncertain parameters.
- ADE for stochastic volatility models.
- Build a prototypical customisable framework in C++11 for two-factor PDE problems.

**The final project will be marked with feedback and a pass or fail will be given when you take the online course. One retake is allowed if you fail.**

**PRMIA Certification:**

The Professional Risk Managers' International Association (PRMIA) is a non-profit professional association, governed by a Board of Directors directly elected by its global membership, of nearly 90,000 members worldwide. PRMIA is represented globally by over 65 chapters in major cities around the world, led by Regional Directors appointed by PRMIA's Board

**The Programming School will be fully certified by PRMIA**

**CPD Certification**

You will be able to receive up to **162**** CPD points** **(12 hours of structured CPD and 100-150 hours of self-directed CPD)** for completing this course.

The CPD Certification Service was established in 1996 as the independent CPD accreditation institution operating across industry sectors to complement the CPD policies of professional and academic bodies. The CPD Certification Service provides recognised independent CPD accreditation compatible with global CPD principles.