Article épinglé

mercredi 26 août 2020

Probabilités - Paradoxe de Parrondo

Le paradoxe de Parrondo est un paradoxe de la théorie des jeux qui est bien souvent décrit comme « une stratégie qui gagne avec des jeux perdants ». Elle a été nommée du nom de son créateur Juan Parrondo, un physicien de l'Université complutense de Madrid. Une description mathématiquement plus rigoureuse est :

Étant donné 2 jeux, chacun ayant une probabilité de perte plus grande que celle de gain, il est possible de construire une stratégie gagnante en jouant les 2 jeux alternativement.

Ce paradoxe est inspiré par les propriétés mécaniques des cliquets, instruments à dents de scie, couramment utilisés en automobile et dans les montres que l'on remonte manuellement.




lundi 24 août 2020

Maths et stats - extrapolation d'une population à partir d'un échantillon

 

https://github.com/exo7math/python2-exo7/blob/master/bigdata/bigdata-1.pdf


Activité 3 (La formule des tanks).

Objectifs : déterminer la taille N d’une série 1, . . . ,N en ne connaissant que quelques numéros

tirés au hasard. En plein milieu de la seconde guerre mondiale les Allemands produisent un nouveau tank plus performant. Les Alliés s’inquiètent car ils ne savent pas combien de ces nouveaux tanks sont produits. Les services de renseignements estiment la production à 1500 tanks par mois. Que disent les mathématiques ? Les Alliés ont intercepté 4 tanks produits le même mois et qui portent les numéros :

143 - 77 - 198 - 32

Combien de tanks ont été produit ce mois ?

Modélisation. 

Sachant que les tanks sont numérotés de 1 à N chaque mois, à quelle valeur peut être estimée la production mensuelle N, connaissant un échantillon de k numéros [n1, n2, . . . , nk] ?

1. La formule des tanks. On note m le maximum des éléments de l’échantillon. On note k la taille de l’échantillon. Alors la formule des tanks estime : N = m + m/k -1

Programme cette formule en une fonction formule_tanks(echantillon) qui renvoie cette estimation de N. Quelle est ton estimation pour le nombre de tanks ?

2. Le double de la moyenne. On peut essayer d’autres estimations. Par exemple on peut estimer N comme le double de la moyenne de l’échantillon. Programme une fonction double_moyenne(echantillon) qui renvoie cette nouvelle estimation. Compare avec la formule des tanks.

Pour tester l’efficacité de la formule des tanks on va faire le cheminement inverse : on fixe un entier N, on choisit au hasard un échantillon de k éléments et on regarde si nos formules permettent de bien approcher N.

3. Tirage sans remise. Programme une fonction tirage_sans_remise(N,k) qui renvoie une liste de k entiers différents compris entre 1 et N (inclus).

4. Erreurs. Programme une fonction erreurs(N,k) (ou mieux erreurs(N,k,nb_tirages=1000)) qui calcule l’erreur moyenne commise par nos formules. Pour cela :

  • Effectue un tirage sans remise de k entiers plus petits que N.
  • Calcule la valeur N1 obtenue à partir de cet échantillon par la formule des tanks.
  • Calcule l’erreur commise e = |N − N1|.

En faisant ceci pour un grand nombre de tirages, calcule l’erreur moyenne commise. Fais le même travail avec l’autre formule et renvoie les deux erreurs moyennes.

Pour 20 entiers plus petits que 1000 (k = 20 et N = 1000) quelle est la meilleure formule et à quelle erreur peut-on s’attendre ?

À la fin de la guerre les registres Allemands ont été récupérés et indiquaient une production de 245 chars mensuels ! Cette formule est aussi utilisée pour estimer la production d’un produit (par exemple d’un téléphone) à partir des numéros de série.

Solution pour les 3 premières questions ici
https://www.ipa-troulet.fr/cours/attachments/article/542/correction.txt

