[PYTHON] TensorFlow Tutorial-Partial Differential Equations (Translation)

TensorFlow Tutorials (Partial Differential Equations) https://www.tensorflow.org/versions/master/tutorials/pdes/index.html#partial-differential-equations It is a translation of. We look forward to pointing out any translation errors.


TensorFlow isn't just for machine learning. Here is an example (slightly monotonous) that uses TensorFlow to simulate the behavior of PDEs. Simulates some raindrops falling on the surface of a square pond.

Note: This tutorial was originally prepared for the IPython notebook.

basic configuration

Some imports are required.

#Import libraries for simulation
import tensorflow as tf
import numpy as np

#Imports for visualization
import PIL.Image
from cStringIO import StringIO
from IPython.display import clear_output, Image, display

It is a function that displays the state of the surface of the pond as an image.

def DisplayArray(a, fmt='jpeg', rng=[0,1]):
  """Display an array as a picture."""
  a = (a - rng[0])/float(rng[1] - rng[0])*255
  a = np.uint8(np.clip(a, 0, 255))
  f = StringIO()
  PIL.Image.fromarray(a).save(f, fmt)
  display(Image(data=f.getvalue()))

Start an interactive TensorFlow session for the convenience of tinkering. A normal session works the same if you run it in the .py executable.

sess = tf.InteractiveSession()

Convenient computational function

def make_kernel(a):
  """Transform a 2D array into a convolution kernel"""
  a = np.asarray(a)
  a = a.reshape(list(a.shape) + [1,1])
  return tf.constant(a, dtype=1)

def simple_conv(x, k):
  """A simplified 2D convolution operation"""
  x = tf.expand_dims(tf.expand_dims(x, 0), -1)
  y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
  return y[0, :, :, 0]

def laplace(x):
  """Compute the 2D laplacian of an array"""
  laplace_k = make_kernel([[0.5, 1.0, 0.5],
                           [1.0, -6., 1.0],
                           [0.5, 1.0, 0.5]])
  return simple_conv(x, laplace_k)

Definition of partial differential equations

As with most ponds in nature, our pond is a perfect 500x500 square.

N = 500

Create a pond and hit it with some raindrops.

# Initial Conditions -- some rain drops hit a pond

# Set everything to zero
u_init = np.zeros([N, N], dtype="float32")
ut_init = np.zeros([N, N], dtype="float32")

# Some rain drops hit a pond at random points
for n in range(40):
  a,b = np.random.randint(0, N, 2)
  u_init[a,b] = np.random.uniform()

DisplayArray(u_init, rng=[-0.1, 0.1])

図

Let's specify the details of the differential equation.

# Parameters:
# eps -- time resolution
# damping -- wave damping
eps = tf.placeholder(tf.float32, shape=())
damping = tf.placeholder(tf.float32, shape=())

# Create variables for simulation state
U  = tf.Variable(u_init)
Ut = tf.Variable(ut_init)

# Discretized PDE update rules
U_ = U + eps * Ut
Ut_ = Ut + eps * (laplace(U) - damping * Ut)

# Operation to update the state
step = tf.group(
  U.assign(U_),
  Ut.assign(Ut_))

Run simulation

A fun place-a simple for loop moves you forward.

# Initialize state to initial conditions
tf.initialize_all_variables().run()

# Run 1000 steps of PDE
for i in range(1000):
  # Step simulation
  step.run({eps: 0.03, damping: 0.04})
  # Visualize every 50 steps
  if i % 50 == 0:
    clear_output()
    DisplayArray(U.eval(), rng=[-0.1, 0.1])

図

look! Ripples!

Recommended Posts

TensorFlow Tutorial-Partial Differential Equations (Translation)
Numerical calculation of differential equations with TensorFlow 2.0
TensorFlow Tutorial-Mandelbrot Set (Translation)
TensorFlow Tutorial-TensorFlow Mechanics 101 (Translation)
TensorFlow Tutorial-Image Recognition (Translation)
TensorFlow Tutorial-MNIST Data Download (Translation)
TensorFlow Tutorial-Sequence Transformation Model (Translation)
TensorFlow Tutorial-Convolutional Neural Network (Translation)
TensorFlow MNIST For ML Beginners Translation
TensorFlow Tutorial-Vector Representation of Words (Translation)
Solve ordinary differential equations in Python
TensorFlow Deep MNIST for Experts Translation