Aller au contenu

Jour 19 : calepins scientifiques avec org-mode

·878 mots·5 mins·
eeame
Auteur
eeame

Réalise un calepin dynamique avec org-babel!

Introduction
#

Un document scientifique ou qui traite d’informatique contient des explications, des démonstrations, du code informatique, des données. Il est très pratique de travailler sur un document qui lie tous ces éléments ensembles… Une des difficultés vient du code, l’idéal c’est de pouvoir l’exécuter et que les résultats viennent mettre à jour le document automatiquement. org-mode apporte une réponse à cette problématique via l’extension babel. Cette extension permet de réaliser des calepins dynamiques et exportable en pdf.

Voici un exemple de calepin réalisé avec org-mode.1

Méthode de Héron
#

La méthode de Héron permet de calculer une racine carrée.

Approche géométrique
#

Il est intéressant de mettre en évidence le principe géométrique sous-jacent à la méthode. Chez les mathématiciens grecs, extraire la racine carrée de \(a\) revient à trouver un carré dont l’aire soit \(a\). En prenant un rectangle de côté arbitraire \(x\) et de même aire, il est nécessaire que l’autre côté ait pour longueur \(\frac a x\). Pour le rendre « moins rectangle », il suffit de considérer un nouveau rectangle dont la longueur est la moyenne arithmétique des deux côtés précédents soit \(\dfrac {x+\frac a x}2\) et dont l’aire reste \(a\).

En réitérant infiniment le processus, le rectangle se transforme petit à petit en un carré de même aire. Cette constatation est à la base de la méthode de Héron

Figure 1 : La méthode de Héron

Principe
#

Pour déterminer la racine carrée du nombre (positif) \(a\), il convient de considérer la suite définie par récurrence de la façon suivante : \[\forall n\in \mathbb {N} \quad x_{n+1}= \frac {x_n + \frac {a}{x_n}}2\]

de premier terme \(x_0>0\) choisi si possible « assez proche » de \(\sqrt a\).

La suite ainsi obtenue est une suite décroissante à partir du second terme, convergeant vers \(\sqrt a\).

Application à \(\sqrt 2\)
#

def heron(a:float=2,x0:int=1,n:int=5):
    s:float =x0
    for i in range(n):
        s=(s+a/s)/2
    return s
heron()

1.414213562373095

Écart avec \(\sqrt{2}\)

from math import sqrt
sqrt(2)


abs(sqrt(2)-heron())

2.220446049250313e-16

Astuce: Pour obtenir la console IPython , place-toi dans le bloc de code puis C-c C-v C-z.

C’est très pratique tu peux expérimenter dans la console et écrire ton document en parallèle.

Application aux grands nombres
#

La fonction \(\sqrt{}\) ne permet pas de calculer la racine carrée pour les grands nombres.

sqrt(10**2025)

Renvoie une erreur…

OverflowError Traceback (most recent call last) Cell In[259], line 1 —-> 1 sqrt(10**2025)

OverflowError: int too large to convert to float

Essayons une autre approche…

\(\sqrt{10^{2025}}=\sqrt{10}\sqrt{10^{2024}}=\sqrt{10}\cdot10^{1012}\simeq 3\cdot 10^{1012}\).

Ainsi \(3\cdot 10^{1012}\) est un entier proche de \(\sqrt{10^{2025}}\).

On cherche deux entiers consécutifs qui encadre \(\sqrt{10^{2025}}\).

On va travailler uniquement avec des entiers… d’où la division entière en python : // .



