Implementation of numerical approximations of partial derivatives of PDEs
This is a very straight forward implementation of the Forward Time- Central Space - method for partial derivatives of PDEs in Java.So far, the derivates in one, two and three dimensions are implemented.
For each case a data set has to be given as a parameter ( double [ ][ ][ ] data for the 3D case) as well as the space grid points (x,y,z for the 3D case) and the space step size h.
/** * An implementation of numerical approximations * of partial derivatives of Partiel Differential Equations * - 1 space dimension * - 2 space dimensions * - 3 space dimensions * * @see java.Object * @author Heiko Enderling */ public class PDE extends Object { //******************************************// //************ 1 dimension *********// //******************************************// /** returns the partial derivative of _n(x,t) with respect to x approximated at the space grid point _x with a space step size of _h **/ public static double p_x (double[] _n, int _x, double _h ) { double _n_x = 0.0; try { _n_x = (_n[_x+1]-_n[_x-1])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _n_x; } /** returns the second partial derivative of _n(x,t) with respect to x approximated at the space grid point _x with a space step size of _h **/ public static double p_xx (double[] _n, int _x, double _h ) { double _n_xx = 0.0; try { _n_xx = (_n[_x+1]-(2*_n[_x])+_n[_x-1])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _n_xx; } /** returns the result of the laplace operator of _n(x,t) approximated at the space grid point _x with a space step size of _h **/ public static double p_laplace(double[] _n, int _x, double _h ) { return p_xx(_n,_x,_h); } //******************************************// //************ 2 dimensions *********// //******************************************// /** returns the partial derivative of _n(x,y,t) with respect to x approximated at the space grid point [_x][_y] with a space step size of _h **/ public static double pp_x (double[][] _n, int _x, int _y, double _h ) { double _nn_x = 0.0; try { _nn_x = (_n[_x+1][_y]-_n[_x-1][_y])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _nn_x; } /** returns the partial derivative of _n(x,y,t) with respect to y approximated at the space grid point [_x][_y] with a space step size of _h **/ public static double pp_y (double[][] _n, int _x, int _y, double _h ) { double _nn_y = 0.0; try { _nn_y = (_n[_x][_y+1]-_n[_x][_y-1])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _nn_y; } /** returns the second partial derivative of _n(x,y,t) with respect to x approximated at the space grid point [_x][_y] with a space step size of _h **/ public static double pp_xx (double[][] _n, int _x, int _y, double _h ) { double _nn_xx = 0.0; try { _nn_xx = (_n[_x+1][_y]-(2*_n[_x][_y])+_n[_x-1][_y])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _nn_xx; } /** returns the second partial derivative of _n(x,y,t) with respect to y approximated at the space grid point [_x][_y] with a space step size of _h **/ public static double pp_yy (double[][] _n, int _x, int _y, double _h ) { double _nn_yy = 0.0; try { _nn_yy = (_n[_x][_y+1]-(2*_n[_x][_y])+_n[_x][_y-1])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _nn_yy; } /** returns the result of the laplace operator of _n(x,y,t) approximated at the space grid point _x, _y with a space step size of _h **/ public static double pp_laplace(double[][] _n, int _x, int _y, double _h ) { return pp_xx(_n,_x,_y,_h)+pp_yy(_n,_x,_y,_h); } //******************************************// //************ 3 dimensions *********// //******************************************// /** returns the partial derivative of _n(x,y,z,t) with respect to x approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_x (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_x = 0.0; try { _nnn_x = (_n[_x+1][_y][_z]-_n[_x-1][_y][_z])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _nnn_x; } /** returns the partial derivative of _n(x,y,z,t) with respect to y approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_y (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_y = 0.0; try { _nnn_y = (_n[_x][_y+1][_z]-_n[_x][_y-1][_z])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _nnn_y; } /** returns the partial derivative of _n(x,y,z,t) with respect to z approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_z (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_z = 0.0; try { _nnn_z = (_n[_x][_y][_z+1]-_n[_x][_y][_z-1])*0.5/_h; } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace(); } return _nnn_z; } /** returns the second partial derivative of _n(x,y,z,t) with respect to x approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_xx (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_xx = 0.0; try { _nnn_xx = (_n[_x+1][_y][_z]-(2*_n[_x][_y][_z])+_n[_x-1][_y][_z])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _nnn_xx; } /** returns the second partial derivative of _n(x,y,z,t) with respect to y approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_yy (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_yy = 0.0; try { _nnn_yy = (_n[_x][_y+1][_z]-(2*_n[_x][_y][_z])+_n[_x][_y-1][_z])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _nnn_yy; } /** returns the second partial derivative of _n(x,y,z,t) with respect to z approximated at the space grid point [_x][_y][_z] with a space step size of _h **/ public static double ppp_zz (double[][][] _n, int _x, int _y, int _z, double _h ) { double _nnn_zz = 0.0; try { _nnn_zz = (_n[_x][_y][_z+1]-(2*_n[_x][_y][_z])+_n[_x][_y][_z-1])/(_h*_h); } catch (ArrayIndexOutOfBoundsException _e) { _e.printStrackTrace();} return _nnn_zz; } /** returns the result of the laplace operator of _n(x,y,z,t) approximated at the space grid point _x, _y, _z with a space step size of _h **/ public static double ppp_laplace(double[][][] _n, int _x, int _y, int _z, double _h ) { return ppp_xx(_n,_x,_y,_z,_h)+ppp_yy(_n,_x,_y,_z,_h)+ppp_zz(_n,_x,_y,_z,_h); } }