Laplace.java
Below is the syntax highlighted version of Laplace.java
from §9.4 Numerical Solutions to Differential Equations.
import java.awt.Color;
public class Laplace {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
StdDraw.create(N+1, N+1);
StdDraw.setScale(0, 0, N+1, N+1);
double[][] V = new double[N+1][N+1];
// precompute colors
Color[] colors = new Color[101];
for (int i = 0; i <= 100; i++) {
int red = (255 * i) / 100;
int green = 0;
int blue = 255 - red;
colors[i] = new Color(red, green, blue);
}
for (int i = 0; i <= 100; i = i + 10)
colors[i] = Color.WHITE;
// initialize all points with reasonable starting values for the potential
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
V[i][j] = 51.0;
// boundary conditions
for (int j = 0; j <= N; j++) V[0][j] = 30; // left
for (int j = 0; j <= N; j++) V[N][j] = 70; // right
for (int i = 0; i <= N; i++) V[i][0] = 0; // bottom
for (int i = 0; i <= N; i++) V[i][N] = 100; // top
// numerically solve Laplace's equation
for (int t = 0; true; t++) {
// draw
for (int i = 1; i < N; i++) {
for (int j = 1; j < N; j++) {
int c = (int) Math.round(V[i][j]);
StdDraw.setColor(colors[c]);
StdDraw.moveTo(i, j);
StdDraw.spot();
}
}
StdDraw.show();
// repeat 100 times before drawing to screen
for (int r = 0; r < 500; r++)
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
V[i][j] = 0.25* (V[i-1][j] + V[i+1][j] + V[i][j-1] + V[i][j+1]);
}
}
}