[PYTHON] Lassen Sie uns mit Google Colaboratory ganz einfach ein mathematisches GIF erstellen

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. kdv_pseudo_spec_impl_rc.gif

1. Verwenden Sie Google Colaboratory

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

2. Berechnen wir den numerischen Wert der Coltweg-Doffreys-Gleichung

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. $ \begin{cases} &u_t + \alpha u u_x + \beta u_{xxx} = 0, \quad & t>0, x \in (0, L),\\\\ &u(t,0) = u(t,L),\quad &t>0,\\\\ &u(0,x) = u_0(x), \quad &x \in (0,L) \end{cases} $ Nachdenken über. Hier sind $ L $, $ \ alpha $, $ \ beta $ positive Konstanten und die Parameter, wenn Zabsky Kurskull eine isolierte Welle entdeckt $ L = 2,0 $, $ \ alpha = 1,0 $, $ \ beta = Angenommen, es ist 0,022 ^ 2 $ und der Anfangswert ist gegeben durch $ u_0 (x) = \ cos (\ pi x) $.

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.

Importieren Sie die erforderlichen Bibliotheken

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

Parameter und Anfangswerte einstellen

# 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)

Berechnung von $ u_t $ mit Fourier-Transformation

def kdv(t, u):
    conv = u * psdiff(u, period=L)
    disp = DELTA * psdiff(u, period=L, order=3)
    dv = - conv - disp
    return dv

Berechnung numerischer Lösungen nach der impliziten Rungekutta-Methode

t = np.arange(0, T, dt)
sol = solve_ivp(kdv, [0, T], u0, method='Radau', t_eval=t)

3. Lassen Sie uns visualisieren

Dieser Abschnitt basiert auf [Visualisierung der Gradientenabstiegsmethode in Google Colaboratory- @ yaju] [3].

Vorbereitung der numerischen Lösung

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)

Visualisierung mit Notebook

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. 012258.png

%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())

GIF-Datei exportieren

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

012221.png

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

Lassen Sie uns mit Google Colaboratory ganz einfach ein mathematisches GIF erstellen
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit flask-babel eine mehrsprachige Site erstellen
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Machen wir einen Discord Bot.
Erstellen Sie einen Berechnungsbohrdruck
Lassen Sie uns einen LINE-Bot mit verschiedenen Diensten erstellen [ngrok edition]
So zeichnen Sie einfach die Struktur eines neuronalen Netzwerks in Google Colaboratory mit "convnet-drawer"
Machen wir eine Remote-Rumba [Hardware]
Lassen Sie uns eine Remote-Rumba erstellen [Software]
Lassen Sie uns eine GUI mit Python erstellen.
Machen wir einen Spot Sale Service 2
Erstellen Sie mit TensorFlow eine Gesichtserkennung
Machen wir einen Blockbruch mit wxPython
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Lassen Sie uns einen Web-Chat mit WebSocket mit AWS serverless (Python) durchführen!
Machen wir einen Spot Sale Service 3
Ich habe mir das Google-Labor notiert, das Spleeter problemlos verwenden kann.
Erstellen Sie einfach einen DNS-Server mit Twisted
Lassen Sie uns mit Python ein Shiritori-Spiel machen
[Anfänger] Leicht verständliches Python-Web-Scraping mit Google Colaboratory
Übliche Verarbeitungshinweise bei Verwendung von Google Colaboratory
Lassen Sie uns mit Python langsam sprechen
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Verwendung des Jupyter-Kernels von Java mit Google Colaboratory
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Lassen Sie uns ein Backend-Plug-In für Errbot erstellen
Google-Labor
Erstellen Sie eine GIF-Datei mit Pillow in Python
Schreiben wir __str__ der Klasse einfacher mit Lambda!
Erstellen wir eine REST-API mit SpringBoot + MongoDB
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
[Chat De Tornado] Erstellen Sie einen Chat mit WebSocket in Tornado
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht