//		-*- Mode: Java -*-
// Author(s):	J. Robert Buchanan and Zhoude Shao
// Address:	Department of Mathematics
//		Millersville University
//      	P.O. Box 1002
//		Millersville, PA 17551-0302
// Phone:	717-871-7305
// FAX:		717-871-7948
// Email:	Robert.Buchanan@millersville.edu, Zhoude.Shao@millersville.edu
//
// Date:	11/03/2016
//
// Purpose:	Jacobi method for approximating solution to a linear
//		system of equations. This program accompanies Exercise 14.6.3.
//
// To compile:	javac exercise17.java
// To execute:	java exercise17
//
import java.io.*;

public class exercise17
{
    public static boolean stopcond(
				   int k	,
				   int nelts	,
				   double [][] soln
				   )
    {
	double [] norm = new double[2]	;
	int i	;

	norm[0] = 0.0	;
	norm[1] = 0.0	;
	for ( i=0 ; i<nelts ; i++ ) {
	    norm[0] += (soln[0][i]-soln[1][i])*(soln[0][i]-soln[1][i])	;
	    norm[1] += soln[k%2][i]*soln[k%2][i]	;
	}	// end of for ( i ) loop
	norm[0] = Math.sqrt(norm[0])	;
	norm[1] = Math.sqrt(norm[1])	;

	return( norm[0]/norm[1] < 1.0E-04 )	;
    }	// end of function stopcond( )
    
    public static void main(String args[])
    {
	int i, j, k;	// counter(s)
	int nelts = 8	;	// dimension of linear system
	int maxiters = 20+1;	// hard stop at 10 iterations of method
	double [][] a = { {4.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0},
			  {1.0, 6.0, -2.0, 1.0, -1.0, 0.0, 0.0, 0.0},
			  {0.0, 1.0, 5.0, 0.0, -1.0, 1.0, 0.0, 0.0},
			  {0.0, 2.0, 0.0, 5.0, -1.0, 0.0, -1.0, -1.0},
			  {0.0, 0.0, -1.0, -1.0, 6.0, -1.0, 0.0, -1.0},
			  {0.0, 0.0, -1.0, 0.0, -1.0, 5.0, 0.0, 0.0},
			  {0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 4.0, -1.0},
			  {0.0, 0.0, 0.0, -1.0, -1.0, 0.0, -1.0, 5.0}
	};	// matrix coefficients
	// RHS of equation
	double [] b = {-7.0, 1.0, 4.0, 4.0, 5.0, 1.0, -2.0, 8.0}	;
	double [][] soln = new double[2][nelts];// 2 recent approximations

	// Initial approximation
	for ( i=0 ; i<nelts ; i++ ) {
	    soln[0][i] = 0.0	;
	    System.out.printf("%8.4f ", soln[0][i])	;
	}	// end of for ( i ) loop
	System.out.printf("\n")	;
	for ( k=1 ; k<maxiters ; k++ ) {
	    for ( i=0 ; i<nelts ; i++ ) {
		soln[k%2][i] = b[i]	;
		for ( j=0 ; j<nelts ; j++ ) {
		    if ( j==i ) continue;
		    else soln[k%2][i] -= a[i][j]*soln[(k-1)%2][j]	;
		}	// end of for ( j ) loop
		soln[k%2][i] /= a[i][i]	;
		System.out.printf("%8.4f ", soln[k%2][i])	;
	    }	// end of for ( i ) loop
	    System.out.printf("\n")	;
	    if ( stopcond(k,nelts,soln) ) return	;
	}	// end of for ( k ) loop
    }	// end of function main( )
}

//
//	EOF
//

