From feae72991804193ddd33340ee1cb91178826fe8d Mon Sep 17 00:00:00 2001 From: Nicola Demo Date: Thu, 17 Feb 2022 12:06:46 +0100 Subject: [PATCH 1/3] Update README.md --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ca92662..5eb62aa 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ ## Table of contents * [Description](#description) + * [Problem definition](#problem-definition) + * [Problem solution](#problem-solution) * [Dependencies and installation](#dependencies-and-installation) * [Installing via PIP](#installing-via-pip) * [Installing from source](#installing-from-source) @@ -45,10 +47,63 @@ * [License](#license) ## Description -**PINA** is a Python package providing an easy interface to deal with -*physics-informed neural networks* (PINN) for the approximation of (differential, -nonlinear, ...) functions. Based on Pytorch, PINA offers a simple and intuitive -way to formalize a specific problem and solve it using PINN. +**PINA** is a Python package providing an easy interface to deal with *physics-informed neural networks* (PINN) for the approximation of (differential, nonlinear, ...) functions. Based on Pytorch, PINA offers a simple and intuitive way to formalize a specific problem and solve it using PINN. + +#### Physics-informed neural network +PINN is a novel approach that involves neural networks to solve supervised learning tasks while respecting any given law of physics described by general nonlinear differential equations. Proposed in *"Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations"*, such framework aims to solve problems in a continuous and nonlinear settings. + +#### Problem definition +First step is formalization of the problem in the PINA framework. We take as example here a simple Poisson problem, but PINA is already able to deal with **multi-dimensional**, **parametric**, **time-dependent** problems. +Consider: +$$ +\begin{cases} +\nabla u = \sin(\pi x) \sin(\pi y) & \quad\text{in}\, D,\\ +u = 0 &\quad\text{on}\, \Gamma_1 \cup\Gamma_2 \cup\Gamma_3 \cup\Gamma_4, \\ +\end{cases} +$$ +where $D= [0, 1]^2$ is a square domain, $\Gamma_1 \cup\Gamma_2 \cup\Gamma_3 \cup\Gamma_4$ are the boundaries and $u$ the unknown field. The translation in PINA code becomes a new class containing all the information about the domain, about the `conditions` and nothing more: +```python +class Poisson(SpatialProblem): + spatial_variables = ['x', 'y'] + output_variables = ['u'] + domain = Span({'x': [0, 1], 'y': [0, 1]}) + + def laplace_equation(input_, output_): + force_term = (torch.sin(input_['x']*torch.pi) * + torch.sin(input_['y']*torch.pi)) + return nabla(output_['u'], input_).flatten() - force_term + + def nil_dirichlet(input_, output_): + value = 0.0 + return output_['u'] - value + + conditions = { + 'gamma1': Condition(Span({'x': [-1, 1], 'y': 1}), nil_dirichlet), + 'gamma2': Condition(Span({'x': [-1, 1], 'y': -1}), nil_dirichlet), + 'gamma3': Condition(Span({'x': 1, 'y': [-1, 1]}), nil_dirichlet), + 'gamma4': Condition(Span({'x': -1, 'y': [-1, 1]}), nil_dirichlet), + 'D': Condition(Span({'x': [-1, 1], 'y': [-1, 1]}), laplace_equation), + } +``` + +#### Problem solution +After defining it, we want of course to solve such a problem. The only things we need is a `model`, in this case a feed forward network, and some samples of the domain and boundaries, here using a Cartesian grid. In these points we are going to evaluate the residuals, which is nothing but the loss of the network. +```python +poisson_problem = Poisson() + +model = FeedForward(layers=[10, 10], + output_variables=poisson_problem.output_variables, + input_variables=poisson_problem.input_variables) + +pinn = PINN(poisson_problem, model, lr=0.003, regularizer=1e-8) +pinn.span_pts(20, 'grid', ['D']) +pinn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4']) +pinn.train(1000, 100) + +plotter = Plotter() +plotter.plot(pinn) +``` +After the training we can infer our model, save it or just plot the PINN approximation. ## Dependencies and installation From b0c4f56d95aec8406ec45a2ab8ddc6f282345df5 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 17 Feb 2022 12:21:08 +0100 Subject: [PATCH 2/3] images on readme --- README.md | 14 +++++++------- readme/poisson_plot.png | Bin 0 -> 44885 bytes readme/poisson_problem.png | Bin 0 -> 26673 bytes 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 readme/poisson_plot.png create mode 100644 readme/poisson_problem.png diff --git a/README.md b/README.md index 5eb62aa..1cf69ac 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,10 @@ PINN is a novel approach that involves neural networks to solve supervised learn #### Problem definition First step is formalization of the problem in the PINA framework. We take as example here a simple Poisson problem, but PINA is already able to deal with **multi-dimensional**, **parametric**, **time-dependent** problems. Consider: -$$ -\begin{cases} -\nabla u = \sin(\pi x) \sin(\pi y) & \quad\text{in}\, D,\\ -u = 0 &\quad\text{on}\, \Gamma_1 \cup\Gamma_2 \cup\Gamma_3 \cup\Gamma_4, \\ -\end{cases} -$$ -where $D= [0, 1]^2$ is a square domain, $\Gamma_1 \cup\Gamma_2 \cup\Gamma_3 \cup\Gamma_4$ are the boundaries and $u$ the unknown field. The translation in PINA code becomes a new class containing all the information about the domain, about the `conditions` and nothing more: +

