LaplaceSquare.java


Below is the syntax highlighted version of LaplaceSquare.java from §9.4 Numerical Integration.


/******************************************************************************
 *  Compilation:  javac LaplaceSquare.java
 *  Execution:    java LaplaceSquare N
 *  Dependencies: StdDraw.java
 *
 *  Solve Laplace's equation over a 3N-by-3N grid, with 0 potential
 *  on the outer boundaries and potential 100 over an N-by-N square
 *  in the center.
 *
 *  Credits: Tamara Broderick and Randy Wang
 *
 ******************************************************************************/

import java.awt.Color;

public class LaplaceSquare {

    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        int SIZE = 3*N;
        Picture pic = new Picture(SIZE+1, SIZE+1);
        double[][] V = new double [SIZE+1][SIZE+1];

        // precompute colors from blue to red
        Color[] colors = new Color[101];
        for (int i = 0; i <= 100; i++) {
            int red = 255*i/100;
            int green = 128;
            int blue = 255*(100-i)/100;
            colors[i] = new Color(red, green, blue);
        }
        // equipotentials in white for multiples of 10
        for (int i = 0; i <= 100; i = i + 10)
            colors[i] = Color.WHITE;


        // initialize potentials with reasonable starting values
        for (int i = 1; i <= SIZE/2; i++) {
            for (int j = 1; j <= SIZE/2; j++) {
                V[i][j] = 100.0 * (i + j) / (SIZE);
                V[SIZE-i][j] = V[i][SIZE-j] = V[SIZE-i][SIZE-j] = V[i][j];
            }
        }

        // inner boundary
        for (int i = N; i < 2*N; i++)
            for (int j = N; j < 2*N; j++)
                V[i][j] = 100;



        // numerically solve Laplace's equation
        while(true) {

            // repeat 100 times before drawing to screen
            for (int t = 0; t < 100; t++) {
                for (int i = 1; i < SIZE; i++) {
                    for (int j = 1; j < SIZE; j++) {
                        if (!(i >= N && i < 2*N && j >= N && j < 2*N))
                        V[i][j] = 0.25* (V[i-1][j] + V[i+1][j] + V[i][j-1] + V[i][j+1]);
                    }
                }
            }

            // draw
            for (int i = 0; i <= SIZE; i++) {
                for (int j = 0; j <= SIZE; j++) {
                    Color color = colors[(int) Math.round(V[i][j])];
                    pic.set(i, N-1-j, color);
                }
            }
	    pic.show();
	}
    }
}


Copyright © 2000–2022, Robert Sedgewick and Kevin Wayne.
Last updated: Thu Aug 11 10:36:03 EDT 2022.