« Mathématiques avec Python et Ruby/Suites en Ruby » : différence entre les versions

Contenu supprimé Contenu ajouté
m Bot: Mise à jour des codes texvc par des équivalentes LaTeX (documentation)
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 9 :
Une suite est une fonction de <math>\N</math> dans <math>\R</math> (ou <math>\Complex</math>...). On peut donc facilement calculer les premiers termes de celle-ci en utilisant la méthode ''collect'' d'une liste d'entiers (approximation finie de <math>\N</math>). Par exemple pour vérifier que la suite <math>u_n=\frac{1}{n}</math> tend vers 0, on peut essayer
 
<sourcesyntaxhighlight lang="ruby">
(1..50).collect{|n| puts(1/n.to_f)}
</syntaxhighlight>
</source>
 
==Suites récurrentes==
Ligne 21 :
La [[w:Suite logistique|suite logistique]] <math>u_{n+1}=4u_n\left(1-u_n\right)</math> est [[w:Théorie du chaos|chaotique]] sur ''[0;1]''. Pour le vérifier, on peut faire
 
<sourcesyntaxhighlight lang="ruby">
u=0.1
50.times do
Ligne 27 :
puts(u)
end
</syntaxhighlight>
</source>
 
En constatant que <math>u_0=0,1=\frac{1}{10}\in \Q</math>, on peut vérifier que, quoique chaotique, cette suite est formée de fractions:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
u=1/10
Ligne 38 :
puts(u)
end
</syntaxhighlight>
</source>
 
Quoique chaotique, cette suite ne fait pas un bon générateur pseudo-aléatoire, parce que les nombres proches de 0 et 1 sont trop souvent visités. Pour le vérifier graphiquement, on peut dessiner un histogramme des 4000 premières valeurs de la suite, avec l'algorithme suivant:
Ligne 47 :
Le tout est fait en écrivant les instructions dans le langage [[w:Scalable Vector Graphics|svg]], engendrées par ''Ruby'', dans un fichier ''HistogramRuby1.svg'' visible ci-dessous. Voici le script au complet:
 
<sourcesyntaxhighlight lang="ruby">
figure=File.open("HistogramRuby1.svg","w")
figure.puts('<?xml version="1.0" encoding="utf-8"?>')
Ligne 66 :
figure.puts('</svg>')
figure.close
</sourcesyntaxhighlight>
 
Et voici le fichier produit par le script:
Ligne 83 :
Par exemple, si on place 2000 € avec des intérêts (simples) correspondant à 3 % du capital de départ, soit 60 €, on peut calculer les valeurs successives du capital pendant 20 ans avec
 
<sourcesyntaxhighlight lang="ruby">
capital=2000.00
interet=capital*3/100.0
Ligne 90 :
puts(capital)
end
</syntaxhighlight>
</source>
 
====Suites géométriques====
Ligne 98 :
Si on place 2000 € à intérêts composés au taux de 2 % par an, l'affichage des valeurs successives du capital (arrondies à l'eurocent près) peut se faire avec
 
<sourcesyntaxhighlight lang="ruby">
capital=2000.00
20.times do
Ligne 104 :
puts(capital.round(2))
end
</syntaxhighlight>
</source>
 
Sachant que chaque humain a deux parents et que chacun d'entre eux a aussi deux parents, etc. on peut dire que le nombre d'ancêtres à la génération ''n'' est géométrique de raison 2. Le nombre total d'ancêtres jusqu'à la génération ''n'' s'obtient par
 
<sourcesyntaxhighlight lang="ruby">
(0..20).inject{|ancetres,generation| ancetres+=2**generation}
 
puts(ancetres)
puts(2**21)
</syntaxhighlight>
</source>
 
On a presque autant d'ancêtres à la génération 21 qu'à toutes les générations précédentes cumulées!
Ligne 119 :
Ce qui donne envie de vérifier si c'est pareil pour toutes les générations ou si c'est une spécificité de la génération 21:
 
