Dans cet article, nous allons créer un gif mathématique avec Google Colaboratory. Résolvons l'équation de Coltveg-Doffreys qui décrit une onde non linéaire par calcul numérique et voyons que Soliton apparaît.
Avec Google Colaboratory, vous pouvez travailler avec Python au format notebook sans avoir à installer quoi que ce soit sur votre PC (tant que vous disposez d'une connexion Internet).
Dans l'article précédent [Faisons un gif mathématique facilement en utilisant Python- @ wakabame] [1], il y avait une procédure pour construire un environnement, mais ce n'est plus nécessaire. Le code est également exécuté sur le serveur cloud de Google, vous pouvez donc utiliser gratuitement les ressources informatiques.
Il existe d'autres fonctionnalités, veuillez donc vous référer à la documentation officielle pour plus de détails. https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja
Cette section est basée sur [Calcul numérique de l'équation KdV par méthode pseudo-spectrale - sans essayer de le faire] [2].
Un problème de valeur limite de valeur initiale qui décrit le mouvement de la hauteur des vagues d'eau peu profonde $ u
Dans le calcul numérique, $ u_x $ et $ u_ {xxx} $ sont calculés par transformée de Fourier en utilisant diff
of scipy.fftpack
dans la direction spatiale.
D'un autre côté, nous nous disperserons dans le sens du temps et utiliserons la méthode résoudre_ivp
de scipy.integrate
pour trouver la solution numérique au prochain pas de temps par la méthode implicite Runge-Kutta.
import numpy as np
from numpy import pi, cos, linspace, arange
from numpy.fft import rfft, irfft
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
from scipy.integrate import solve_ivp
from scipy.fftpack import diff as psdiff
# Constant in Zabusky & Kruskal (1965)
DELTA = 0.022 ** 2
L = 2.0 # width of line domain
N = 256 # step width for spatial variable
T = 10 # last time
dt = 1.0e-2 # step width for time variable
# initial condition
x = linspace(0.0, L, N, endpoint=False)
u0 = cos(pi*x)
def kdv(t, u):
conv = u * psdiff(u, period=L)
disp = DELTA * psdiff(u, period=L, order=3)
dv = - conv - disp
return dv
t = np.arange(0, T, dt)
sol = solve_ivp(kdv, [0, T], u0, method='Radau', t_eval=t)
Cette section est basée sur [Visualiser la méthode de descente de gradient sur Google Colaboratory- @ yaju] [3].
La solution obtenue «sol.y» est un tableau bidimensionnel disposé dans l'ordre de «[espace] [temps]», donc il doit être transposé en «U [t] [x]».
U = sol.y.T
frames = len(U)
Lors de la visualisation dans un cahier, il est facile de voir en vérifiant à partir de HTML
de ʻIPython.display`.
Cependant, sur Colaboratory, la connexion est coupée lorsqu'une grande quantité de mémoire est consommée dans une cellule (?), Le cadre gif est donc réduit pour tenir dans environ 200.
%matplotlib inline
fig = plt.figure()
fig.set_dpi(100)
ax = fig.add_subplot(1,1,1)
def animate(t):
ax.clear()
plt.ylim([-1.2, 3.0])
p, = plt.plot(x, U[5*t])
anim = animation.FuncAnimation(fig, animate, frames=frames//5, interval=100, repeat=False)
HTML(anim.to_jshtml())
Lors de l'exportation d'un fichier gif, l'option writer =" oreiller "
vous permet de le sortir presque sans aucune modification.
Lorsque l'exportation est terminée, ouvrez l'onglet sur la gauche et vous trouverez le fichier gif enregistré sur le lecteur, alors faites un clic droit et téléchargez
fig = plt.figure()
fig.set_dpi(100)
ax = fig.add_subplot(1,1,1)
def animate(t):
ax.clear()
plt.ylim([-1.2, 3.0])
p, = plt.plot(x, U[5*t])
anim = animation.FuncAnimation(fig, animate, frames=frames//5, interval=100, repeat=False)
anim.save("kdv_pseudo_spec_impl_rc.gif", writer="pillow")
Ce bloc-notes est disponible à l'adresse kdv.ipynb. Si vous avez des commentaires, n'hésitez pas à nous contacter. [1]:https://qiita.com/wakabame/items/c3648501eb0f2b921ddf [2]:https://iqujack-lequina.hatenablog.com/entry/2018/05/02/%E6%93%AC%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E3%83%AB%E6%B3%95%E3%81%AB%E3%82%88%E3%82%8BKdV%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97 [3]:https://qiita.com/yaju/items/42d43d6d6cf6910e8701
Recommended Posts