Cheminement et solution du 4 là
https://www.ipa-troulet.fr/cours/attachments/article/542/exo%204%20tank.odt


samedi 22 août 2020

CNRS - Courbe de Gauss

Pour info, dans le paragraphe du dessous 3 liens vers des articles du CNRS.

Pour plus de précisions et de renseignements sur la gaussienne (aussi connue sous le nom de « la courbe en cloche »), nous vous conseillons, selon votre niveau et/ou votre intérêt, de lire ça (piste verte) ou ça (piste bleue) ou bien, pour les plus téméraires, ça (piste noire). Il s’agit du même article écrit pour trois niveaux de lecture différents. 


Extrait de la piste verte:

Une récréation inventée

Le second exemple est une histoire inventée, mettant en scène un mathématicien des années 1900 et son boulanger, qui lui livre tous les jours un pain qui pèse en principe deux livres. Tous les jours le mathématicien enregistre devant témoins le poids du pain livré. Après une année, il intente procès à son boulanger pour production frauduleuse, et gagne le procès : le poids moyen du pain livré est 980g., avec un écart-type de 20g...

Le calcul permet alors de montrer qu’on peut être presque sûr que le boulanger est un escroc et que ses pains ne font pas 1 kg en moyenne, comme il le prétend. En fait on peut même estimer la probabilité que le boulanger ne soit pas un escroc à 1022 : quasiment impossible ! L’histoire est inventée car on ne sait pas si un tribunal prendrait en compte ce genre de considérations !

L’année suivante, le boulanger ne lui livre que des pains pesant plus d’un kilogramme. Le mathématicien intente procès pour production frauduleuse et gagne encore : l’enregistrement montre une distribution des poids des pains livrés suivant la queue à partir de 1000 de la gaussienne précédente, centrée en 980 et d’écart-type 20 (la zone bleue sur la figure suivante). Donc le boulanger n’a pas modifié sa production. Simplement, il pesait le pain avant de le livrer au mathématicien procédurier et si ce choix pesait moins d’un kilogramme, il en choisissait un autre jusqu’à ce qu’il trouve un pain auquel le mathématicien n’aurait rien à reprocher. Malins ces mathématiciens ;-)

JPEG - 178.2 ko

vendredi 21 août 2020

CNRS - Covid-19 Modélisation d'une épidémie

Liens:

  • https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html
    La simulation suivante illustre la propagation du Coronavirus Covid-19 et est interactive, elle n’est pas basée directement sur le modèle SIR mais sur un modèle plus compliqué (qui prend en compte plus de paramètres). Cette simulation a en effet des points communs avec le modèle SIR (3 sous-populations : saines, infectées, retirées) mais également des différences majeures : elle est discrète (chaque point représente une personne) et aléatoire (afin de modéliser les déplacements des personnes et leurs potentiels contacts). Elle permet ainsi de voir plus précisément l’impact de la modification des paramètres sur l’évolution du virus
  • https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-2.html
    C’est le cas de la simulation interactive suivante qui est basée sur un modèle plus complexe que le seul modèle SIR : elle reprend les trois sous-populations (S, I et R) ainsi que la natalité et la mortalité du modèle SEIR, mais également les déplacements et les contacts des individus modélisés de manière aléatoire. Le confinement y est de plus pris en compte.

Voir en bas des articles pour jouer avec les simulations 


lundi 20 juillet 2020

Python fractal et turtle

Résultat

Script

import turtle
MINIMUM_BRANCH_LENGTH = 5
def build_tree(t, branch_length, shorten_by, angle):
  if branch_length > MINIMUM_BRANCH_LENGTH:
    t.forward(branch_length)
    new_length = branch_length - shorten_by
    t.left(angle)
    build_tree(t, new_length, shorten_by, angle)
    t.right(angle * 2)
    build_tree(t, new_length, shorten_by, angle)
    t.left(angle)
    t.backward(branch_length)