<sourcesyntaxhighlight lang="ruby">
genealogie=[1]*20
(1..20).collect{|i| genealogie[i]=(0..i).inject{|a,g| a+=2**g }}
Ligne 126 :
test=(1..20).reject{|i| generations[i]==genealogie[i-1]+2}
puts(test.size)
</syntaxhighlight>
</source>
 
On crée une liste des ancêtres jusqu'à la génération ''n'' comprise (''genealogie'') et une liste (''generations'') des nombres d'ancêtres à la génération ''n'' seulement. La lise ''test'' est constituée des entiers ''n'' pour lesquels le nombre d'ancêtres à la génération ''n'' n'est '''pas''' égal au total d'ancêtres jusqu'à la génération ''n-1'' augmenté de 2 (avec ''reject'', on a enlevé les positifs). La longueur de ce ''test'' est très petite !
Ligne 140 :
La récurrence de la [[w:Suite de Fibonacci|suite de Fibonacci]] est double, avec <math>u_{n+1}=u_n+u_{n-1}</math>. Son calcul pose donc un problème algorithmique, puisqu'il faut trois variables (les deux termes à calculer et une variable ''tampon'' pour stocker temporairement l'un des deux termes, afin qu'il ne soit pas écrasé par la somme). Ce problème n'existe pas en ''Ruby'' qui permet les affectations simultanées:
 
<sourcesyntaxhighlight lang="ruby">
a=1
b=1
Ligne 147 :
puts(b)
end
</syntaxhighlight>
</source>
 
On peut aussi le faire de manière plus ''Ruby'':
 
<sourcesyntaxhighlight lang="ruby">
a=1
b=1
Ligne 158 :
puts(b)
}
</syntaxhighlight>
</source>
 
===Nombre d'Or===
Ligne 164 :
Pour étudier le quotient de deux termes successifs de la suite:
 
<sourcesyntaxhighlight lang="ruby">
a,b=1,1
(1..20).collect{
Ligne 172 :
 
puts((5**0.5+1)/2)
</syntaxhighlight>
</source>
 
Mais en fait, les nombres de Fibonacci étant entiers, leurs quotients sont des fractions, et cette variante le montre:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 184 :
puts(b/a)
}
</syntaxhighlight>
</source>
 
On a donc une suite d'approximations rationnelles du [[w:Nombre d'or|nombre d'Or]].
Ligne 192 :
Algorithmiquement, la [[w:Conjecture de Syracuse|suite de Collatz]] est intéressante parce que son calcul est basé sur un test de parité, et qu'elle utilise une boucle à condition de sortie:
 
<sourcesyntaxhighlight lang="ruby">
def Collatz(x)
if x%2==0
Ligne 207 :
end
 
</syntaxhighlight>
</source>
 
==Multiples communs==
Ligne 213 :
La suite des multiples de 5 et la suite des multiples de 7 sont arithmétiques de raisons respectives 5 et 7. On peut les construire en choisissant les nombres entiers qui sont divisibles respectivement par 5 et par 7:
 
<sourcesyntaxhighlight lang="ruby">
a5=(1..1000).select{|n| n%5==0}
a7=(1..1000).select{|n| n%7==0}
puts(a5&a7)
</syntaxhighlight>
</source>
 
Les multiples communs à 5 et 7 sont les multiples de 35, qui est le [[w:ppcm|ppcm]] de 5 et 7. Cette construction est à l'origine de la théorie des [[w:Idéal|idéaux]] par [[w:Ernst Kummer|Kummer]].
Ligne 229 :
La suite définie par <math>u_n=\frac{1}{2}+\frac{1}{6}+\frac{1}{12}+\frac{1}{20}+...=\frac{1}{1\times 2}+\frac{1}{2 \times 3}+\frac{1}{3\times 4}+\frac{1}{4 \times 5}+...+\frac{1}{n(n+1)}=\sum_{k=1}^n \frac{1}{k(k+1)}</math> tend vers 1, il est relativement aisé de le démontrer, et encore plus facile de le vérifier avec ''Ruby'':
 