def heronGN(a:int=2,x0:int=1):
    s:int =0
    t:int=x0
    while t!=s:
        s=t
        t=int((s+a//s)//2)

    return s

ra=heronGN(10**2025,3*10**1012)

Écart relatif entre \(ra^2\) et \(a\).


(ra**2-10**2025)/10**2025

-0.0

Écart relatif entre \((ra+1)^2\) et \(a\).


((ra+1)**2-10**2025)/10**2025

0.0

Donc \(\sqrt{10^{2025}}\) vaut à une unité près par défaut:

ra

31622776601683793319988935444327185337195551393252168268575048527925944386392382213442481083793002951873472841528400551485488560304538800146905195967001539033449216571792599406591501534741133394841240853169295770904715764610443692578790620378086099418283717115484063285529991185968245642033269616046913143361289497918902665295436126761787813500613881862785804636831349524780311437693346719738195131856784032312417954022183080458728446146002535775797028286440290244079778960345439891633492226526120677926516760310484366977937569261557205003698949094694218500073583488446438827311092891090423480542356534039072740197865437259396417260013069900009557844631096267906944183361301813028945417033158077316263863951937937046547652206320636865871978220493124260534541116093569798281324522970007988835237595853285792513629646865114976752171234595592380393756251253698551949553250999470388439903364661654706472349997961323434030218570521878366763457895107329828751579452157716521396263244383990184845609357626020316768042407

Python, matplotlib et seaborn
#

Matplotlib
#

Matplotlib est une bibliothèque très populaire pour réaliser des graphiques.

import numpy as np
from numpy import linalg as la
import matplotlib
import matplotlib.cm as cm
import matplotlib.pyplot as plt


xmin=-1
xmax=2.3
ymin=-1
ymax=2.5
delta=0.1
def g(x,y):
    return (x**(2)+y-2)*(y**(2)-x-1)**(2)+x**(2)-2*y+2

X=np.arange(xmin,xmax,delta)
Y=np.arange(ymin,ymax,delta)
U, V = np.meshgrid(X, Y)
Z=g(U,V)

fig = plt.figure(figsize=plt.figaspect(1))
ax = fig.add_subplot(1, 1, 1, projection='3d')

# plot a 3D surface like in the example mplot3d/surface3d_demo

surf = ax.plot_surface(U, V, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)
#ax.set_zlim(-1.01, 1.01)

fig.colorbar(surf, shrink=0.5, aspect=10)
plt.savefig('images/plot3d.png')

Seaborn
#

Seaborn est une autre bibliothèque, qui repose sur matplotlib, elle propose une syntaxe de plus haut niveau qui simplifie la création de graphique; notamment dans le domaine statistique.

import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(5, 5))
tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="tip", data=tips)
plt.savefig('images/boxplot2.png')

D’autres exemples d’utilisation de org-babel
#

D’autres types de bloc exécutables sont disponibles

Xcas
#


developper((x+2)^7)

\(x^{7}+14 x^{6}+84 x^{5}+280 x^{4}+560 x^{3}+672 x^{2}+448 x+128\)

Plantuml
#

Graphe
#

Figure 2 : Un graphe

Diagramme de Gantt
#

https://plantuml.com/gantt-diagram

Figure 3 : Un diagramme de Gantt

Et bien d’autres…
#

https://orgmode.org/worg/org-contrib/babel/languages/index.html

Tableau 1: Core languages supported by Babel (extract.)
Language Identifier Documentation Maintainer
C C ob-doc-c Thierry Banel
C++ cpp ob-doc-c Thierry Banel
Calc calc Tom Gillespie
Clojure clojure ob-doc-clojure Daniel Kraus
CSS css ob-doc-css
ditaa ditaa ob-doc-ditaa
Gnuplot gnuplot ob-doc-gnuplot Ihor Radchenko
Graphviz dot ob-doc-dot Justin Abrahms
Java java ob-doc-java Ian Martins
Julia julia ob-doc-julia Pedro Bruel
LaTeX latex ob-doc-LaTeX
LilyPond ly ob-doc-lilypond
Lisp lisp ob-doc-lisp
Lua lua ob-doc-lua
MATLAB® matlab ob-doc-octave-matlab
Maxima max ob-doc-maxima
Node.js js ob-doc-js
OCaml ocaml
Octave octave ob-doc-octave
PlantUML plantuml ob-doc-plantuml
Python python ob-doc-python Jack Kamm
R R ob-doc-R Jeremie Juste
Ruby ruby
SQLite sqlite ob-doc-sqlite Nick Savage

Encore une fois, nous venons juste d’effleurer les possibilités d’org-babel.

Personnalisation
#

Tu remarqueras que si tu exportes le document C-c C-e l o, le résultat n’est pas mal, mais il y a des imperfections…

Par exemple, l’affichage du nombre \(ra\) avec ses 1 013 chiffres pose problème.

Plusieurs possibilités s’offrent à toi:

  1. Modifier le document LaTeX. C’est une solution facile, si tu maîtrises LaTeX, mais pas recommandée car après tu dois gérer deux documents qui vont être dé-synchroniser.
  2. Tordre un peu org-mode pour obtenir le résultat attendu. Cela nécessite de bien connaître LaTeX et babel

ra

\numprint{31622776601683793319988935444327185337195551393252168268575048527925944386392382213442481083793002951873472841528400551485488560304538800146905195967001539033449216571792599406591501534741133394841240853169295770904715764610443692578790620378086099418283717115484063285529991185968245642033269616046913143361289497918902665295436126761787813500613881862785804636831349524780311437693346719738195131856784032312417954022183080458728446146002535775797028286440290244079778960345439891633492226526120677926516760310484366977937569261557205003698949094694218500073583488446438827311092891090423480542356534039072740197865437259396417260013069900009557844631096267906944183361301813028945417033158077316263863951937937046547652206320636865871978220493124260534541116093569798281324522970007988835237595853285792513629646865114976752171234595592380393756251253698551949553250999470388439903364661654706472349997961323434030218570521878366763457895107329828751579452157716521396263244383990184845609357626020316768042407}