tree = turtle.Turtle()
tree.hideturtle()
tree.setheading(90)
tree.color('green')
build_tree(tree, 50, 5, 30)
turtle.mainloop()

jeudi 16 juillet 2020

Python, biolo et modélisation de la biodiversité

Principe 

Sur une proposition d'une enseignante de biologie
Sur la planète Nestlé habite une population formée de 20 individus : les Smarties. Ces individus diffèrent des Hommes puisqu’ils possèdent dans leur noyau cellulaire un seul chromosome en un unique exemplaire.
Il existe 4 couleurs (caractère héréditaire) de Smarties différents : violet, orange, rouge et jaune. Ceci est dû au gène de la couleur qui existe sous différentes versions : l’allèle violet, l’allèle orange, l’allèle rouge et l’allèle jaune.
Il existe donc, comme dans toute population, une biodiversité génétique (individus génétiquement différents). Un Smarties se reproduit seul et transmet ainsi sa couleur à sa descendance. Lorsque la période de reproduction est passée, les Smarties adultes meurent.

A partir de la règle du jeu ci-dessous, déterminer l’évolution de la fréquence de chaque allèle au cours des 10 premières générations.
Remarque : le jeu s’arrête à la 10ème génération ou quand une couleur représente 100 % de la population.

  • Étape n°1 : Dans la boite fournie, constituer la population de départ : 5 Smarties violets, 5 Smarties orange, 5 Smarties rouges et 5 Smarties jaunes.
  • Étape n°2 : C’est la période de reproduction ! Dans la boîte représentant la population de départ, on prélève les yeux fermés 5 Smarties qui représentent les géniteurs (c'est-à-dire les Smarties qui vont se reproduire seul).
  • Étape n°3 : Pour chaque géniteur, on lance un dé qui modélise le nombre de descendants (entre 1 et 6) à qui il transmet son caractère couleur. On place ensuite un nombre correspondant de Smarties de la même couleur que son géniteur dans une nouvelle boîte.
  • Étape n°4 : C’est la fin de la période de reproduction. Les Smarties adultes meurent (on enlève les Smarties géniteurs) et les descendants forment la « 1ère génération ».

Étapes suivantes : On recommence comme à l’étape n°2 en tirant au sort 5 Smarties dans la population «1ère génération ». Arrivé à l’étape n°4, on obtient ainsi une « 2ème génération ». Et ainsi de suite pour obtenir les générations 3, 4, 5, etc.

Les clochettes de Galilée


Présentation du problème

Vidéo présentant l'expérience

Dossier zippé

Le lien du dessous vous permet de télécharger un dossier zipper contenant le script et le son wav!

Script à lire et à tester

samedi 7 mars 2020

Données sentinelles

http://www.sentiweb.fr/france/fr/?
Vous cherchez des données pour vos cours à venir...

Le réseau Sentinelles (www.sentiweb.fr) est un réseau de recherche et de veille en soins de premiers recours (médecine générale et pédiatrie) en France métropolitaine. Créé en 1984, il est développé sous la tutelle conjointe de l'Institut national de la santé et de la recherche médicale (Inserm) et de Sorbonne Université.
Les objectifs principaux du réseau Sentinelles sont :
  • la constitution de grandes bases de données en médecine générale et en pédiatrie, à des fins de veille sanitaire et de recherche ;
  • le développement d’outils de détection et de prévision épidémique ;
  • la mise en place d’études cliniques et épidémiologiques.

Grippe - Influenza

Export csv à droite de la carte

mardi 3 mars 2020

Image et pixels

Présentation

Programme en python créant un damier de 200 pixels par 200 pixels avec une alternance de carrés N/B

mercredi 12 février 2020

Couleurs rouge vert bleu

Objectif

Comme nous sommes en plein pixels, je me suis demandé comment balayer avec script une partie des couples de 0,0,0 à 255,255,255 et éviter de créer 255^3 = 16 millions pixels

Script

r,v,b=0,0,0

for i in range (766):
    print(r,v,b)
    b=b+1
    if b>255:
        v=v+1
        b=255
        if v>255:
            v=255
            r=r+1

Shell

>>> %Run zzz.py
0 0 0
0 0 1
0 0 2
......
0 0 254
0 0 255
0 1 255
0 2 255
.....
0 254 255
0 255 255
1 255 255
2 255 255
....
254 255 255
255 255 255
>>> 

mardi 11 février 2020

Python, image et pixels avec Pillow


Création d'une image avec des couleurs aléatoires puis modification de cette dernière.

Bibliothèque à installer sous l'IDE Thonny

Voir Pillow qui remplace PIL sous python 3


Création d'une image de 5x5 pix² puis inversion des couleurs puis mise en niveau de gris

Script

from PIL import Image
from random import *

#taille image
largeur =5
hauteur=5

# creation image 5 pix² couleur aleatoire
img=Image.new("RGB",(largeur,hauteur),(255,255,255))

print("test 1 creation de l'image source - enregistrement 5par5pix-1.jpg")

for x in range (largeur):
    for y in range (hauteur):
        b=randint(0,255)
        v=randint(0,255)
        r=randint(0,255)

        img.putpixel((x,y),(r,v,b))
        print(x,y,r,v,b)
img.save("5par5pix-1.jpg")

# inversion couleur
print("test 2 Inversion couleur - enregistrement 5par5pix-2.jpg")

img=Image.open("5par5pix-1.jpg")
for x in range (largeur):
    for y in range (hauteur):
        r,v,b=img.getpixel((x,y))
        nr,nv,nb=255-r,255-v,255-b
        img.putpixel((x,y),(nr,nv,nb))
        print(x,y,nr,nv,nb)
img.save("5par5pix-2.jpg")        

# mise en niveau de gris
print("test 3 niveau de gris - enregistrement 5par5pix-3.jpg")

img=Image.open("5par5pix-1.jpg")
for x in range (largeur):
    for y in range (hauteur):
        r,v,b=img.getpixel((x,y))
        gris=int((r+v+b)/3)
        img.putpixel((x,y),(gris,gris,gris))
        print(x,y,gris,gris,gris)
img.save("5par5pix-3.jpg") 

lundi 10 février 2020

Python, tortue et JPO


Simulation en python représentant la marche aléatoire d'une tortue avec dans une boucle les instructions suivantes:
- 1 pas
- rotation de 90° sur la gauche ou sur la droite

La question posée est :
Sortirai-je de ma fenêtre?

La simulation au bout de 36 000 itérations semble confirmer que même sans direction j'avance et m'éloigne de mon point de départ ce qui peut réconforter en cette période de portes ouvertes ;)))


Fort de cette première simulation, en voici une seconde lancée ce dimanche. Là encore ma tortue me quitte. Dernières coordonnées avant disparition dans les limbes:
x=440 et y=-1104

PS: Le cadre rouge représente un rectangle de 1000x800 pix²


Script 

# import bibliotheque necessaire
from turtle import *
from random import *

### definition du terrain de jeu
larg,haut =1000, 800 # le (0,0) est en haut à gauche, et le pt (larg,haut) est en bas droite
setup(larg+100,haut+100)
n=100000
u=4

# limite rouge
penup()
goto (larg/2,0)
pendown()
color('red')
left(90),forward(haut/2),left(90),forward(larg),left(90),forward(haut),left(90),forward(larg),left(90),forward(haut/2)
penup()
color('black')
home()
pendown()


# marche aléatoire
compteur_pas=0
for k in range(n):
    forward(u) # avance de u
    compteur_pas= compteur_pas+1
    print(compteur_pas,"Coord Turtle=",position()) # affiche nbre pas et coord x,y de turtle 
    
    # choix aleatoire a gauche ou a droite?
    a=randint(0,1)
    if (a==0) :
        left(90)
    else :
        right(90)