[PYTHON] À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède

introduction

Archimède a calculé la circonférence d'un hexagone régulier, un régulier à 12 côtés, un régulier à 24 côtés, un régulier à 48 côtés et un cercle régulier à 96 côtés dans cet ordre pour obtenir une valeur approximative du rapport de circonférence. Cahier de tsujimotter "Archimède et rapport de circonférence" A cette époque, le point décimal n'était pas encore inventé et était exprimé sous forme de rapport d'entiers. Même avec ces restrictions, Archimède voulait être inférieur à 3 et 1/7 et supérieur à 3 et 10/71. (En termes décimaux, entre 3,1428571428571429 et 3,1408450704225352) Avec l'aide de la programmation, j'ai essayé de savoir avec quelle précision le rapport de circonférence pouvait être calculé en utilisant la méthode d'Archimède telle quelle.

Méthode d'Archimède

La méthode d'Archimède elle-même est décrite avec précision dans le cahier du tujimotter précédent, donc si vous êtes intéressé, veuillez y jeter un œil. Ici, seules les preuves nécessaires sont répertoriées lors de la création du programme. En supposant que la circonférence du carré régulier à n côtés est L et que le rayon du cercle circonscrit est 1, la circonférence est 2π, donc la valeur approximative du rapport de circonférence basé sur le carré régulier à n côtés est L / 2. 証明.JPG

[Pour hexagone régulier]

L=F(0)B×2×6 F (0) B = 1 / √3 * Puisque ∠F (0) OB vaut 30 ° (△ OF (0) C est un triangle régulier) La valeur approximative du rapport de circonférence basé sur l'hexagone régulier est L ÷ 2 = 1 / √3 × 2 × 6 ÷ 2 = 2 × √3 ≒ 3.464.

[Pour le dodécagone régulier]

L=F(1)B×2×12 F(1)B = OB× F(0)B ÷(OB+F(0)O)= F(0)B ÷(1+√(1+F(0)B× F(0)B)) La valeur approximative du rapport de circonférence basé sur le dodécagone régulier est L ÷ 2 = F (1) B × 2 × 12 ÷ 2 ≒ 3.215. ** Preuve ** Tracez une droite passant par F (0) parallèle à F (1) O, et soit A l'intersection avec l'extension d'OB. Puisque ΔOBF (1) et ΔABF (0) sont similaires, ce qui suit est vrai. F(1)B:OB = F(0)B:(OB+OA) De plus, puisque ΔOF (0) A est un triangle isocèle, F (0) O = OA F (0) O est obtenu à partir de √ (OB × OB + F (0) B × F (0) B) en utilisant le théorème de Pitagolas.

[Pour normal à n côtés]

De même, la valeur approximative du rapport de circonférence sur la base de la forme régulière à n côtés est la suivante. L÷2=F(n)B×2×n÷2 = F(n-1)B÷(1+√(1+F(n-1)B× F(n-1)B))×n

Implémenté par Python

Le résultat ci-dessus est implémenté en Python comme suit.

import math
import itertools
def f(n):
  if n == 0: return math.sqrt(3)/3
  return f(n-1)/(1+math.sqrt(1+f(n-1)**2))

N = int(input())
for n in range(N):
  print(f(n)*6*2**n)

Cependant, comme c'est le Mendou qui entre avec précision le carré à n côtés régulier, la valeur d'entrée N est la suivante. 0… Calculer un hexagone régulier 1… Calculez jusqu'au dodécagone régulier 2… Calculez jusqu'à 24 carrés réguliers La même chose s'applique ci-dessous. Étant donné que l'algorithme ci-dessus nécessite une quantité de calcul de O (2 ** n), je l'ai réécrit avec DP comme suit. De plus, comme il n'est pas possible de représenter avec précision les nombres après la virgule décimale en nombres binaires (*), nous avons décidé de rendre les nombres aussi grands que 15 chiffres et de les formater lors de la sortie.

import math
import itertools

def pi2s(pi):
  return str(pi)[0] + "." + str(pi)[1:]

def regN(n):
  return format(n, '10d') + ": "

R = 1732050807568877
B = 1000000000000000
pi = "3.14159265358979323846264338327950288"

N = int(input())
F = [0.0 for n in range(N)]
F[0] = B
for n in range(1, N):
  F[n] = F[n-1]*R/(R+math.sqrt(F[n-1]**2+R**2))

for n, v in enumerate(F):
  print(regN(6*2**n) + pi2s(int(v*6*2**n*B/R)))
print(format("pi: ", '>12') + pi[:17])

C'est le résultat du calcul jusqu'au ** carré régulier 3145728 **. 実行結果.JPG Π est affiché sur la dernière ligne. Vous pouvez voir que les valeurs sont assez précises.

à la fin

J'ai essayé de retracer la méthode d'Archimède par programmation. Contrairement à mes propres attentes, j'ai été surpris qu'il soit déjà proche de 3,14 à un stade assez précoce (48 faces). Pour Archimède, qui a calculé cela à la main et par le rapport des nombres entiers (fractions), il vient de retirer son chapeau.

Recommended Posts

À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède
Calcul de l'itinéraire le plus court selon la méthode de Monte Carlo
À propos du calcul des coûts de MeCab
À propos des composants de Luigi
À propos des fonctionnalités de Python
Méthode d'approximation numérique lorsque le calcul de la dérivée est gênant
Calcul du nombre d'associations de Klamer
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
À propos de la limite supérieure de threads-max
À propos du comportement de yield_per de SqlAlchemy
À propos de la taille des points dans matplotlib
À propos de la liste de base des bases de Python
Compter / vérifier le nombre d'appels de méthode.
10 méthodes pour améliorer la précision de BERT
A propos du comportement de enable_backprop de Chainer v2
À propos de l'environnement virtuel de Python version 3.7
Pensez grossièrement à la méthode de descente de gradient
A propos des arguments de la fonction setup de PyCaret
À propos de l'équation normale de la régression linéaire
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
À propos du comportement de copy, deepcopy et numpy.copy
À propos de la notation de l'axe X du graphique à barres de Matplotlib
À propos de la vitesse de traitement de SVM (SVC) de scikit-learn
Écrire une note sur la version python de python virtualenv
Envisagez d'améliorer la précision de la détection des anomalies VAE
À propos du contenu de développement de l'apprentissage automatique (exemple)
[Note] À propos du rôle du trait de soulignement "_" en Python
À propos du comportement de la file d'attente pendant le traitement parallèle
[Python] Pensez sérieusement à la méthode gagnante M-1.
Clustering de méthodes de clustering
À propos du test
À propos de la file d'attente
Calcul numérique du fluide compressible par la méthode des volumes finis
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Un mémorandum sur les avertissements dans les résultats de sortie de pylint
Calcul du nombre minimum de voix requis à partir du taux de vote
Détruire l'expression intermédiaire de la méthode sweep avec Python
Pensez à la nouvelle génération de Rack et WSGI
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
À propos de l'inefficacité du transfert de données dans luigi on-memory
À propos de l'ordre épuré dans l'ordre d'importation flake8
[Résumé de 27 langues] Méthode de calcul des chiffres de contrôle de mon numéro
Calcul de la matrice d'homographie par la méthode des moindres carrés (méthode DLT)
Une histoire sur le changement du nom principal de BlueZ
Notes personnelles sur l'intégration de vscode et anaconda
Un mémorandum sur la mise en œuvre des recommandations en Python
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
La méthode de copie de pandas.DataFrame est une copie profonde par défaut