# Introduction aux outils numériques

Nous allons faire un survol de quelques commandes que nous utiliserons dans les autres TP numériques. 

## Objectifs de cette séance

Comme vous avez tous une formation de base en Matlab, nous allons nous appuyer sur cela pour réaliser quelques opérations simples que nous employerons sur des problèmes d'aérodynamique par la suite. 

Réalisez les exercices avec Matlab et dans ce notebook pour vous familiariser avec les commandes python.

## Modules

Comme Matlab, Python est langage interprété. On s'appuie sur des fonctions pré-compilées pour rendre les opérations de calcul efficace. 

Contrairement à Matlab, les modules ne sont pas chargés automatiquement. Il faut donc toujours importer ce dont on a besoin. Dans le cadre de ce cours, nous aurons besoin essentiellement de `numpy` et `matplotlib`.

[NumPy](https://numpy.org) est une bibliothèque d'objets et de fonctions adaptés au calcul vectoriel c'est-à-dire à des opérations sur des listes ou tableaux (N-dimensions) homogènes de nombres (_array_). Grace à cette bibliothèque, les opérations principales que l'on réalise avec Matlab sont réalisable sous Python. Souvent les fonctions ont le même nom. 

[MatplotLib](https://matplotlib.org/) est une bibliothèque d'objets et de fonctions pour réaliser des représentations graphiques 2D comme dans Matlab (et certainement même plus !). On utilise le sous-module `pyplot` qui contient tout ce dont on a besoin.

Pour charger un module, on utilise la fonction `import` et on lui donne un petit nom pour raccourcir nos appels. 


```python
import numpy as np
import matplotlib.pyplot as plt
```

Pour avoir des graphiques de bonne qualité, nous utilisons les paramètres suivants.


```python
plt.rcParams['figure.autolayout'] = True
plt.rcParams['figure.dpi'] = 100
plt.rcParams['font.size'] = 12
```

Voilà vous êtes prêt ! 

## Exercice 1 - Intersection de deux droites

On souhaite calculer le point d'intersection de deux droites définies par les équations suivantes : 
\begin{equation}
y = 2 x -5 \hspace{2cm} \text{et} \hspace{2cm} 
y = -x + 3
\end{equation}

1. Construisez les tableaux suivants : 
  * `x` de 20 points uniformément répartis de -5 à 5. Utilisez la fonction `linspace` de `numpy`.
  * `y1` et `y2` les ordonnées des points aux abscisses `x` des points sur les droites 1 et 2. 


```python

```

2. Tracez les deux droites ainsi définies : 
  * La droite 1 en bleu, la droite 2 en rouge et en pointillés.
  * Affichez une grille, une légende et des labels sur les axes.


```python

```

3. Définissez le problème matriciel $M X = B$ à résoudre pour trouver l'intersection des droites et créez les tableaux numpy `M` et `B`. Utilisez la fonction `array`, vérifiez les formes avec `shape` et utilisez `reshape` pour corriger. 


```python

```

4. Résolvez le problème en utilisant le sous-module d'algèbre linéaire [`linalg`](https://numpy.org/doc/stable/reference/routines.linalg.html#solving-equations-and-inverting-matrices) de `numpy`. Le produit matriciel (`dot`) est implémenté avec le symbole `@`


```python

```

5. Reprennez la figure de la question 2 et ajoutez le point d'intersection avec un symbole vert. Si l'intersection n'est pas correcte, vérifiez vos matrices et leurs formes. Enregistrez la figure sous un format image. 


```python

```

## Exercice 2 - Les profils NACA 4 chiffres

Les profils NACA sont des formes d'aile testées par le [National Advisory Committee for Aeronautics](https://fr.wikipedia.org/wiki/National_Advisory_Committee_for_Aeronautics). C'est des profils dont la forme correspond à une équation mathématique dont les formes sont paramétrées et dont les coefficients aérodynamiques en fonction de l'incidence (angle d'attaque) ont été mesurés de manière systématique en soufflerie. 

Ici on s'intéressera aux profils dits 4 chiffres symmétrique `NACA00XX`. Il sont définis par 2 paramètres : 
  * La corde du profil $c$ (distance bord d'attaque/bord de fuite).
  * L'épaisseur maximale du profil est caractérisée par le paramètre $t$ qui est un pourcentage de la corde : 
\begin{equation}
t = \frac{\texttt{XX}}{100}
\end{equation}

On définit la coordoonnée $x_c$ qui varie de 0 à 1 le long de la corde. La demi-épaisseur du profil $y_t$ (distance entre ses deux côtés) est alors paramétrée en fonction de cette coordonnée par l'équation suivante : 
\begin{equation}
y_t = 5 t \left( 0.2969 \sqrt{x_c} - 0.1260 \,  x_c - 0.3516 \, x_c^2 + 0.2843 \, x_c^3 - 0.1036 \, x_c^4\right)
\end{equation}

Ainsi un profil dont la forme pourra être obtenue grace au deux courbes (redimmensionnées): 

\begin{align}
x_{up} &= x_c \, c   & et \hspace{1cm}  y_{up} &= + y_t \, c \\
x_{down} &= x_c \, c  & et \hspace{1cm}  y_{down} &= - y_t \, c 
\end{align}

Pour les questions suivantes, n'hésitez pas à contacter l'enseignant. Les questions sont choisies pour vous faire réfléchir et découvrir des options des modules.

1. Construisez et tracez le profil NACA007 de corde 12 cm avec 15 points de chaque côté. Déterminez l'épaisseur maximum obtenue la position sur la corde où ce point est atteint. Que pouvez vous dire ?


```python
# Parametres du profil

# Parametre de discretisation

```


```python
# Coordonnee de corde

# Epaisseur

```


```python
# Extrados

# Intrados

```


```python
# Epaisseur max

```


```python
# Trace dimensionnel et adimensionne par la corde

```

2. Créez une fonction qui permette d'obtenir les coordonnées dimensionnées à partir des paramètres du profil. Vous pourrez utiliser un distionnaire pour retourner les tableaux nécessaires. Tracez sur une même graphique les profils `NACA0005`, `NACA0012` et `NACA0017` de corde 10 cm, 5 cm et 7.5 cm respectivement. 


```python
def NACA00_shape(chiffres34,corde,npts=15):
    
    return 
```


```python
# Traces
```

3. Que peut-on faire pour rendre les tracés pour lisse ? Réalisez un zoom sur les 5 premiers millimètres de corde et commentez.


```python

```


```python
# Nouveau trace
```

4. La forme du bord d'attaque et du bord de fuite ont un rôle crucial sur la portance d'un profil aérodynamique. Il est parfois utile d'utiliser une distribution de points non uniforme pour calculer les efforts aérodynamiques. 
Reprennez la fonction de la question 2 et ajoutez une option pour avoir une distribution cosinusoidale selon : 
\begin{align}
x_c = \frac{1}{2}\left(1 - \cos{\zeta}\right) \hspace{1cm} \text{avec : } \hspace{0.2cm} \zeta \in [0, \pi]
\end{align}


```python
def NACA00_shape_improved(chiffres34,corde,npts=15,distri='cos'):
    
    
    return 
```

5. Pour les 3 mêmes profils de la question 2, avec une discretisation cosinusoidale de 41 points, réalisez un zoom sur les 5 premiers millimètres de corde et comparez à la distribution uniforme avec le même nombre de points. Exportez la figure en image. 


```python

```


```python
# Traces cote a cote 
fig, ax = plt.subplots(1,2,constrained_layout=True,tight_layout=False,figsize=(8,4))


plt.show()
```

## Exercice 3 - Calcul symbolique

Si vous n'avez pas de TI, sachez que le module [SymPy](https://www.sympy.org) vous permet de faire du calcul symbolique. Nous allons voir quelques fonction de base qui pourront vous être pour la théorie 2D et 3D des profils. 

À nouveau tout d'abord il faut l'importer. On active l'affichage sous forme formel.


```python
import sympy as sb
sb.init_printing()
```

On souhaite calculer la dérivée et la primitive de la fonction suivante : 
\begin{align}
 \int{{\left(\cos{\theta}\right)}^3 \, d\theta}
\end{align}

1. Les variables formelles sont des objets de type `Symbol`. Définissez le symbole $\theta$.


```python
theta = sb.Symbol('theta')
```


```python
theta
```

2. Calculez la dérivée première et seconde de ${\left(\cos{\theta}\right)}^3$  à l'aide de la fonction `diff`


```python
f = sb.cos(theta)**3
```


```python
fp = sb.diff(f,theta)
fp
```


```python
fpp = sb.diff(fp,theta)
fpp
```


```python
fpp_2 = sb.diff(f,theta,2)
fpp_2
```

3. Calculez la primitive de ${\left(\cos{\theta}\right)}^3$ à l'aide de la fonction `integrate`


```python
I = sb.integrate(f,theta)
I
```

0fb35620bdd7afb180d15189ac4069a7b6c49791
ipynb
Jupyter Notebook
enonces/introduction/IntroNum.ipynb
sanjosem/mec757_students
47ec07d446ecc84984cf5ff66200e22db25d1721
BSD-3-Clause
enonces/introduction/IntroNum.ipynb
sanjosem/mec757_students
47ec07d446ecc84984cf5ff66200e22db25d1721
BSD-3-Clause
enonces/introduction/IntroNum.ipynb
sanjosem/mec757_students
47ec07d446ecc84984cf5ff66200e22db25d1721
BSD-3-Clause
Qwen/Qwen-72B
1. YES
2. YES