In diesem Artikel erstellen wir ein mathematisches GIF mit Google Colaboratory. Lassen Sie uns die Coltveg-Doffreys-Gleichung lösen, die eine nichtlineare Welle durch numerische Berechnung beschreibt, und sehen, dass Soliton erscheint.
Mit Google Colaboratory können Sie mit Python im Notebook-Format arbeiten, ohne etwas auf Ihrem PC installieren zu müssen (solange Sie über eine Internetverbindung verfügen).
Im letzten Artikel [Lassen Sie uns mit Python- @ wakabame einfach ein mathematisches GIF erstellen] [1] gab es ein Verfahren zum Erstellen einer Umgebung, das jedoch nicht mehr erforderlich ist. Der Code wird auch auf dem Cloud-Server von Google ausgeführt, sodass Sie Computerressourcen kostenlos nutzen können.
Es gibt noch weitere Funktionen. Weitere Informationen finden Sie in der offiziellen Dokumentation. https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja
Dieser Abschnitt basiert auf [Numerische Berechnung der KdV-Gleichung mit der Pseudospektralmethode - ohne es zu versuchen] [2].
Ein Anfangswert-Grenzwertproblem, das die Bewegung der Wellenhöhe $ u $ im flachen Wasser beschreibt und als Coltveg-Doffreys-Gleichung bezeichnet wird.
Bei der numerischen Berechnung werden $ u_x $ und $ u_ {xxx} $ durch Fourier-Transformation unter Verwendung von "diff" von "scipy.fftpack" in räumlicher Richtung berechnet.
Auf der anderen Seite werden wir uns in der Zeitrichtung zerstreuen und das lösen_ivp
von scipy.integrate
verwenden, um die numerische Lösung zum nächsten Zeitschritt nach der impliziten Runge-Kutta-Methode zu finden.
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)
Dieser Abschnitt basiert auf [Visualisierung der Gradientenabstiegsmethode in Google Colaboratory- @ yaju] [3].
Da die erhaltene Lösung "sol.y" ein zweidimensionales Array ist, das in der Reihenfolge "[Raum] [Zeit]" angeordnet ist, sollte es transponiert werden, um "U [t] [x]" zu werden.
U = sol.y.T
frames = len(U)
Bei der Visualisierung in einem Notizbuch ist es einfacher, aus "HTML" in "IPython.display" zu sehen. Bei Colaboratory wird die Verbindung jedoch unterbrochen, wenn eine große Menge an Speicher in einer Zelle verbraucht wird (?). Daher wird der GIF-Frame so ausgedünnt, dass er in etwa 200 passt.
%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())
Wenn Sie eine GIF-Datei exportieren, können Sie sie mit der Option "writer =" pillow "fast ohne Änderungen ausgeben. Wenn der Export abgeschlossen ist, öffnen Sie die Registerkarte links und Sie finden die auf dem Laufwerk gespeicherte GIF-Datei. Klicken Sie also mit der rechten Maustaste und laden Sie sie herunter
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")
Dieses Notizbuch ist unter [kdv.ipynb] verfügbar (https://colab.research.google.com/gist/wakabame/a76b38bc1d081f19fa4df5eb50f14ab1/kdv.ipynb#scrollTo=KZUJxWW4qJvN). Wenn Sie Kommentare haben, zögern Sie bitte nicht, uns zu kontaktieren. [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