<sourcesyntaxhighlight lang="ruby">
suite=(1..50).collect{|n|
(1..n).inject(0){|somme,k|
Ligne 237 :
 
puts(suite)
</syntaxhighlight>
</source>
 
Cette suite est une suite de rationnels:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 251 :
 
puts(suite)
</syntaxhighlight>
</source>
 
Cette variante suggère d'ailleurs une démonstration de la convergence, grâce à l'émission d'une conjecture sur le terme général de la suite...
Ligne 259 :
La suite <math>u_n=\frac{n}{n^2+1}+\frac{n}{n^2+2}+\frac{n}{n^2+3}+\frac{n}{n^2+4}+...+\frac{n}{n^2+n}=\sum_{k=1}^n \frac{n}{n^2+k}</math> converge aussi, bien que ce ne soit pas évident en voyant son expression algébrique.
 
<sourcesyntaxhighlight lang="ruby">
suite=(1..20).collect{|n|
(1..n).inject(0){|somme,k|
Ligne 267 :
 
puts(suite)
</syntaxhighlight>
</source>
 
Là encore, la suite est rationnelle:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 281 :
 
puts(suite)
</syntaxhighlight>
</source>
 
 
<sourcesyntaxhighlight lang="ruby">
 
</syntaxhighlight>
</source>
 
==Constante d'Euler==
Ligne 292 :
On peut la calculer (et vérifier la lenteur de la convergence) avec
 
<sourcesyntaxhighlight lang="ruby">
suite=(1..50).collect{|n|
(1..n).inject(0){|s,k| s+=1.0/k}-Math.log(n)
Ligne 298 :
 
puts(suite)
</syntaxhighlight>
</source>
 
=Applications=
Ligne 306 :
Pour calculer <math>\sqrt{5}</math> avec la [[w:Méthode de Héron|méthode de Heron]], on utilise la suite itérée <math>u_{n+1}=\frac{u_n+\frac{5}{u_n}}{2}</math>:
 
<sourcesyntaxhighlight lang="ruby">
u=1.0
50.times do
Ligne 312 :
puts(u)
end
</syntaxhighlight>
</source>
 
Mais encore une fois, cette suite qui converge vers <math>\sqrt{5}</math> est formée de fractions. On a donc une suite d'approximations rationnelles de <math>\sqrt{5}</math>:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 324 :
puts(u)
end
</syntaxhighlight>
</source>
 
On en déduit des approximations rationnelles du nombre d'Or <math>\frac{\sqrt{5}+1}{2}</math>:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 336 :
puts((u+1)/2)
end
</syntaxhighlight>
</source>
 
En comparant avec les quotients de nombres de Fibonacci successifs, on voit que la méthode de Heron converge beaucoup plus vite. Cette convergence peut se montrer en représentant graphiquement la suite, ce qu'on peut faire en plaçant des points dans un fichier ''svg'':
 
<sourcesyntaxhighlight lang="ruby">
figure=File.open("SuiteRuby01.svg","w")
figure.puts('<?xml version="1.0" encoding="utf-8"?>')
Ligne 362 :
figure.puts('</svg>')
figure.close
</sourcesyntaxhighlight>
 
Le fichier produit par ce script s'appelle ''SuiteRuby01.svg''. Le voici:
Ligne 370 :
==Formule de l'arc tangente==
 
<sourcesyntaxhighlight lang="ruby">
p=(1..100).collect{|n|
4*(0..n).inject(0){|s,k|
Ligne 378 :
 
puts(p)
</syntaxhighlight>
</source>
 
Comme on le voit, la suite converge très lentement.
Ligne 384 :
Encore une fois, les termes de la suite sont rationnels, ce qui donne une suite de fractions approchant <math>\pi</math>:
 
<sourcesyntaxhighlight lang="ruby">
require 'mathn'
 
Ligne 394 :
 
puts(p)
</syntaxhighlight>
</source>