[PYTHON] Jouez avec la série Poancare et SymPy

Cet article est un article du 11 décembre 2019 dans Calendrier de l'Avent Calcul Numérique 2019, mais c'est presque un poème ...

Série Poancare (définition libre)

V = \bigoplus_{k = 0}^\infty V_k

Soit un espace vectoriel ordonné ($ \ deg V_k = k $). À ce stade, ** série Poancare ** $ P (V; t) $ de $ V $ devrait être la série de puissance formelle suivante. $ P(V; t) := \sum_{k = 0}^\infty (\dim V_k)\ t^k $ Défini dans. Autrement dit, une série de puissances formelle dans laquelle le coefficient de chaque puissance $ k $ de $ t $ est égal à la dimension de la composante cyclique $ V_k $ de $ V $.

Exemple 1 (un exemple assez simple)

Soit $ V = \ mathbb {C} [x] $ (anneau polymorphe à une variable à coefficient complexe), et soit $ V_k, \ (k = 0, 1, 2 ...) $ le polypole d'ordre d'ordre $ k $ entier. Essayons-le comme un espace vectoriel. Alors $ \ mathbb {C} [x] $ peut être considéré comme un espace vectoriel avec ordre, mais comme il n'y a qu'une seule variable, le polymorphe synchrone $ k $ degré est $ a_k x ^ k, (a_k \ in \ mathbb {C} Il n'y en a qu'un sous la forme) . En d'autres termes $ \forall k, \ \ \dim V_k = 1 $$ Ce sera. Par conséquent, la série de Poancare $ P (\ mathbb {C} [x]; t) $ de $ \ mathbb {C} [x] $ est $ P(\mathbb{C}[x]; t) = \sum_{k = 0}^\infty t^k = 1 + t + t^2 + t^3 + \dots $ Je peux le trouver. Rappelant la formule du nombre isométrique, c'est $ P(\mathbb{C}[x]; t) = \frac{1}{1 - t} $ Vous pouvez écrire sous une forme fermée. (Comme il s'agit d'une série de puissance formelle, écrivez-la comme ceci sans tenir compte de la convergence.)

Exemple 2 (polypolycycle à deux variables)

Considérons maintenant l'anneau polymorphe à deux variables $ V = \ mathbb {C} [x, y] $. Le composant d'ordre $ k $ $ V_k $ de $ V $ est l'espace vectoriel du polypole d'ordre $ k $ entier comme ci-dessus. Dans ce cas, $ \ dim V_k $ change en fonction de la valeur de $ k $. À la recherche du plus petit

\begin{align}
V_0 &= \text{Span}\langle 1 \rangle, \\
V_1 &= \text{Span}\langle x, y\rangle, \\
V_2 &= \text{Span}\langle x^2, xy, y^2\rangle, \\
V_3 &= \text{Span}\langle x^3, x^2y, xy^2, y^3\rangle, \\
&...
\end{align}

Et ainsi de suite, vous pouvez voir que $ \ dim V_k = k + 1 . Donc $ P(\mathbb{C}[x, y]; t) = \sum_{k = 0}^\infty (k + 1)t^k $$ est. Cela peut être transformé d'une bonne manière en utilisant le terme de différenciation.

\begin{align}
P(\mathbb{C}[x, y]; t) &= \sum_{k = 0}^\infty \frac{d}{dt}t^{k + 1} \\
&= \frac{d}{dt} \left( t \sum_{k = 0} t^{k} \right) = \frac{d}{dt} \frac{t}{1 - t} = \frac{1}{(1 - t)^2}
\end{align}

Vous pouvez écrire sous une forme fermée.

Exemple 3 (polypolycycle à 3 variables)

De même, que se passe-t-il si $ V = \ mathbb {C} [x, y, z] $, $ V_k $ est un sous-espace couvrant tout le polypole d'ordre d'ordre $ k $? $ V_k $ est basé sur une expression séquentielle de la forme $ x ^ p y ^ q z ^ r $, $ p + q + r = k $.

\frac{(k + 2)!}{k!2!} = \dbinom{k + 2}{2}

Vous pouvez voir qu'il existe différents types $ P(\mathbb{C}[x, y, z]; t) = \sum_{k = 0}^\infty \dbinom{k + 2}{2} t^k $ Ce sera. Maintenant, cela peut-il être écrit sous une forme fermée? Il semble que vous puissiez le comprendre en considérant à nouveau le terme de différenciation, mais cette fois, je considérerai une méthode légèrement différente. $ \frac{1}{(1 - x)(1 - y)(1 - z)} = \sum_{p = 0}^\infty x^p \sum_{q = 0}^\infty y^q \sum_{r = 0}^\infty z^r = \sum_{p, q, r = 0}^\infty x^p y^q z^r $ Compte tenu de la série, la base $ x ^ p y ^ q z ^ r $ de $ \ mathbb {C} [x, y, z] $ apparaît exactement une fois sur le côté droit. $ k $ La prochaine commande est $ x ^ {p_1} y ^ {q_1} z ^ {r_1} + x ^ {p_2} y ^ {q_2} z ^ {r_2} + ... + x ^ {p_N} y ^ {q_N} z ^ {r_N} $ donne $ p_i + q_i + r_i = k, \ (i = 1, 2, ..., N, \ \ N = \ dim (V_k)) $ Je suis. Si vous remplacez $ x = y = z = t $ ici, ce sera exactement sous la forme $ (1 + 1 + ... + 1) t ^ k = \ dim (V_k) \ t ^ k , donc en fait $ P(\mathbb{C}[x, y, z]; t) = \frac{1}{(1 - t)(1 - t)(1 - t)} = \frac{1}{(1 - t)^3} $ Il s'est avéré être. En d'autres termes $ \frac{1}{(1 - t)^3} = \sum_{k = 0}^\infty \dbinom{k + 2}{2} t^k \ \ \ \ \cdots \ (★) $$ est. (Comme vous pouvez le deviner jusqu'à présent, pour le général $ n $, $ P (\ mathbb {C} [x_1, ..., x_n]; t) = \ dfrac {1} {(1-t) ^ n } Ce sera $. )