+ Poisson approximation +

+where *D* is a square domain, *Gamma*s are the boundaries and *u* the unknown field. The translation in PINA code becomes a new class containing all the information about the domain, about the `conditions` and nothing more: ```python class Poisson(SpatialProblem): spatial_variables = ['x', 'y'] @@ -104,6 +101,9 @@ plotter = Plotter() plotter.plot(pinn) ``` After the training we can infer our model, save it or just plot the PINN approximation. +

+ Poisson approximation +

## Dependencies and installation diff --git a/readme/poisson_plot.png b/readme/poisson_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3d6d8d6f3bc67b38b8c30710046fbcb6038ef3 GIT binary patch literal 44885 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 CY1S72 literal 0 HcmV?d00001 diff --git a/readme/poisson_problem.png b/readme/poisson_problem.png new file mode 100644 index 0000000000000000000000000000000000000000..59312750eafcb1577ca6b084c9f4c59193e9f071 GIT binary patch literal 26673 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 literal 0 HcmV?d00001 From add909743b4cae9ef2dacf0c016d4abbb9d33499 Mon Sep 17 00:00:00 2001 From: Nicola Demo Date: Thu, 17 Feb 2022 12:29:01 +0100 Subject: [PATCH 3/3] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1cf69ac..d5ee953 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,7 @@ * [Examples and Tutorials](#examples-and-tutorials) - -* [How to cite](#how-to-cite) - * [References](#references) +* [References](#references) * [Authors and contributors](#authors-and-contributors) * [How to contribute](#how-to-contribute) @@ -56,9 +54,10 @@ PINN is a novel approach that involves neural networks to solve supervised learn First step is formalization of the problem in the PINA framework. We take as example here a simple Poisson problem, but PINA is already able to deal with **multi-dimensional**, **parametric**, **time-dependent** problems. Consider:

- Poisson approximation + Poisson approximation

where *D* is a square domain, *Gamma*s are the boundaries and *u* the unknown field. The translation in PINA code becomes a new class containing all the information about the domain, about the `conditions` and nothing more: + ```python class Poisson(SpatialProblem): spatial_variables = ['x', 'y'] @@ -85,6 +84,7 @@ class Poisson(SpatialProblem): #### Problem solution After defining it, we want of course to solve such a problem. The only things we need is a `model`, in this case a feed forward network, and some samples of the domain and boundaries, here using a Cartesian grid. In these points we are going to evaluate the residuals, which is nothing but the loss of the network. + ```python poisson_problem = Poisson() @@ -100,9 +100,9 @@ pinn.train(1000, 100) plotter = Plotter() plotter.plot(pinn) ``` -After the training we can infer our model, save it or just plot the PINN approximation. +After the training we can infer our model, save it or just plot the PINN approximation. Below the graphical representation of the PINN approximation, the analytical solution of the problem and the absolute error, from left to right.

- Poisson approximation + Poisson approximation