Calcul numérique (?)

Maintenant, je voudrais calculer le premier terme numérique de la série de puissance pour confirmer que cette formule (★) semble vraiment tenir. Que dois-je faire?

Dans cet article, je vais essayer de calculer en programmant avec Python.

Tout d'abord, vous devez calculer le coefficient binomial sur le côté droit. La bibliothèque Python SciPy a une fonction comb qui calcule les coefficients binomiaux. Si vous décidez de l'utiliser pour calculer les 10 premiers termes,

from scipy.special import comb
combinations = [comb(k + 2, k, exact=True) for k in range(10)]
print(combinations)

Tout ce que vous avez à faire est d'exécuter le programme. Le résultat est

[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

est devenu.

Maintenant, qu'en est-il du côté gauche?

Expression générale pour l'expansion de Taylor autour de $ t = 0 $

f(t) = f(0) + f'(0)t + \frac{1}{2!}f''(0)t^2 + \frac{1}{3!}f'''(0)t^3 + ... = \sum_{k=0}^\infty \frac{1}{k!} \frac{d^kf(0)}{dt^k}t^k

Rappelant que, le coefficient est le coefficient différentiel d'ordre $ k $ à $ t = 0 $ sur le côté gauche divisé par $ k! $. Calculons cela en programmant avec Python. Ces calculs mathématiques peuvent être effectués à l'aide d'une bibliothèque appelée SymPy. De même, si vous décidez de calculer jusqu'aux 10 premiers termes, vous devrez calculer le ** différentiel d'ordre 10 (!) **, ce qui est très compliqué par le calcul manuel, mais vous pouvez facilement le trouver en écrivant un programme. Je vais. Le programme actuel est le suivant. (J'ai utilisé «scipy» pour calculer le multiplicateur.)

from sympy import *
from scipy.special import factorial
t = Symbol('t')
P = 1 / (1 - t) ** 3
coeffs = []
for k in range(10):
    dk = diff(P, t, k).subs([(t, 0)])
    coeff = dk / factorial(k, exact=True)
    coeffs.append(coeff)

print(coeffs)

Le résultat de l'exécution est toujours

[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

Il a été confirmé que les coefficients du côté gauche et du côté droit correspondent aux 10 premiers termes de l'expansion de la série de puissance.


Impressions

Je pensais vaguement que je voulais calculer une telle théorie de combinaison avec un ordinateur, alors je l'ai écrite bien que ce soit très simple.

Les références

Recommended Posts

Jouez avec la série Poancare et SymPy
Intégration multiple avec Python et Sympy
Fractal pour faire et jouer avec Python
Jouez avec PDBBind de MoleculeNet et RDKitGridFeaturizer de DeepChem
Chargez CSV avec des pandas et jouez avec Index
Jouez avec Prophet
Jouez avec PyTorch
Jouez avec 2016-Python
Jouez avec CentOS 8
Jouez avec Pyramid
Jouez avec Fathom
Comprenez les points de la grille et jouez avec les courbes de niveau.
Jouer avec Othello (Reversi)
Résolvez des équations différentielles normales simultanées avec Python et SymPy.
Comment boucler et lire une vidéo gif avec openCV
Superposer des graphiques avec sympy
Avec et sans WSGI
Avec Sympy, ne t'inquiète pas
[Comment!] Apprenez et jouez à Super Mario avec Tensorflow !!
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
[Jouons avec Python] Traitement d'image en monochrome et points
La comparaison et l'optimisation des vitesses BASIC et C et assembleur jouent avec IchigoJam
Jouez avec les archives de Mastodon dans les réponses et les favoris de Python 2 Count
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Avec moi, cp et sous-processus
[Python] Résoudre des équations avec sympy
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Jouons avec la 4e dimension 4e
Jouons avec les données Amedas - Partie 1
Travailler avec le tkinter et la souris
Python et matériel - Utilisation de RS232C avec Python -
Jouez avec les notifications push avec imap4lib
Jouez avec les partitions Linux
Equation de mouvement avec sympy
Jouons avec les données Amedas - Partie 4
Jouer avec Jupyter Notebook (IPython Notebook)
[Python] Jouez avec le Webhook de Discord.
Super résolution avec SRGAN et ESRGAN
Group_by avec sqlalchemy et sum
Jouons avec les données Amedas - Partie 3
python avec pyenv et venv
Jouons avec les données Amedas - Partie 2
Jouez avec le module MD de ASE
Avec moi, NER et Flair
Fonctionne avec Python et R
Jouez avec A3RT (texte suggéré)
Jouez avec la modélisation statistique: quantifiez la force des équipes de la J-League avec Stan et Python